Vue 的响应性语法糖

这篇博客探讨了Vue的组合式API中ref和响应式对象的使用,特别是新的响应式语法糖特性。$ref和$computed宏命令简化了代码,使得在模板中直接使用响应式变量和计算属性成为可能,而无需每次都使用.value。此外,还介绍了实验性的$shallowRef、$customRef和$toRef等API的宏函数。文章强调这些语法糖目前是实验性的,可能在最终确定前有所变化。
摘要由CSDN通过智能技术生成

536936a811e45a560e618fa81b1b2217.png

ref vs. 响应式变量

自从引入组合式 API 的概念以来,一个主要的未能解决的问题就是 ref 和响应式对象的使用方式。到处使用 .value 无疑是很繁琐的,并且在没有类型系统的帮助时很容易漏掉。

Vue 的响应性语法糖是一个编译时的转换过程,使我们可以像这样书写代码:

<script setup>
let count = $ref(0)


console.log(count)


function increment() {
  count++
}
</script>


<template>
  <button @click="increment">{{ count }}</button>
</template>

这里的这个 $ref() 方法是一个编译时的宏命令:它不是一个真实的、在运行时会调用的方法。而是用作 Vue 编译器的标记,表明最终的 count 变量需要是一个响应式变量。

响应式的变量可以像普通变量那样被访问和重新赋值,但这些操作在编译后都会变为带 .value 的 ref。比如上面例子中 <script> 部分的代码就被编译成了下面这样:

import { ref } from 'vue'


let count = ref(0)


console.log(count.value)


function increment() {
  count.value++
}

计算属性

<script setup>
import { reactive, computed } from 'vue'


const author = reactive({
  name: 'John Doe',
  books: [
    'Vue 2 - Advanced Guide',
    'Vue 3 - Basic Guide',
    'Vue 4 - The Mystery'
  ]
})


// 一个计算属性 ref
const publishedBooksMessage = computed(() => {
  return author.books.length > 0 ? 'Yes' : 'No'
})


const publishedBooksMessageZh = computed(() => {
  const chinese = {"Yes": "是", "No": "否"}
  return chinese[publishedBooksMessage.value]
})
</script>


<template>
  <p>Has published books:</p>
  <span>{{ publishedBooksMessage }}</span>
  <span>{{ publishedBooksMessageZh }}</span>
</template>

我们在这里定义了一个计算属性 publishedBooksMessage。computed() 方法期望接收一个 getter 函数,返回值为一个计算属性 ref。和其他一般的 ref 类似,你可以通过 publishedBooksMessage.value 访问计算结果。计算属性 ref 也会在模板中自动解包,因此在模板表达式中引用时无需添加 .value

计算属性宏函数

<script setup>
import { reactive, computed } from 'vue'


const author = reactive({
  name: 'John Doe',
  books: [
    'Vue 2 - Advanced Guide',
    'Vue 3 - Basic Guide',
    'Vue 4 - The Mystery'
  ]
})


const publishedBooksMessage = $computed(() => {
  return author.books.length > 0 ? 'Yes' : 'No'
})


const publishedBooksMessageZh = $computed(() => {
  const chinese = {"Yes": "是", "No": "否"}
  return chinese[publishedBooksMessage]
})
</script>


<template>
  <p>Has published books:</p>
  <span>{{ publishedBooksMessage }}</span>
</template>

每一个会返回 ref 的响应性 API 都有一个相对应的、以 $ 为前缀的宏函数。包括以下这些 API:

ref -> $ref
computed -> $computed
shallowRef -> $shallowRef
customRef -> $customRef
toRef -> $toRef

响应性语法糖目前是一个实验性功能,默认是禁用的,需要显式选择使用。在最终确定前仍可能发生变化,你可以查看 GitHub 上的提案与讨论来关注和跟进最新进展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue 3 中新增了一种叫做 "setup" 的语法糖。它是一个全新的组件选项,可以用来替代之前版本中的 data、computed、watch 等选项。使用 setup 函数,可以让组件选项变得更简洁、更灵活。 示例: ``` <template> <div> <p>{{ count }}</p> <button @click="increment">increment</button> </div> </template> <script> import { ref } from 'vue' export default { setup() { const count = ref(0) function increment() { count.value++ } return { count, increment } } } </script> ``` setup 函数返回一个对象,对象中的属将会被作为该组件实例的属,而方法将会作为该组件实例的方法 使用 setup,可以更方便的处理数据、计算属和观察者等。 ### 回答2: Vue3中的setup函数是一种新的语法糖,用于替代Vue2中的created、mounted等生命周期钩子函数的使用。它是在组件实例化之前执行的一个函数,可以用来初始化组件的状态、设置监听、处理副作用等操作。 在Vue3中,我们可以通过导出一个函数,将组件的数据、方法等以对象的形式传递给setup函数。在setup函数内部,我们可以使用Vue提供的一些响应式API(如reactive、ref等)来创建响应式的数据、引用其他组件、订阅和触发事件等。 相较于Vue2中使用不同的生命周期钩子函数分散地定义各种逻辑,使用setup函数可以将组件的逻辑集中在一个函数内部,提高了代码的可读和维护。同时,由于setup函数是在组件实例化之前执行的,它与组件实例完全解耦,可以更方便地进行单元测试和复用。 在setup函数内部,我们使用return语句来返回需要在模板中使用的数据和方法。返回的数据将会被注入到组件的模板中,我们可以直接在模板中使用这些数据。在Vue3中,我们不再使用this关键字去访问数据,而是直接使用导入的数据。 总结来说,Vue3的setup语法糖通过一个函数将组件的数据、方法等传递给setup函数,使得组件的逻辑集中在一个函数内部,提高了代码的可读和维护。它与组件实例完全解耦,方便进行单元测试和复用。同时,使用响应式API让数据的变化可以自动更新视图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值