关于Vue3的setup attribute标识是否是一个值得使用的语法糖?
qiyuwang 2024-10-10 11:34 18 浏览 0 评论
Vue3从2020年9月发布到现在也有3年多的时间,这期间相信各大企业先后陆续都会在新项目的选择上从Vue2转到了Vue3开发,原因毫无疑问两个方面的改变性能+组合式API的变化,性能提升暂且不谈后续有空我会单独说一下性能方面的,也并非讲组合式API的用法好处,本文重点要讨论的一个地方是关于<script setup>用法问题。 <script setup> 是什么? 有什么用? 在vue的官网中是这么写的
添加图片注释,不超过 140 字(可选)
网中写了这样的一个示例(官网中主要展示的是组合式API与Option API的区别)
<script setup>
import { ref, onMounted } from 'vue'
// 响应式状态
const count = ref(0)
// 用来修改状态、触发更新的函数
function increment() {
count.value++
}
// 生命周期钩子
onMounted(() => {
console.log(`The initial count is ${count.value}.`)
})
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
其中第一行代码的setup就是一个语法糖的使用,那么如果没有加入setup关键字的话应该如何写呢?
<script>
import { ref, onMounted } from 'vue'
export default {
setup () {
// 响应式状态
const count = ref(0)
// 用来修改状态、触发更新的函数
function increment() {
count.value++
}
// 生命周期钩子
onMounted(() => {
console.log(`The initial count is ${count.value}.`)
})
return {
count
}
}
}
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
看起来是不是前者简便了一些,少写了export default也不再需要在setup方法中return,一共8行代码,随着<template>模板中的变量越多代return出去的代码也会越多,通常一个业务组件中大约是10~30行代码 <script setup>的得与失 使用setup标识的好处 如前面所说,节约代码,不需要在setup方法内使用return返回变量即可在template中直接使用 作为<script setup>使用的代价失去了什么? 在讲这方面之前我认为有必要先,抛出一个观点,是否越越简洁的代码就越好?显然我是不这么认为的,关于这点不仅仅体现在这一方面,后期可以单独针对这一点再举个例子讲一下,当前只针对setup单独讨论,在讨论这个问题之前我们需要对一下几个概念有一个清晰的认识。 通常我们在Vue中使用引入局部组件?
<script>
import componentA from '组件路径'
export default {
components: {
// 完成注册
componentA
}
}
</script>
<template>
<div>
<!--完成使用-->
<componentA></componentA>
</div>
</template>
想必这几行代码使用,早已深深刻入每一个使用Vue开发的人的DNA了。不知大家是否有想过尝试过通过console.log(componentA)在控制台输出一下componentA组件的本质是何物,或者他应该是何物? 我想了解这一点是比较重要的,或许他不影响着我们开发,直接按固定的套路import接收一个固定的变量,固定的写法,就能实现组件注册并实现业务逻辑开发,但作为一个开发人员,如果连每天都在使用的东西都不了解,我觉得多少都是有些问题的。 关于这一点实际上就跟Vue本身没多大关系的,这涉及到的实际上就是模块化方法的知识。 js的ES6模块化的一些概念 关于模块化的作用在这里不做过多的叙述,直接说最终使用上的一个规则,网上可能有各种各样的说法,这里我得到叫法可能跟网上有所不同,但语法规则上是一样的,大家可以自行去网上了解。 导出
// 非默认导出,他可以有多个,不可匿名
export const a = 'a'
export const b = 'b'
// 默认导出,可以匿名
export default ‘c’
导入
// 导入非默认导出变量,导出的变量名必须跟导出相同
import { a } from '导出文件地址'
// 导入默认导出变量,默认导出变量名可以自定义,因为导出是匿名
import ccccc from '导出文件地址'
// 全量导入,会将默认导出与非默认导出一起合成一个大对象返回,如果是默认导出,那么key值就是default
import * as all from '导出文件地址'
console.log(a)
// 输出 'a'
console.log(ccccc)
// 输出 'c'
console.log(all)
// 输出对象 { a: 'a', b: 'b': default: 'c' }
Vue中import导入的组件变量componentA到底是什么
回到最开始的时候写的案例组件,如下
<script>
import { ref, onMounted } from 'vue'
export default {
setup () {
// 响应式状态
const count = ref(0)
// 用来修改状态、触发更新的函数
function increment() {
count.value++
}
// 生命周期钩子
onMounted(() => {
console.log(`The initial count is ${count.value}.`)
})
return {
count
}
}
}
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
很显然componentA就是<script>里面的export default所导出的整个对象,到此也解释了为何我不推荐写<script setup>,因为本应该能能基于我们更好理解性质的代码被直接忽略了,这是由于通常我们使用vue-cli开发,内部集成了webpack里面的其中一个loader,也就是vue-loader帮我们处理了这些事情。 老好人vue-loader 使用脚手架开发时候,我们不难发现在package.json里面需要依赖vue-loader。 什么?你说没有? 那是因为官方提供的脚手架实际上不是直接依赖vue-loader,而是依赖了@vue/cli-service然后再这个包内部又依赖了vue-loader,去node_modules内部找到这个包查看引用不难发现这点。 那么vue-loader帮我们做了什么? js模块化的局限性及解决办法 我们所熟悉的模块化实际上只支持两种文件js,json而.vue文件实际不难理解,因为他并不是纯js代码。 那么import导入时候肯定是不知道导出的变量是啥,哪怕之前所说的componentA实际上export default这些代码也是在.vue文件内的一个<script>内部的代码,我们所熟悉的能直接这么写的文件恐怕只有.html文件,在浏览器的时候他认识这个标签。 但.vue凭什么理所应当就认识?里面还有<template>作为类html的模板以及<style>作为容纳css的标签,从我们最开始理解的前端三剑客html,css,js,这似乎是一件不被理解的事情。 因此vue-loader实际上就相当于是认识这个.vue的翻译官,它的作用就是将.vue文件转换成.js文件,这样就能解决了模块导入的局限性。 vue-loader针对.vue文件做了多少处理 关系这点还是挺多细节的,在这里不做过多解释,有机会可以单独写一篇讲一下,这里只做简单解释,就是将<template>转换成导出的对象中的render方法,将<style>转换成js语法,比如通过document.createElement创建<style>标签,再通过document.body.appendChild插入到dom中,这样一来不就是纯js代码了。 那么回归到最初的问题,很显然 <script setup>就是在这个过程中做了一些代码的节约,从而让我们可以少写了这几行代码。 可以简单的理解为,我们不用亲自写这些代码。但是vue-loader在编译之后还是给我们加上了这些代码,这其中也包括了return出去的变量,所以才可以直接在模板中使用。 总结使用<script setup>代价到底失去了什么
<script>
import { ref, onMounted } from 'vue'
export const defaultOptions = {
count: '0'
}
export default {
setup () {
// 响应式状态
const option = ref(defaultOptions)
return {
option
}
}
}
</script>
<template>
<div>{{ option.count }}</div>
</template>
如上述这类代码除了export default以外还可以使用非默认导出export导出变量defaultOptions,当然这点几乎无关痛痒,也并非是我不推荐的原因。 最主要的原因是,经过上述的说法,如果对于js 模块化有足够的理解,那么我认为从代码阅读性质来说无疑是更好的,因为vue-loader将这一部分不该做的事情都做了,回想Vue2实际这些代码都是不可忽略的,但反而因为如此,他能更接近js本质上的一些东西,我认为是不可忽略的。 其中return返回的变量,我认为其实从某种角度上,更能直观让你看到<template>上到底使用了那些变量,方法,计算属性等。 总结 使用<script setup>弊大于利 而对于相对于少这一点点代码来说实际上,我认为实际上并不占用项目太多的代码量,但会换来更好的代码阅读性。
相关推荐
- # 安装打开 ubuntu-22.04.3-LTS 报错 解决方案
-
#安装打开ubuntu-22.04.3-LTS报错解决方案WslRegisterDistributionfailedwitherror:0x800701bcError:0x80070...
- 利用阿里云镜像在ubuntu上安装Docker
-
简介:...
- 如何将Ubuntu Kylin(优麒麟)19.10系统升级到20.04版本
-
UbuntuKylin系统使用一段时间后,有新的版本发布,如何将现有的UbuntuKylin系统升级到最新版本?可以通过下面的方法进行升级。1.先查看相关的UbuntuKylin系统版本情况。使...
- Ubuntu 16.10内部代号确认为Yakkety Yak
-
在正式宣布Ubuntu16.04LTS(XenialXerus)的当天,Canonical创始人MarkShuttleworth还非常开心的在个人微博上宣布Ubuntu下个版本16.10的内...
- 如何在win11的wsl上装ubuntu(怎么在windows上安装ubuntu)
-
在Windows11的WSL(WindowsSubsystemforLinux)上安装Ubuntu非常简单。以下是详细的步骤:---...
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
-
IT之家2月18日消息,科技媒体pureinfotech昨日(2月17日)发布博文,介绍了3中简便的方法,让你轻松在Windows11系统中,使用WindowsSubs...
- 如何查看Linux的IP地址(如何查看Linux的ip地址)
-
本头条号每天坚持更新原创干货技术文章,欢迎关注本头条号"Linux学习教程",公众号名称“Linux入门学习教程"。...
- 怎么看电脑系统?(怎么看电脑系统配置)
-
要查看电脑的操作系统信息,可以按照以下步骤操作,根据不同的操作系统选择对应的方法:一、Windows系统通过系统属性查看右键点击桌面上的“此电脑”(或“我的电脑”)图标,选择“属性”。在打开的...
- 如何查询 Linux 内核版本?这些命令一定要会!
-
Linux内核是操作系统的核心,负责管理硬件资源、调度进程、处理系统调用等关键任务。不同的内核版本可能支持不同的硬件特性、提供新的功能,或者修复了已知的安全漏洞。以下是查询内核版本的几个常见场景:...
- 深度剖析:Linux下查看系统版本与CPU架构
-
在Linux系统管理、维护以及软件部署的过程中,精准掌握系统版本和CPU架构是极为关键的基础操作。这些信息不仅有助于我们深入了解系统特性、判断软件兼容性,还能为后续的软件安装、性能优化提供重要依据。接...
- 504 错误代码解析与应对策略(504错误咋解决)
-
在互联网的使用过程中,用户偶尔会遭遇各种错误提示,其中504错误代码是较为常见的一种。504错误并非意味着网站被屏蔽,它实际上是指服务器在规定时间内未能从上游服务器获取响应,专业术语称为“Ga...
- 猎聘APP和官网崩了?回应:正对部分职位整改,临时域名可登录
-
10月12日,有网友反映猎聘网无法打开,猎聘APP无法登录。截至10月14日,仍有网友不断向猎聘官方微博下反映该情况,而猎聘官方微博未发布相关情况说明,只是在微博内对反映该情况的用户进行回复,“抱歉,...
- 域名解析的原理是什么?域名解析的流程是怎样的?
-
域名解析是网站正常运行的关键因素,因此网站管理者了解域名解析的原理和流程对于做好域名管理、解决常见解析问题,保障网站的正常运转十分必要。那么域名解析的原理是什么?域名解析的流程是怎样的?接下来,中科三...
- Linux无法解析域名的解决办法(linux 不能解析域名)
-
如果由于误操作,删除了系统原有的dhcp相关设置就无法正常解析域名。 此时,需要手动修改配置文件: /etc/resolv.conf 将域名解析服务器手动添加到配置文件中 该文件是DNS域名解...
- 域名劫持是什么?(域名劫持是什么)
-
域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。说的直白些,域名劫持,就是把互...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- # 安装打开 ubuntu-22.04.3-LTS 报错 解决方案
- 利用阿里云镜像在ubuntu上安装Docker
- 如何将Ubuntu Kylin(优麒麟)19.10系统升级到20.04版本
- Ubuntu 16.10内部代号确认为Yakkety Yak
- 如何在win11的wsl上装ubuntu(怎么在windows上安装ubuntu)
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- 如何查看Linux的IP地址(如何查看Linux的ip地址)
- 怎么看电脑系统?(怎么看电脑系统配置)
- 如何查询 Linux 内核版本?这些命令一定要会!
- 深度剖析:Linux下查看系统版本与CPU架构
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)