美文网首页
vue3.0里给数据添加响应式有很多api可用,有时傻傻分不清,

vue3.0里给数据添加响应式有很多api可用,有时傻傻分不清,

作者: 前端开发养成记 | 来源:发表于2022-03-24 15:55 被阅读0次

一、reactive
reactive 用于为对象添加响应式状态。
接收一个js对象作为参数,返回一个具有响应式状态的副本。

获取数据值的时候直接获取,不需要加.value
参数只能传入对象类型

import { reactive } from 'vue'

// 响应式状态
const state = reactive({
  count: 0
})

// 打印count的值
console.log(state.count)

二、ref
ref 用于为数据添加响应式状态。
由于reactive只能传入对象类型的参数,而对于基本数据类型要添加响应式状态就只能用ref了,同样返回一个具有响应式状态的副本。

获取数据值的时候需要加.value。(对于基本数据类型,ref是自己的实现方式且性能优于reactive,而对于对象类型,ref可以理解为是通过reactive包装实现的)
参数可以传递任意数据类型,传递对象类型时也能保持深度响应式,所以适用性更广。
vue 3.0 setup里定义数据时推荐优先使用ref,方便逻辑拆分和业务解耦。

import { ref } from 'vue'

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

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

// 打印name的值
console.log(name.value)
// 打印count的值
console.log(state.value.count)

三、toRef
toRef 用于为源响应式对象上的属性新建一个ref,从而保持对其源对象属性的响应式连接。
接收两个参数:源响应式对象和属性名,返回一个ref数据。
例如使用父组件传递的props数据时,要引用props的某个属性且要保持响应式连接时就很有用。

获取数据值的时候需要加.value
toRef后的ref数据如果是复杂类型数据时,不是原始数据的拷贝,而是引用,改变结果数据的值也会同时改变原始数据

import { defineComponent, toRef } from 'vue'

export default defineComponent({
  props: [title],
  
  setup (props) {
    // 创建变量myTitle
    const myTitle = toRef(props, 'title')

    console.log(myTitle.value)
  }
})

四、toRefs
toRefs 用于将响应式对象转换为结果对象,其中结果对象的每个属性都是指向原始对象相应属性的ref。
常用于es6的解构赋值操作,因为在对一个响应式对象直接解构时解构后的数据将不再有响应式,而使用toRefs可以方便解决这一问题。

获取数据值的时候需要加.value
toRefs后的ref数据如果是复杂类型数据时,不是原始数据的拷贝,而是引用,改变结果数据的值也会同时改变原始数据
作用其实和 toRef 类似,只不过 toRef 是对一个个属性手动赋值,而 toRefs 是自动解构赋值。

import { defineComponent, toRefs } from 'vue'

export default defineComponent({
 props: [title],
 
 setup (props) {
   // 使用了解构赋值语法创建了变量myTitle
   const { myTitle } = toRefs(props)

   console.log(myTitle.value)
 }
})

五、结语
尽量不要混着用,reactive 和 ref 选一种,toRef 和 toRefs 选一种,不然代码会很乱。推荐 ref 和 toRefs 一把梭。

相关文章

  • 响应式布局与自适应布局

    前言 这几天工作的时候被提出需要响应式布局的需求,但是响应式布局和自适应布局有嗲傻傻分不清楚。所以响应式布局和自适...

  • Vue.js入门(四):常用API

    1 数据类API Vue.set 向响应式对象中添加一个 属性,并确保这个新 属性 同样是响应式的,且触发视图更新...

  • (翻译)reflect-metadata

    本文翻译自 reflect-metadata 给 ECMAScript 的源数据响应式 API 的原型(proto...

  • vue3

    ~ vue3 的基础 api 有那些 const { createApp, reactive,// 创建响应式数据...

  • vue3较vue2的特别之处 - ref/toRef/toRef

    ref: 为值类型数据添加响应式状态示例: reactive: 为对象添加响应式状态示例: toRef: 用于为源...

  • vuex state中数据更新了但是 视图没有更新

    原因是:响应式数据只是一开始data中已经存在的数据才会有响应式数据,Vue 不允许动态添加根级别的响应式属性,可...

  • 2018-07-17 Vue源码解析阅读笔记

    响应式对象 通过Object.defineProperty()给属性添加getter/setter,以达到响应式改...

  • Scheduler(一)

    1.Scheduler 的 API 在响应式编程中,如果想给Observable操作符链添加多线程功能,可以指定操...

  • Vue响应式原理

    Vue2.x 核心响应式原理 Vue3.0 核心响应式原理 Vue 自定义事件 Vue 发布订阅模式 发布/订阅模...

  • vue2中computed原理

    要理解这个,首先要理解vue2的数据响应式原理,因为computed这个API的实现是建立在数据响应式的基础之上的...

网友评论

      本文标题:vue3.0里给数据添加响应式有很多api可用,有时傻傻分不清,

      本文链接:https://www.haomeiwen.com/subject/wvkdjrtx.html