vue系列:数据双向绑定的原理
2023-09-27 14:27:09 时间
第一阶段:认识Object.defineProperty()
vue双向绑定的底层应用的是 Object.defineProperty()
这个函数
定义
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
语法
Object.defineProperty(obj, prop, descriptor)
参数名 | 解释 |
---|---|
obj | 要在其上定义属性的对象。 |
prop | 要定义或修改的属性的名称。 |
descriptor | 将被定义或修改的属性描述符。 |
返回值: 被传递给函数的对象。
举例
let person = {}
let name = 'zy'
Object.defineProperty(person, 'name', {
get(){
console.log('name属性被读取了')
return name
},
set(newName){
console.log('name属性被修改了')
name = newName
}
})
这就意味着,person的数据对象已经是可观测的了。
第二阶段:改写函数,让所有属性可观测
/**
* 把一个对象的每一项都转化成可观测对象
* @param { Object } obj 对象
*/
function observable (obj) {
if (!obj || typeof obj !== 'object') {
return;
}
let keys = Object.keys(obj);
keys.forEach((key) =>{
defineReactive(obj,key,obj[key])
})
return obj;
}
/**
* 使一个对象转化成可观测对象
* @param { Object } obj 对象
* @param { String } key 对象的key
* @param { Any } val 对象的某个key的值
*/
function defineReactive (obj,key,val) {
Object.defineProperty(obj, key, {
get(){
console.log(`${key}属性被读取了`);
return val;
},
set(newVal){
console.log(`${key}属性被修改了`);
val = newVal;
}
})
}
// 这时,person的两个属性都可以观测了
let person = observable({
'name':'zy',
'age':20
})
第三阶段:未完待续
参考资料
https://github.com/ljianshu/Blog/issues/70
https://www.cnblogs.com/wangjiachen666/p/9883916.html
相关文章
- (尚057) Vue_源码分析_数据绑定_数据劫持准备
- vue - 选项
- vue - 路由传递参数
- 【Vue】解决Vue中Data数据相互赋值实时同步的问题(示例)
- axios基础学习——通过 Vue + axios 获取接口数据的小demo
- vue 双向数据绑定的原理
- 01Vue - Vue.js 入门(声明式渲染)
- Vue - 完美解决小数的四则运算(加减乘除)导致精度丢失问题,提供详细计算示例代码vue数据计算丢失精度
- Vue - 实现类似小程序 onShow() 一样的生命周期钩子方法(监听页面的显示,只要页面显示就执行代码)
- Vue整合HighCharts和ECharts实现数据可视化
- Vue 双向数据绑定原理分析 以及 Object.defineproperty语法
- 详解 vue 双向数据绑定的原理,并实现一组双向数据绑定
- React和Vue组件间数据传递demo
- 基于Vue+Echarts 构建可视化大数据平台【100010416】
- Vue 项目本地 Mock 数据
- vue-监听视图滚动-加载下一页数据(鼠标滚动到底,加载)
- vueX、vue中transition的使用、axios
- 模拟源码深入理解Vue数据驱动原理(1)
- vue实现数据驱动视图原理
- Vue之双向数据绑定
- JavaScript黑客是这样窃取比特币的,Vue开发者不用担心!
- Vue脚手架报错: Component name “xxx“ should always be multi-word(vue/multi-word-component-names)的解决办法
- spring boot + vue + element-ui全栈开发入门——前端列表页面开发
- Vue.js中 watch的理解以及深度监听
- vue数据代理
- vue项目启动出现cannot GET /服务错误