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

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-pluspnpm 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 -Dpnpm add unplugin-vue-define-options -D

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

yarn add @vue-macros/volar -Dpnpm 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.hqwc.cn/news/160446.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在PyCharm中直接启动mitmproxy并自动打开关闭系统代理

前言 在前面的文章中&#xff0c;有几篇是介绍mitmproxy 的。 这个mitmproxy 的确是个捕获数据的好工具&#xff0c;但在运行时候需要在命令行启动&#xff0c;这是很令人苦恼的。 之前也尝试过脱离命令行去启动mitmproxy&#xff0c;在Python中启动mitmproxy&#xff0c;脱离…

机器人连杆惯量参数辨识(估计)

杆的转动惯量的计算公式是Imr^2。在经典力学中&#xff0c;转动惯量&#xff08;又称质量惯性矩&#xff0c;简称惯矩&#xff09;通常以I 或J表示&#xff0c;SI 单位为 kgm。对于一个质点&#xff0c;I mr&#xff0c;其中 m 是其质量&#xff0c;r 是质点和转轴的垂直距离。…

Zephyr-7B-β :类GPT的高速推理LLM

Zephyr 是一系列语言模型&#xff0c;经过训练可以充当有用的助手。 Zephyr-7B-β 是该系列中的第二个模型&#xff0c;是 Mistralai/Mistral-7B-v0.1 的微调版本&#xff0c;使用直接偏好优化 (DPO) 在公开可用的合成数据集上进行训练 。 我们发现&#xff0c;删除这些数据集的…

React Native 环境搭建

Mac 版 根据官网步骤进行&#xff0c;V 0.72 注&#xff1a;在开始之前&#xff0c;我删除了电脑中已有 Homebrew &#xff0c;重新安装最新版的 Homebrew。过程中使用有科学上网工具。 关于 Homebrew 的安装问题&#xff0c;可以参考这篇博客。 1&#xff0c;安装 node b…

亚马逊云科技:让生成式AI真正走向普惠

伴随着ChatGPT的横空出世&#xff0c;生成式AI&#xff08;Artificial Intelligence Generated Content&#xff0c;也称AIGC&#xff09;大潮也以锐不可当之势席卷全球。从各行各业的商业领袖&#xff0c;到千千万万的程序员和开发者&#xff0c;都在思考如何借助生成式AI技术…

[iOS开发]iOS中TabBar中间按钮凸起的实现

在日常使用app的过程中&#xff0c;经常能看到人家实现了底部分栏控制器的中间按钮凸起的效果&#xff0c;那么这是怎么实现的呢&#xff1f; 效果演示&#xff1a; 实现原理&#xff1a; 创建按钮 创建一个UITabBar的子类&#xff0c;重写它的layoutSubviews方法&#xff1…

文本内容转换成语音播放的工具:Speech Mac

Speech Mac版是一款适用于Mac电脑的语音合成工具。它将macOS语音合成器的所有功能整合到一个易于使用的界面中。通过Speech Mac版&#xff0c;用户可以选择40多种声音和语言&#xff0c;方便地将文本转换为语音。用户可以将文本拖放或粘贴到Speech中&#xff0c;并随时更改语音…

Nginx搭载负载均衡及前端项目部署

目录 ​编辑 一.Nginx安装 1.安装所需依赖 2.下载并解压Nginx安装包 3.安装nginx 4.启动Nginx服务 二.Tomcat负载均衡 1.准备环境 1.1 准备两个Tomcat 1.2 修改端口号 1.3 配置Nginx服务器集群 2.效果展示 ​编辑三.前端项目打包 ​编辑四.前端项目部署 1.上传项目…

Websocket @ServerEndpoint不能注入@Autowired

在websocket中使用ServerEndpoint无法注入Autowired、Value 问题分析 Spring管理采用单例模式&#xff08;singleton&#xff09;&#xff0c;而 WebSocket 是多对象的&#xff0c;即每个客户端对应后台的一个 WebSocket 对象&#xff0c;也可以理解成 new 了一个 WebSocket&…

SQL左连接实战案例

要求&#xff1a;用表df1和表df2的数据&#xff0c;得到df3 一、创建表 CREATE TABLE df1 (姓名 varchar(255) DEFAULT NULL,年龄 int DEFAULT NULL,部门 varchar(255) DEFAULT NULL,id int DEFAULT NULL );CREATE TABLE df2 (部门 varchar(255) DEFAULT NULL,年龄 int DEFAU…

Qt中正确的设置窗体的背景图片的几种方式

Qt中正确的设置窗体的背景图片的几种方式 QLabel加载图片方式之一Chapter1 Qt中正确的设置窗体的背景图片的几种方式一、利用styleSheet设置窗体的背景图片 Chapter2 Qt的主窗口背景设置方法一&#xff1a;最简单的方式是通过ui界面来设置&#xff0c;例如设置背景图片方法二 &…

【六、http】go的http的客户端重定向

一、http的重定向 重定向过程&#xff1a;客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应&#xff0c;则自动再发送一个新的http请求&#xff0c;请求url是新的location地址----》服务器根据此请求寻…