vue3中使用ref语法糖
自从引入组合式 API 的概念以来,一个主要的未解决的问题就是 ref 和响应式对象到底用哪个。
响应式对象存在解构丢失响应性的问题,而 ref 需要到处使用 .value 则感觉很繁琐,并且在没有类型系统的帮助时很容易漏掉 .value
写法优化
以上是官方原话。大概就是新的语法糖 可以让我们更方便的使用ref,而不用每次都写.value
大概就是把这样的代码,简化成这样
<script setup lang="ts">
import { ref } from 'vue'
const count = ref(0)
console.log(count.value)
const increment = ()=> {
count.value++
}
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>
简化成
<script setup lang="ts">
const count = $ref(0)
console.log(count.value)
const increment = ()=> {
count++
}
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>
每一个会返回 ref 的响应式 API 都有一个相对应的、以 $ 为前缀的宏函数。
1. ref -> $ref
2. computed -> $computed
3. shallowRef -> $shallowRef
4. customRef -> $customRef
5. toRef -> $toRef
怎么开启此功能
在vite中启用语法糖开关
打开vite.config.ts,添加如下代码
vue({reactivityTransform: true}) // 启用响应式语法糖$ref $computed $toRef
配置tsconfig.json(可选)
在compilerOptions下添加vue/ref-macros
不然会报错`TS2304: Cannot find name '$ref'
虽然不影响使用,但是会影响开发体验
"compilerOptions":{
"types": ["vue/ref-macros"]
}
配置eslint(可选)
在eslintrc.cjs中加上global
不然会提示ESLint: '$ref' is not defined.(no-undef)
module.exports = {
globals: {
$ref: "readonly",
$computed: "readonly",
$shallowRef: "readonly",
$customRef: "readonly",
$toRef: "readonly"
}
};
免配上边两个可选
如果不嫌麻烦,又不想代码中总是有误报错误的行为。
可以直接在vue代码中引入vue/ref-macros
。
这样就不用配置tsconfig.json和eslint了
<script setup lang="ts">
import { $ref } from "vue/macros";
const count = $ref(0)
console.log(count.value)
const increment = ()=> {
count++
}
</script>
<template>
<button @click="increment">{{ count }}</button>
</template>