ref和reactive

1. ref方法

ref方法用于为数据添加响应式状态,可以支持基本的数据类型,也可以支持复杂的对象数据类型,是Vue 3中推荐的定义响应式数据的方法,也是最基本的响应式方法,需要注意的是:

  • 获取数据值的时候需要加.value。
  • ref的本质是原始数据的拷贝,改变简单类型数据的值不会同时改变原始数据。

使用方法如实例代码所示。

<div id="app">
  <component-b  />
</div>
const componentB = {
  template:'<div>{{name}}</div>',
  setup(props) {

    // 为基本数据类型添加响应式状态
    const name = Vue.ref('John')

    let obj = {count : 0};

    // 为复杂数据类型添加响应式状态
    const state = Vue.ref(obj)

    console.log(name.value) // 打印John

    console.log(state.value.count)// 打印0

    let newobj = Vue.ref(obj.count)

    // 修改响应式数据不会影响原数据
    newobj.value = 1

    console.log(obj.count)// 打印0

    return {
      name
    }
  }
}
Vue.createApp({
  components: {
    'component-b': componentB
  }
}).mount("#app")

需要注意的是,改变的这个数据必须是简单数据类型,一个具体的值,这样才不会影响到原始数据,如上面的代码中的obj.count。

2. reactive方法

ref方法用于为复杂数据添加响应式状态,只支持对象数据类型,需要注意的是:

  • 获取数据值的时候不需要加.value。
  • reactive的参数必须是一个对象,包括JSON数据和数组都可以,否则不具有响应式。
  • 和ref一样,reactive的本质也是原始数据的拷贝。

ref本质也是reactive,ref(obj)等价于reactive({value:obj}),使用方法如示例代码所示。

<div id="app">
  <component-b  />
</div>
const componentB = {
  template:'<div>{{state.count}}</div>',
  setup(props) {

    // 为复杂数据类型添加响应式状态
    const state = Vue.reactive({count : 0})

    console.log(state.count)// 打印0

    return {
      state
    }
  }
}
Vue.createApp({
  components: {
    'component-b': componentB
  }
}).mount("#app")

reactive和ref都是用来定义响应式数据的。reactive更推荐去定义复杂的数据类型,不能直接解构,ref更推荐定义基本类型。ref可以简单地理解为是对reactive的二次包装,ref定义的数据访问的时候要多一个.value。