Vue3 如何在<script setup>里设置组件name属性

news2024/12/24 7:46:30

Vue3 如何在script setup里设置组件name属性.jpg

Vue3 如何在<script setup>里设置组件name属性

文章目录

  • Vue3 如何在\<script setup>里设置组件name属性
    • 一、Vue组件中 name 的用处
    • 二、难看但实用的方法
    • 三、使用第三方插件支持
        • 安装插件
        • 插件基本配置
        • 插件基本使用
    • 四、Vue官方解决方法
      • 4.1 Vue3.3版本之前
        • 安装插件
        • 插件基本配置
        • 使用 defineOptions 编译宏
      • 4.2 Vue3.3版本之后
    • 五、后记
    • 参考资料💘
    • 推荐博文🍗


一、Vue组件中 name 的用处

一般情况,在 <script setup>语法糖下,大多数人往往将其忽略,毕竟确实很少用得上 name 属性,但如果需要用到时,却为怎么声明使用犯起了难,即使 Vue 在默认情况下会将文件名定义为 name 属性,但文件名是可以重复的,如出现一大堆 index.vue ,阁下又将如何应对呢。
我们先来看看在什么场景下需要使用到 name 属性,或则说 name 属性具体能够做什么,有什么用。

  • <keep-alive>includeexclude 属性根据组件的 name 进行匹配,如果想要条件性地被 keep-alive 缓存,就必须显式声明一个 name 属性。

    <keep-alive :include="['a', 'b']" :exclude=['c', 'd']>
      <component :is="view" />
    </keep-alive>
    
  • 组件递归引用自己,在 Vue 组件中只需要引用的组件名称与当前组件 name 属性保持一直,组件是可以自己引用自己的,这点在编写类似于 Tree 树形组件时十分有用。需要注意的一点是,为避免死循环递归,请带上条件语句。

    <template>
      <my-component v-if="递归终止条件" />
    </template>
    
    <script lang="ts">
      export default {
        name: "my-component"
      }
    </script>
    
  • 在开发者工具调试工具中,是以 name 属性标志组件的,在搜索功能上通过 name 名称能够快速定位组件方便调试,同时合理清晰的组件名称来讲,对于报错信息也更容易精准定位。图中的 index 是依据文件名称自动推导,在不声明 name 属性的情况下,容易发生重复现象。

    图 1-1


二、难看但实用的方法

其实原理很简单,既然 <script setup> 语法糖里不支持声明 name 属性,那就绕一下,Vue 允许同时包含一个 <script setup> 和一个 <script> 快,那么把 <script setup> 上做不来的事情给 <script> 来做不就行了。
但这个写法也有一个很明显的特点,那就是丑,对于强迫症来说完全不能接受,就为了声明 name 属性需要额外写多一个块,这显然是不合理的。

<script lang="ts">
  export default {
    name: "my-component"
  }
</script>

<script lang="ts" setup>
  /* 业务代码 */
</script>

三、使用第三方插件支持

对于喜欢这种写法的人来说,可以说是福音,市面上也有很多第三方的组件、插件也存在这种写法。但这种方法显然也不是最好的,一是需要额外的打插件操作,二是与 Vue 版本依赖关系大。
第三方插件有很多,在这里推荐一个比较好的插件 unplugin-vue-setup-extend-plus

安装插件
yarn add unplugin-vue-setup-extend-plus

pnpm add unplugin-vue-setup-extend-plus
插件基本配置
// vite.config.ts
import vueSetupExtend from 'unplugin-vue-setup-extend-plus/vite'

export default defineConfig({
  plugins: [
    vueSetupExtend()
  ],
})

// vue.config.js
module.exports = defineConfig({
  configureWebpack: {
    plugins: [require('unplugin-vue-setup-extend-plus/webpack').default()],
  }
})
插件基本使用
<template>
  
</template>

<script lang="ts" setup name="my-component">
  /* 业务代码 */
</script>

四、Vue官方解决方法

使用官方的好处就是不用担心其兼容性等问题,Vue官方的解决办法有点特殊,对于 Vue3.3 版本之前与之后分为两个方法,先来说说说 Vue3.3 版本之前需要怎么做。

4.1 Vue3.3版本之前

在 Vue 未正式解决这个问题之前,需要安装一个官方插件来支持额外的语法宏在<script setup>上。

安装插件

使用包管理工具,安装一个名为 unplugin-vue-define-options的插件。

yarn add unplugin-vue-define-options -D

pnpm add unplugin-vue-define-options -D

对于 Volar 的语法检测,需要再额外安装一个 @vue-macros/volar 插件,当然如果你不使用 Volar 的话,那可以选择无视。

yarn add @vue-macros/volar -D

pnpm add @vue-macros/volar -D
插件基本配置

需要注意的是,vite 与 vuecli 配置方式不同,请根据项目各自选择。

// vite.config.ts
import DefineOptions from 'unplugin-vue-define-options/vite'

export default defineConfig({
  plugins: [DefineOptions()],
})

// vue.config.js
module.exports = defineConfig({
  configureWebpack: {
    plugins: [require('unplugin-vue-define-options/webpack')()],
  }
})

TypeScript 支持配置

// tsconfig.json
{
  "compilerOptions": {
    "types": ["unplugin-vue-define-options/macros-global"]
  }
}

对于语法检测,如果出现报错的情况,使用 Volar 的可以安装 @vue-macros/volar插件并配置相关代码。

// tsconfig.json
{
  "vueCompilerOptions": {
    "target": 3, // 或 2.7 用于 Vue 2
    "plugins": [
      "@vue-macros/volar/define-options"
      // ...更多功能
    ]
  }
}

或则更直接在 .eslintrc.js 里加上下述配置,直接忽略错误,当然只是语法检测层面,程序实际不受影响。

module.exports = {
	globals: {
    defineOptions: "readonly"
  }
}
使用 defineOptions 编译宏

defineProps 编译宏类似,此时我们多了一个可以设置 name 属性的编译宏,只需要传入参数即可配置心心念念的 name 属性。

<script lang="ts" setup>
  defineOptions({
    name: "my-component"
  })
  
	/* 业务代码 */
</script>

4.2 Vue3.3版本之后

在 Vue3.3 版本更新之后,对于这个问题的解决方案就简单多了,defineOptions 编译宏以内置支持,不需要再去额外安装其他插件,直接使用即可。
image.png

defineOptions能做的不只是声明 name 属性,其功能能做到更多,如是否允许组件 attribute 透传行为的 inheritAttrs 属性。


五、后记

对于在 <script setup> 中声明 name 的问题,其实老外早就想到且引起了许多的讨论,尤雨溪也多次下场,也有人提出以 <script setup name="xxx"> 作为解决方案,但最终采用的是 defineOptions 编译宏,并在 Vue3.3 版本之后内置支持。
对于使用者来说,name 属性可能有点微不足道,但就是为了实现这么一个小小的功能,背后的实现却充斥着各位开发者的努力🌹 。
image.png
image.png
https://github.com/vuejs/core/issues/5218
https://github.com/vuejs/rfcs/discussions/430#discussioncomment-2333745


参考资料💘

🍅因发布平台差异导致阅读体验不同,源文贴出:《Vue3 如何在

  • 官方手册:
    • Vue官方文档 defineOptions
    • Vue官方文档 name
    • Vue Macros defineOptions
    • Github unplugin-vue-setup-extend-plus

推荐博文🍗

  • 《『精』Vue 使用props为路由组件传参『详解』》
  • 《Vue3 组件如何模块化抽离Props》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

世界坐标系的正方体投影到二维视角【python实验】

为了更进一步理解相机内外参数对应的几何意义&#xff0c;特意设计了一个Python实验。希望对相关初学者有帮助。 实验思路&#xff1a;在世界坐标系上构建一个正方体&#xff0c;然后通过相机内外参数矩阵映射到屏幕坐标系上&#xff0c;观察映射结果。 实验素材&#xff1a;两…

[创业之路-85]:创业公司如何办理云服务器(PaaS)

目录 一、云服务 1.1 云服务器类型 1.2 云服务案例 二、搭建云服务器的基本步骤 二、云服务的架构&#xff08;架构&#xff09; 2.1 层次架构 2.2 云平台统一管理功能 2.3 管理工具 一、云服务 1.1 云服务器类型 云服务&#xff08;Cloud Services&#xff09;是一种…

Notes/Domino中的JVM版本

大家好&#xff0c;才是真的好。 这篇内容主要写给同时关注Domino和Java的技术人员。 很多人都知道&#xff0c;从Notes/Domino R5&#xff08;1999年&#xff09;版本&#xff0c;开始自带一个Java虚拟机&#xff0c;用来支持Java应用运行。但很多人不知道&#xff0c;这个J…

双生幻想角色强度排行最新

最新双生幻想角色强度排行榜分享 关注【娱乐天梯】&#xff0c;获取内部福利号 T0强度角色: 德古拉、天启、洛可可、黑卡蒂 T0.5强度角色:神乐、齐天大圣、真涯、貂蝉、魔龙 T1强度角色: 撒旦、黄月英、甄姬、莱纳、魔王、涂山红红、蝎子莱莱 T2强度角色: 东方月初、御神子、雷…

03、最长连续数列:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度

文章目录 1、题目描述1.1 移动所有零至数组末尾1.2 示例 2、解题思路2.1 思路讲解2.2 动画演示&#xff08; 待补充&#xff09; 3、答案3.1 Java 代码3.2 运行结果 4、视频讲解&#xff08; 待补充&#xff09; 1、题目描述 1.1 移动所有零至数组末尾 给定一个未排序的整数数…

掌动智能兼容性测试四大优势

兼容性测试是将应用中的场景脚本化&#xff0c;根据业务需求定制脚本&#xff0c;提交到云端千台真机&#xff0c;并行自动测试&#xff0c;从安装、启动、运行、功能、UI、核心业务流程、复杂互动场景等多维度&#xff0c;深度发现应用兼容性问题&#xff0c;并结合人工复审&a…

django毕业设计基于python企业资产管理系统

项目介绍 本文首先介绍了企业资产管理系统的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;根据需求分析制定模块并设计数据库结构&#xff0c;再根据系统总体功能模块的设计绘制系统的功能模块图&…

[LeetCode]-876.链表的中间结点-206.反转链表-21.合并两个有序链表-203.移除链表元素

目录 876.链表的中间结点 题目 思路 代码 206.反转链表 题目 思路 代码 21.合并两个有序链表 题目 思路 代码 203.移除链表元素 题目 思路 代码 876.链表的中间结点 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/mi…

如何使用 NFTScan NFT API 在 Polygon 网络上开发 Web3 应用

Polygon 以前被称为 Matic Network&#xff0c;是一种扩展的解决方案&#xff0c;它提供多种工具来加快并降低区块链网络上交易的成本和复杂性。然而&#xff0c;其区块链上的大量活动使以太坊因增长的传输成本和拥挤的流量几乎瘫痪。Polygon 诞生的主要目的是帮助以太坊解决链…

【C/C++】虚函数表

class Animal { public:virtual void speak(){cout << "动物在说话" << endl;} };class Cat :public Animal { public://重写 函数返回值类型 函数名 参数列表 完全相同void speak(){cout << "小猫在说话" << endl;} };void DoSpe…

Linux C语言进阶-D12~D13函数的基本用法及传参

函数的说明&#xff1a;double power(double x,int n) 函数必须先说明再调用&#xff0c;并且x,n可省略 引入头文件作用&#xff1a;头文件中有函数声明和函数实现&#xff0c;预处理就是头文件展开 定义求x的n次方的函数&#xff08;x:实数&#xff0c;n:正整数&#xff09;…

Python---字符串中的查找方法--find()--括号里是要获取的字符串

字符串查找方法&#xff1a;查找 子串 在字符串中的 位置 或 出现的次数。 子串&#xff1a;要找的 其中一部分 字符串 基本语法&#xff1a; 字符串.find(要查找的字符或者子串) find 英 /faɪnd/ v. 找到&#xff0c;找回&#xff1b;发现&#xff0c;发觉&…

Java 数据结构篇-模拟实现动态数组

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本篇目录 1.0 动态数组说明 2.0 模拟实现动态数组的核心方法 2.1 动态数组-插入与扩容 2.2 动态数组-获取元素 2.3 动态数组-修改元素 2.4 动态数组-删除元素 2.5 动态数组-遍历…

H5: 使用Web Audio API播放音乐

简介 记录关于自己使用 Web Audio API 的 AudioContext 播放音乐的知识点。 需求分析 1.列表展示音乐&#xff1b; 2.上/下一首、播放/暂停/续播&#xff1b; 3.播放模式切换&#xff1a;循环播放、单曲循环、随机播放&#xff1b; 4.播放状态显示&#xff1a;当前播放的音乐…

适合女生的副业有哪些?整理了六个靠谱副业,女生必看

在这个互联网时代下&#xff0c;女生对于经济独立变得越来越看重。她们与男生一样&#xff0c;对于工作认真努力、追求进步&#xff0c;并且对于副业有着强烈的渴望和热爱。事实上&#xff0c;她们在副业领域的表现要远远超过很多男生&#xff0c;这一点不可否认。 女生在副业方…

Linux Crontab 定时任务

crond 服务 Linux 通过 crond 服务来支持 crontab。 查看 crond 服务是否已经安装 输入下面命令确认 crond 服务是否已安装。 systemctl list-unit-files | grep crond 如果为 enabled&#xff0c;表示服务正运行。 crontab 文件 crontab 要执行的定时任务都被保存在 /etc…

PostgreSQL 进阶 - 使用foreign key,使用 subqueries 插入,inner joins,outer joins

1. 使用foreign key 创建 table CREATE TABLE orders( order_id SERIAL PRIMARY KEY, purchase_total NUMERIC, timestamp TIMESTAMPTZ, customer_id INT REFERENCES customers(customer_id) ON DELETE CASCADE);“order_id”&#xff1a;作为主键的自增序列&#xff0c;使用 …

ElasticSearch集群环境搭建

1、准备三台服务器 这里准备三台服务器如下: IP地址主机名节点名192.168.225.65linux1node-1192.168.225.66linux2node-2192.168.225.67linux3node-3 2、准备elasticsearch安装环境 (1)编辑/etc/hosts&#xff08;三台服务器都执行&#xff09; vim /etc/hosts 添加如下内…

uniapp subNvue 写的视频播放

文件下载地址 https://download.csdn.net/download/weixin_47517731/88500016https://download.csdn.net/download/weixin_47517731/88500016 1:在pages.json中配置视频播放页面 {/* 视频详情页面 */"path": "pages/detail-video/detail","style&q…

一键解决 AirPods Pro 的沙沙声

每次我都以为是因为耳机受潮了&#xff0c;但每次这个方法都有效 [笑哭] 1、打开苹果手机&#xff0c;蓝牙连接 AirPods Pro 后&#xff0c;打开“设置”找到&#xff1a; 2、点进去&#xff0c;点击“关闭”&#xff1a; 瞬间&#xff0c;整个世界安静了&#xff01;