ref

ref toRef
普通ref对象 特殊ref对象
不会和原始对象挂钩 创建的ref对象,与原始对象挂钩
重新渲染 不会触发渲染

-普通ref对象

  1. 不会和原始对象挂钩
  2. 重新渲染
    如下面的例子中, ref对象改变,视图已更新,原始数据json保持不变。
<template><div>b = {{b}}</div>
</template><script>
import { ref } from 'vue'export default {setup() {let json = { a: 12 }let b = ref(json.a)b.value++console.log('b', b.value)console.log('json', JSON.stringify(json))return {b}}
}
</script>

toRef() -特殊ref对象,传入对象和属性
4. 创建的ref对象,与原始对象挂钩
5. 不会触发渲染

<template><div>b = {{b}}</div>
</template><script>
import { ref, toRef } from 'vue'export default {setup() {let json = { a: 12 }let b = toRef(json, 'a')setInterval(() => {b.value++console.log('b', b.value)console.log('json', JSON.stringify(json))}, 1000)return {b}}
}
</script>


toRefs()-批量处理toRef,传入一个对象

<template><div>res = {{res}}</div>
</template><script>
import { ref, toRef, toRefs } from 'vue'export default {setup() {let json = { a: 12, b: 5 }let res = toRefs(json) // 相当于{a: toRef(json, 'a'), b: toRef(json, 'b')}setInterval(() => {res.a.value++res.b.value++console.log('res.a', res.a.value, 'res.b', res.b.value)console.log('json', JSON.stringify(json))}, 1000)return {res}}
}
</script>


customRef
创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数,该函数接收 track 和 trigger 函数作为参数,并且应该返回一个带有 get 和 set 的对象。

function useDebouncedRef(value, delay = 200) {let timeoutreturn customRef((track, trigger) => {return {get() {track()return value},set(newValue) {clearTimeout(timeout)timeout = setTimeout(() => {value = newValuetrigger()}, delay)}}})
}export default {setup() {return {text: useDebouncedRef('hello')}}
}

shallowReactive的简单实现

shallowReactive只对第一层监听变化

function shallowReactive(obj) {if (typeof obj === 'object') {return new Proxy(obj, {get(obj, key) {if (key in obj) {return obj[key];} else {console.warn('no this key:' + key)return undefined;}},set(obj, key, val) {console.log('重新渲染')if (key in obj) {obj[key] = val;} else {console.warn('no this key:' + key)obj[key] = val;}return true;}})} else {console.warn('this is not reactive :' + obj)}
}
let obj1 = shallowReactive({a: 12,b: [{c: 2}]
})
obj1.a++;
console.log(obj1)

结果:

 let obj1 = shallowReactive({a: 12,b: [{c: 2}]
})
obj1.b[0].c++;
console.log(obj1.b[0])

结果:

reactive简单实现

深度监听

function reactive(obj) {if (typeof obj === 'object') {if (obj instanceof Array) {obj.forEach((item, index) => {if (typeof item === 'object') {obj[index] = reactive(item);}})} else {for (let key in obj) {if (typeof obj[key] === 'object') {obj[key] = reactive(obj[key])}}}return new Proxy(obj, {get(obj, key) {if (key in obj) {return obj[key];} else {console.warn('no this key:' + key)return undefined;}},set(obj, key, val) {console.log('重新渲染')if (key in obj) {obj[key] = val;} else {console.warn('no this key:' + key)obj[key] = val;}return true;}})} else {console.warn('this is not reactive :' + obj)}
}
let obj1 = reactive({a: 12,b: [{c: 2}]
})
obj1.b[0].c++;
console.log(obj1.b[0])

vue3中ref、reactive、shallowRef、 shallowReactive、toRaw、unref、toRef、toRefs、customRef使用与区别相关推荐

  1. vue3.0 ref reactive nextTick watch toRaw defineProps defineEmits

    目前使用的一些属性持续更新中 ref:推荐定义基本数据类型(ref值也可以是对象,但是一般情况下是对象直接使用reactive更合理). const data = ref( {id: "1& ...

  2. vue3中ref的理解

    1.什么是ref ref和reactive一样,也是用来实现响应式数据的方法 由于reactive必须传递一个对象,所以在实际开发中如果只是想让某个变量实现响应式的时候回非常麻烦 所以Vue3提供了r ...

  3. Vue2与Vue3中Ref绑定元素

    Vue之Ref绑定元素获取实例 我们可以通过给元素绑定ref属性来获取这个元素的实例,来调用实例中的某种方法来实现某种功能 Vue2实现 <template><!-- 单个绑定 -- ...

  4. vue3中的ref 和 reactive 定义数组

    在vue3中,定义响应式数据一般有两种方式:ref 和 reactive 一般来说,我们使用 ref 来定义基本数据类型,使用 reactive 来定义复杂数据类型 但是也可以使用 ref 来定义数组 ...

  5. Vue3中shallowReactive 与 shallowRef 的用法

    shallowReactive 与 shallowRef shallowReactive:只处理对象最外层属性的响应式(浅响应式). shallowRef:只处理基本数据类型的响应式, 不进行对象的响 ...

  6. vue3学习笔记(ref, reactive, setup, hook...)

    目录 一.搭建项目 二.常用的Composition API 1.ref函数(实现响应式) 2.reactive函数 3.vue2和vue3响应式的区别 4. setup参数 5.计算属性和监视 6. ...

  7. Vue3 的 ref 和 reactive 问题

    如果你使用过 Vue3,你知道的,在 Vue3 中有两个非常常用的响应式 API:reactive 和 ref.它们会把我们想要追踪的数据变成响应式. 而且我们在使用时一直被告知 ref 用于创建基础 ...

  8. Vue3 初探 ref、reactive 、及改变数组的值

    概况 Vue3 里要实现数据的响应式监听一共有两种方式既:ref 和 reactive 他们既有区别又有联系. ref() ref数据响应式监听.ref 函数传入一个值作为参数,一般传入基本数据类型, ...

  9. 解决 vue3的 import { ref , reactive ... } 引入繁琐问题

    在vue3中每个页面都需要引用ref,reactive不是很方便,为了方便需要安装下unplugin-auto-import插件,这样就不用每个页面都需要引用了. 1.下载安装 cnpm i unpl ...

最新文章

  1. c语言链表最高响应比优先,操作系统--最高响应比优先调度算法实验报告..doc
  2. (time.h) 自己用
  3. openkm zip 导入乱码问题解决
  4. 牛客练习赛71 F 红蓝图(kruskal重构树)
  5. ascii码为0的字符_2.4 序列之字符串
  6. FFmpegFrameRecorder保存视频or rtmp发布
  7. 基于强化学习和析取图模型的统一调度框架
  8. iOS开发——源代码管理——git(分布式版本控制和集中式版本控制对比,git和SVN对比,git常用指令,搭建GitHub远程仓库,搭建oschina远程仓库 )...
  9. 软件测试用例编号命名规则,在TD的测试用例中显示测试用例编号的方法
  10. SQL Server数据库学习(1)
  11. 推荐10个免费的html,10个免费的HTML在线编辑工具
  12. 本市医保定点专科医院、定点中医院及19家A类医疗机构
  13. lh服务器注册,登不进去的人请看这里:LH服无法登录问题官方解释
  14. 【C语言】实现简单的五子棋
  15. 家庭影院.液晶电视.液晶电视连接电脑全功略
  16. 相亲网站平台制作建设,第九篇
  17. java编程兔子问题_JAVA编程题-用java解决兔子问题
  18. 人工智能给未来教育带来深刻变革
  19. 2022年初级护师考试复习题及答案
  20. B75对应的服务器芯片组,两代主力 编辑带你看B75和H61相差多少

热门文章

  1. 测试用例 集成测试增删改查_20年高级测试人员的进阶汇总
  2. echarts怎么控制一个点沿着折线移动_计算机怎么识别图像中的直线?
  3. Codis安装与部署
  4. 怎样将1900-01-00变成-_《转生成蜘蛛又怎样》第2集预告:人类到来,蜘蛛子遭遇大危机...
  5. 开放报名 | 阿里云 Serverless 研修班走进四川大学
  6. 阿里云ECS Cloudbuild开发者大赛等你挑战!
  7. 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障
  8. python首行代码import *,from * import * 解析
  9. 上一局APP玩,你画我猜,作为灵魂画手从没服过谁
  10. 如何使用 TRACERT 解决 Windows 中的 TCP/IP 问题