>>分享Web前端开发技术,并对孙卫琴的《精通Vue.js:Web前端开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 15251 个阅读者 刷新本主题
 * 贴子主题:  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中使用JavaBean(Ⅰ)
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->RMI框架
  精通Spring-->Vue组件开发基础
  Vue3开发-->Vue指令
  VSCode 开发Vue必备插件
  10个开发者经常问的JavaScript面试题(附答案解析)
  javaScript中"=="和"==="运算符的区别
  vue3-Composition-API的用法
  axios 发 post 请求,后端接收不到参数的解决方案
  前端面试官指导前端面试攻略
  js Worker 线程收集1~9999的之间所有质数;Worker线程交换数...
  Vue经典面试题: Vue.use和Vue.prototype.$xx有血缘关系吗? -
  Thinking In Vue:vue指令的封装
  jQuery 遍历DOM 树中的同胞元素
  CSS 列表样式(ul)
  HTML支持的多媒体(Media)
  HTML5 内联 SVG
  JavaScript 库
  JavaScript 闭包
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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