vue3中使用ref语法糖

发布时间 2023-04-17 13:58:29作者: 丁少华

自从引入组合式 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>