标签:function Vue return render value 剖析 响应 key data
Vue响应式原理代码
const data = { name: 'mushan', age: 18, shan: { name: '木杉', age: 18, obj: {} }, arr: [1, 2, 3] } const arrayProto = Array.prototype; const arrayMethods = Object.create(arrayProto); ['push', 'pop', 'shift', 'unshift' ,'sort', 'splice', 'reverse'].forEach(method => { arrayMethods[method] = function () { arrayProto[method].call(this, ...arguments); render(); } }) function defineReactive (data, key, value) { observer(value); Object.defineProperty(data, key, { get () { return value; }, set (newVal) { if(value === newVal) { return; } value = newVal; render(); } }) } function observer (data) { if(Array.isArray(data)) { data.__proto__ = arrayMethods; return; } if(typeof data === 'object') { for(let key in data) { defineReactive(data, key, data[key]) } } } function render () { console.log('页面渲染啦'); } function $set (data, key, value) { if(Array.isArray(data)) { data.splice(key, 1, value); return value; } defineReactive(data, key, value); render(); return value; } function $delete(data, key) { if(Array.isArray(data)) { data.splice(key, 1); return; } delete data[key]; render(); } observer(data);
利用vue2中Object.defineProperty实现响应式的劣势
- 天生就需要进行递归
- 监听不到数组不存在的索引的改变
- 监听不到数组长度的改变
- 监听不到对象的增删
标签:function,Vue,return,render,value,剖析,响应,key,data 来源: https://www.cnblogs.com/mushanya/p/15498629.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。