首页IT科技vue响应式原理实现(vue3 响应式对象的 api 详解)

vue响应式原理实现(vue3 响应式对象的 api 详解)

时间2025-09-19 00:44:30分类IT科技浏览5676
导读:Ⅰ. ref、reactive ( 递归监听 import {ref,reactive}...

Ⅰ. ref               、reactive ( 递归监听 )

import {ref               ,reactive} from vue; setup() { const num = ref(123); num.value = 456; const obj = reactive({num:123}); obj.value = 456; } ref 对象 在 html 模板中会 自动添加 value ( ref 对象中__v_isRef:true 进行判断的 ) ref 对象 => reactive( { value:0 } ) 底层自动转换为 reactive 最终 基本数据 类型采用 => (Object.defineProperty)                        ,引用数据 类型采用 => ( proxy 代理 )

Ⅱ. isRef                       、isReactive ( 判断 )

import {isRef        ,isReactive} from vue; setup() { const num = ref(123) console.log(isRef(num)) // => true } 用于判断是否是 Ref 和 Reactive 创建的响应对象 使用场景较少

Ⅲ. toRef 和 toRefs ( 解构 )

toRef (一个属性)

import { toRef , reactive } from vue; setup() { const obj = reactive({ width:10, height:20 }) const width = toRef(obj,width) return { width } } 将一个响应对象的属性       ,当作 响应对象 单独拿出来                。

toRefs ( 所有 )

import { toRefs , reactive } from vue; setup() { const obj = reactive({ width:10, height:20 }) const { width, height }= toRefs(obj) return { width, height } } 将多个或所有属性                       ,拿出来 且还是响应对象               , 一般在返回的时候一次性全部导出 👇 import { toRefs , reactive } from vue; setup() { const obj = reactive({ width:10, height:20 }) return { ...toRefs(obj) } }

Ⅳ. toRaw         、 markRaw ( 解除代理)

toRaw ( 不影响本身 )

import {toRaw} from vue; setup(){ const num1 = ref(123) const num2 = toRaw(num1) console.log(num2 === 123) //=>true } 不影响原数据        ,相当于拷贝当前的值 拷贝的值                       ,不在是响应式对象

markRaw ( 添加 非响应对象 属性 )

import { markRaw, reactive } from "vue"; setup(){ const obj = reactive({ num:1 }); //让数据无法被追踪 obj.noUpdate = markRaw({num:1}); function add() { obj.num++; // 页面数据 会更新 obj.noUpdate.num++; //页面数据 不会更新 } return { obj , add } } 通过 markRaw 添加的值 => 其中的属性变化               ,页面不会监听的到 用于添加搞定的参数,不会发生不会的 ( 从而节约资源 )

Ⅴ. unref ( 拷贝 )

const aaa = ref(abc); const bbb = unref(aaa); 相当于 bbb = isRef(aaa) ? aaa.value : aaa 的语法糖 可以用于拷贝

Ⅵ. shallowRef                、shallowReactive( 非递归监听 )

shallowRef                       、shallowReactive(非递归监听)

import {shallowRef                       ,shallowReactive} from vue; setup(){ const obj1 = shallowRef({a:1,b:{c:2}) const obj2 = shallowReactive({a:1,b:{c:2}) obj1.value.a = 2 //页面未更新 obj2.b.c = 3 //页面未更新 } obj1 (shallowRef)=> 只监听第一层( value 的值                       ,不监听a        、b        、c                      、d 的值) obj2 (shallowReactive)=> 只监听第一层( a               、b 的值,不监听 c 的值)

Ⅶ. triggerRef (强制更新)

import {triggerRef, shallowRef} from vue; setup(){ const obj1 = shallowRef({a:1,b:{c:2}) obj1.value.a = 2 //页面没有发生更新               ,因为只监听value第一层 triggerRef(obj1); // 强制更新 非递归监听                       ,只监听首层         ,消耗的资源小; 配合 triggerRef 强制更新 => 性能要大于 > 直接使用 (ref 和 reactive)

🚐 💨 华为社招直通车

👉 👉 华为od面试流程

🚀🚀🚀

总结不易               ,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题                       ,欢迎评论区批评指正😁
声明:本站所有文章        ,如无特殊说明或标注       ,均为本站原创发布                       。任何个人或组织                       ,在未征得本站同意时               ,禁止复制        、盗用                       、采集               、发布本站内容到任何网站、书籍等各类媒体平台        。如若本站内容侵犯了原著者的合法权益       ,可联系我们进行处理       。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
深入了解网站地图(常见问题详解,助你打造网站)