>>分享Web前端开发技术,并对孙卫琴的《精通Vue.js:Web前端开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 14981 个阅读者 刷新本主题
 * 贴子主题:  Vue3.0 ref、reactive、toRef、toRefs、customRef的区别 回复文章 点赞(0)  收藏  
作者:mary    发表时间:2021-04-21 04:22:11     消息  查看  搜索  好友  邮件  复制  引用

    

一、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包装了一层具有value属性的对象实现的

参数可以传递任意数据类型,传递对象类型时也能保持深度响应式,所以适用性更广。

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)
  }
})

五、customRef

(1)customRef 用于自定义返回一个ref对象,可以显式地控制依赖追踪和触发响应,接受工厂函数
(2)两个参数分别是用于追踪的 track 与用于触发响应的 trigger,并返回一个一个带有 get 和 set 属性的对象
使用:    

     import {customRef} from 'vue';
    
            function useDebouncedRef(value) {
          return customRef((track, trigger) => {
            return {
              get() {
                track()
                return value
              },
              set(newValue) {
                value2=newValue
                trigger()
              },
            }
          })
     }
    ```
    通过customRef返回的ref对象,和正常ref对象一样,通过x.value修改或读取值

----------------------------
原文链接:https://www.jianshu.com/p/7b41c826d1c2

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2021-05-02 21:09:14 重新编辑]
  Java面向对象编程-->继承
  JavaWeb开发-->自定义JSP标签(Ⅱ)
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->组合(Composition)API
  Vue3开发-->绑定表单
  vue30道面试题
  axios 发 post 请求,后端接收不到参数的解决方案
  Vue 项目从 Vue CLI 2 升级到 Vue CLI 4
  Velocity.js动画库的使用
  Vue watcher的高级用法
  14个JavaScript优化建议
  jQuery 事件方法汇总
  HTML DOM Li 对象
  HTML DOM Image图片对象
  JavaScript的Screen 对象
  JavaScript 正则表达式RegExp 对象
  CSS 听觉参考手册
  CSS 盒子模型
  HTML 区块:div和span元素
  Android 广播接收器(Broadcast Receivers)
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。