ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## $set 由于 js 没有元编程的能力,object 是无法感知自己新增了一个属性的,所以 object 新增的属性是无法被追踪的,不是响应式的。 通过 $set ,把新增的属性变成响应式的数据 ``` Vue.prototype.$set = set ``` ``` export function set (target: Array | Object, key: any, val: any): any { ... if (Array.isArray(target) && isValidArrayIndex(key)) { target.length = Math.max(target.length, key) target.splice(key, 1, val) // 调用拦截器中的方法,从而是修改后的数组可追踪 return val } if (key in target && !(key in Object.prototype)) { target[key] = val return val } const ob = (target: any).__ob__ ... // 不是响应式数据,直接替换原来的值 if (!ob) { target[key] = val return val } // 否则是响应式数据,就需要把新增的属性变成响应式数据 defineReactive(ob.value, key, val) ob.dep.notify() return val } ```