浅谈Vue的响应式原理


Posted in Javascript onMay 30, 2019

一、响应式的底层实现

1、Vue与MVVM

Vue是一个 MVVM框架,其各层的对应关系如下

  • View层:在Vue中是绑定dom对象的HTML
  • ViewModel层:在Vue中是实例的vm对象
  • Model层:在Vue中是data、computed、methods等中的数据

在 Model 层的数据变化时,View层会在ViewModel的作用下,实现自动更新

2、Vue的响应式原理

Vue响应式底层实现方法是 Object.defineProperty() 方法,该方法中存在一个getter和setter的可选项,可以对属性值的获取和设置造成影响

Vue中编写了一个wather来处理数据

在使用getter方法时,总会通知wather实例对view层渲染页面
同样的,在使用setter方法时,总会在变更值的同时,通知wather实例对view层进行更新
3、响应式原理与兼容

由于 Object.defineProperty() 方法只部分支持IE9,所以Vue兼容IE版本最低为IE9,在IE9中,Vue的核心框架、vue-router、vuex是确保可以正常使用的

4、响应式原理示意图

浅谈Vue的响应式原理

1、在实例前声明

var vm = new Vue({
data: {
name: "failte"
}
})

在实例前声明的属性会在实例时添加 getter()、setter() 方法,因此此时的name是响应式的,每当name变化时,会自动更新视图

2、在实例后添加

vm.name = "failte"

由于data中没有该属性,因此实例后,此时的name是非响应式的,name变化时,不会更新视图
若需要转换为响应式数据,需要使用 Vue.set() 方法手动添加为响应式属性

Vue.set(vm.data, "name", "ajaccio")
//Vue.$set是该方法的别名

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
简单的前端js+ajax 购物车框架(入门篇)
Oct 29 Javascript
用JavaScript修改CSS属性的代码
May 06 Javascript
JavaScript中this的使用详解
Nov 08 Javascript
Jquery validation remote 验证的缓存问题解决方法
Mar 25 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
javascript定义变量时有var和没有var的区别探讨
Jul 21 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
Oct 14 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
May 15 Javascript
JS学习笔记之原型链和利用原型实现继承详解
May 29 Javascript
vue实现固定位置显示功能
May 30 #Javascript
搭建一个Koa后端项目脚手架的方法步骤
May 30 #Javascript
JS使用cookie保存用户登录信息操作示例
May 30 #Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
May 30 #Javascript
Vue使用axios出现options请求方法
May 30 #Javascript
vue动态注册组件实例代码详解
May 30 #Javascript
实用的Vue开发技巧
May 30 #Javascript
You might like
php 页面执行时间计算代码
2008/12/04 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php-fpm中max_children的配置
2019/03/15 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
React如何避免重渲染
2018/04/10 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
自荐书封面下载
2013/11/29 职场文书
专家推荐信模板
2014/05/09 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
业务员岗位职责范本
2015/04/03 职场文书
七个非常实用的Python工具包总结
2021/06/15 Python
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
解决xampp安装后Apache无法启动
2022/03/21 Servers
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android