Vue.set源码
2021/12/14 12:16:51
本文主要是介绍Vue.set源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 先判断如果是数组,并且下标合法,就直接使用重写过的 splice 替换
- 如果是对象,并且 key 存在于 target 里,说明是对已有属性进行set,就替换值就行了
- 如果没有 ob,说明不是一个响应式对象,直接赋值返回,不进行响应式操作
- 是一个响应式对象,再把新属性变成响应式,并派发更新
export function set (target: Array<any> | Object, key: any, val: any): any { if (process.env.NODE_ENV !== 'production' && (isUndef(target) || isPrimitive(target)) ) { warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`) } // 如果是数组 而且 是合法的下标 if (Array.isArray(target) && isValidArrayIndex(key)) { target.length = Math.max(target.length, key) // 直接使用 splice 就替换,注意这里的 splice 不是原生的,所以才可以监测到,具体看下面 target.splice(key, 1, val) return val } // 到这说明是对象 // 如果 key 存在于 target 里,就直接赋值,也是可以监测到的 if (key in target && !(key in Object.prototype)) { target[key] = val return val } // 获取 target.__ob__ const ob = (target: any).__ob__ if (target._isVue || (ob && ob.vmCount)) { process.env.NODE_ENV !== 'production' && warn( 'Avoid adding reactive properties to a Vue instance or its root $data ' + 'at runtime - declare it upfront in the data option.' ) return val } // 在 Observer 里介绍过,如果没有这个属性,就说明不是一个响应式对象 if (!ob) { target[key] = val return val } // 然后把新添加的属性变成响应式 defineReactive(ob.value, key, val) // 手动派发更新 ob.dep.notify() return val }
这篇关于Vue.set源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16Vue3资料:新手入门必读教程
- 2024-11-16Vue3资料:新手入门全面指南
- 2024-11-16Vue资料:新手入门完全指南
- 2024-11-16Vue项目实战:新手入门指南
- 2024-11-16React Hooks之useEffect案例详解
- 2024-11-16useRef案例详解:React中的useRef使用教程
- 2024-11-16React Hooks之useState案例详解
- 2024-11-16Vue入门指南:从零开始搭建第一个Vue项目
- 2024-11-16Vue3学习:新手入门教程与实践指南
- 2024-11-16Vue3学习:从入门到初级实战教程