vue的响应式都用它来实现,js中强大的Object.defineProperty()方法
2023-09-11 14:22:30 时间
今天vue项目做完,部署到了nginx中,闲暇时间,回看项目,对vue的响应式的实现产生了好奇,于是看了vue的源码和一些大牛们对vue源码的解读,大致初略的了解了vue响应式的是实现原理
1.Vue中修改数据,Vue内部是如何监听message数据的变化的
- Object.defineProperty() -> 监听对象属性的改变
2.当数据发生改变,Vue是如何知道要通知哪些数据,界面发生刷新
- 发布订阅模式
响应式原理:
点击按钮,修改person对象中age属性的改变,触发了defineProperty()中的set()方法,从而把html页面修改了
<body>
<button id="btn">111</button>
<p id="output">24</p>
</body>
var person={name: "xiaojiayu", age: 24,gender: "man"}
var output=document.getElementById('output')
document.getElementById("btn").onclick=function(){
person.age=30
}
Object.keys(person).forEach(key =>{
let value = person[key]
Object.defineProperty(person,key,{
set(newValue){ //每当为person.xxx="xxx" 设置新值时,都会调用
console.log('监听到'+ key + '的改变,新的值为'+newValue)
//此处可以监听到person.xxx属性改变时候的新值
//那么此时谁正在使用该属性的值,我们就可以告诉它,此时需要改变为新值了
//如何知道页面中谁在用person.xxx的值?解析html代码,获取到哪些人有用这个属性值
output.innerHTML=newValue
value=newValue
},
get(){ //每当使用person.xxx的时候,都会调用该函数
console.log('有人来获取'+key+'对应的值了')
return value
}
})
})
有关Object.defineProperty()的详细用法,个人推荐这篇博客
https://www.jb51.net/article/143455.htm
相关文章
- JS框架_(JQuery.js)高德地图api
- VUE - vue.runtime.esm.js?6e6d:619 [Vue warn]: Do not use built-in or reserved HTML elements as component i
- vue.config.js常用配置详解
- [Nuxt] Setup a "Hello World" Server-Rendered Vue.js Application with the Vue-CLI and Nuxt
- vue.js3: js下载图片的两种方式:url和canvas(vue@3.2.37)
- vue.js 3.2.22:菜单每行依次滑动出现的动画
- vue.js 3.0.5:用vue-i18n开发i18n国际化功能(vue-i18n@9.2.0)
- [Node.js] Mock an API for Local Development in React with Mirage JS
- vue.js 3.2.22:菜单每行依次滑动出现的动画
- vue事件修饰符:@click.capture捕获内层事件,从而改变默认的冒泡执行顺序
- 一个典型的Vue应用的App.vue
- Atitit 常用技能点体系树 os win linux android 前后端 gui h5 vue js jquery bootstrap cocos2d Jafavx wpf
- vue获取当前路由
- 常用网络js链接大全(jQuery(3.4.1)、bootstrap、vue、ECharts、easyUI、React、maven、Mybatis、Spring、SpringMVC、Redis)
- 前端实操案例丨如何实现JS向Vue传值
- Vue+Element UI
- vue中父子组件值的传递
- 218:vue+openlayers 加载geotiff文件,显示图形
- 204:vue+openlayers 学习Attribution各种API,示例展示自定义版权信息
- 202:vue+openlayers: easing的API及在view.animation中使用示例
- 023:vue+openlayers加载本地KML文件 (代码示例)
- Vue.js 计算属性
- Vue.js起步