使用Reactive()和Ref()的Vue 3 Reactivity组成API

220 阅读4分钟

DZone>Web Dev Zone>Vue 3使用Reactive()和Ref()的Reactivity组成API

Vue 3使用Reactive()和Ref()的反应性组成API

了解如何在Vue 3中使用反应性,并通过使用反应性和反射函数的组合API方法。

Saurabh Dashora user avatar通过

薛宝钗

CORE -

5月。05, 22 - Web Dev Zone -教程

喜欢 (4)

评论

保存

鸣叫

3.43K浏览次数

加入DZone社区,获得完整的会员体验。

免费加入

反应性是构建VueJS应用程序的一个关键支柱。虽然使用Options API的VueJS Reactivity相当强大,但越来越多的开发者开始使用Composition API来构建他们的Vue应用。值得庆幸的是,使用Composition API的Vue 3 Reactivity同样强大。

Vue 3 Reactivity with Composition API是由reactive()ref() 函数驱动的。这些函数将组件模型数据转化为反应性,这样Vue就能够跟踪变化。然而,reactive()ref() 都有其特定的使用场景。重要的是要知道在哪个特定场景下应该使用哪个函数。

Vue 3 Options API和Composition API有不同的语法来管理反应性变量,但反应性的概念是一样的。

在这篇文章中,我们将看看Vue 3 Composition API 中单文件组件 或SFC的反应性。

Vue 3reactive() 函数

VueJS中的reactive() 函数有助于创建一块反应性的状态。

Vue.js组件

import { reactive} from 'vue'

// reactive state
const state = reactive({
  currentCounterStatus: '',
})

Vue能够跟踪反应式对象内任何属性的突变。在上面的例子中,如果currentCounterStatus 的值发生变化,VueJS会自动更新DOM。

我们可以通过使用模板语法在模板内使用反应式状态变量。

HTML

<template>
  <h2>{{ state.currentCounterStatus }}</h2>
</template>

被动状态的值可以被更新,如下所示。

JavaScript

function increment() {
  state.currentCounterStatus = 'Incremented'
}

我们可以使用任何点击处理程序来触发increment() 函数。

reactive() API有一些限制,如下。

  • 我们只能使用reactive() API来声明对象、数组或其他集合类型,如Map或Set。基本上,reactive() 函数不能用于基数,如字符串、整数、布尔值等。在我看来,这是一个很大的缺点,限制了reactive() API的使用。
  • 我们必须始终保持对被动对象的相同引用。换句话说,如果我们通过再次调用reactive() 函数来更新一个反应式对象的值,那么与第一个对象的反应性连接就会丢失。请看下面的例子。

JavaScript

import { reactive} from 'vue'

// reactive state
let state = reactive({
  currentCounterStatus: '',
})

state = reactive({
  currentCounterStatus: 'Incremented'
})

Vue 3 使用ref() 函数的反应性

Vue 3还提供了ref() 函数来声明一个反应性状态。基本上,ref() 函数解决了reactive() 函数的限制。主要是,ref() 可以持有任何类型的值,包括基元。

请看下面的例子。

Vue.js组件

<template>
  <h1>{{ appName }}</h1>
  <h2>Count is: {{ counter }}</h2>
</template>

基本上,ref() 接受输入参数并将其包裹在一个对象中。这个对象有一个值属性。换句话说,对于上面的例子,我们可以把appName 变量作为appName.value 。另外,计数器的值也可以作为counter.value

Vue 3模板中的参考解包

我们也可以从模板内的ref() 函数访问反应式变量。

请看下面的例子。

Vue.js组件

<template>
  <h1>{{ appName }}</h1>
  <h2>Count is: {{ counter }}</h2>
</template>

正如你所看到的,在这里我们不需要使用counter.valueappName.value 。基本上,当我们在模板中访问Refs作为顶层属性时,VueJS会自动将其解包。因此,不需要使用.value

重要的一点是,Ref解包只对顶层属性有效。它对下面的例子不起作用。

JavaScript

const counterStatusObject = {
  status: ref(''),
}

这是因为counterStatusObject.status 是一个Javascript对象。

Vue 3 反应式对象中的Ref解包

我们也可以添加一个Ref变量作为反应式对象的一个属性。见下文。

JavaScript

const appName = ref('Counter Application')
const appObject = reactive({
   appName
})

console.log(appObject.appName)

在这种情况下,我们可以直接访问appName ,而不使用.value

Vue 3 反应性转换

你可能觉得使用.value 是不必要的麻烦。它降低了访问模板中的变量的简单性。

Vue 3提供了一个编译时转换,可以解决这个问题。我们现在可以使用$ref() 来声明一个反应式变量,并直接访问它,而不用.value

JavaScript

const appName = $ref('Counter Application')
const counter = $ref(0)

function increment() {
  counter++
}

然而,请注意,这仍然是一个实验性的功能,很容易发生变化。

总结

在这篇文章中,我们介绍了使用Composition API的Vue 3 Reactivity。作为其中的一部分,我们看了Vue的reactive()ref() 函数,这些函数可以帮助我们声明反应性对象和变量。

如果你对这篇文章有任何评论或疑问,请随时在评论区提出。

API

经Saurabh Dashora许可发表于DZone。点击这里查看原文。

DZone贡献者所表达的观点属于他们自己。

DZone上的热门文章


评论

网络开发 合作伙伴资源