vue2如何重写数组
Vue中使用Object.defineProperty
重新将对象中的属性定义,如果是数组的话需要重写数组原型上的方法。
代码如下:
1 function notify() { 2 console.log('视图更新') 3 } 4 let data = { 5 name: 'jw', 6 age: 18, 7 arr: [1,2,3] 8 } 9 // 重写数组的方法 10 let oldProtoMehtods = Array.prototype; 11 let proto = Object.create(oldProtoMehtods); 12 ['push', 'pop', 'shift', 'unshift'].forEach(method => { 13 proto[method] = function (...args) { 14 let inserted; 15 switch (method) { 16 case 'push': 17 case 'unshift': 18 inserted = args; 19 break; 20 } 21 observerArray(inserted) 22 notify(); 23 oldProtoMehtods[method].call(this, ...args) 24 } 25 }) 26 function observerArray(obj) { // 观察数组中的每一项 27 for (let i = 0; i < obj.length; i++) { 28 observer(obj[i]); 29 } 30 } 31 function observer(obj) { 32 if(typeof obj !== 'object'){ 33 return obj 34 } 35 if (Array.isArray(obj)) { 36 obj.__proto__ = proto 37 observerArray(obj); 38 }else{ 39 for (let key in obj) { 40 defineReactive(obj, key, obj[key]); 41 } 42 } 43 } 44 function defineReactive(obj, key, value) { 45 observer(value); // 再一次循环value 46 Object.defineProperty(obj, key, { // 不支持数组 47 get() { 48 return value; 49 }, 50 set(val) { 51 notify(); 52 observer(val); 53 value = val; 54 } 55 }); 56 } 57 observer(data); 58 data.arr.push({name:'jw'}) 59 console.log(data.arr);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端