Vue数据绑定失效
首先,我们得明白Vue数据响应的原理:
以对象为例:当把一个JavaScript对象传给Vue实例的data选项时,Vue将遍历此对象所有的属性,并使用Object.defineProperty把这些属性全部转为getter/setter,
而getter/setter可以做到追踪依赖,在属性被访问和修改时通知变化。
那么,什么是getter/setter ?
var person = {
defaultname: 'tom',
get name() {
return this.defaultname
},
set name(val) {
this.defaultname = val
console.log("触发了set")
}
}
person.name =>"tom"
person.name = 123 =>触发了set
person.name =>123
getter/setter其实就是get、set方法,set能检测到数据的改变并进行操作。
但在有些情况下setter不能检测到数据的变化,即没有触发set。
例如:
person.name = {name: 'tom'}
=>触发了set
person.name
=>{name: "tom"}
person.name.name = 123123
=>没有打印出任何信息,说明修改name的属性值并没有触发set方法。
person.name.sex = 333
=>没有打印出任何信息,说明添加name的属性值并没有触发set方法。
delete person.name.name
=>没有打印出任何信息,说明删除name的属性值并没有触发set方法。
Object.defineProperty(person.name, 'name', {value: 4444})
=>没有打印出任何信息,说明Object.defineProperty也没有触发set方法。
追踪依赖在这种情况下并没有形成,这时数据绑定失效的根本原因。
失效场景总结:
对象
修改、添加、删除对象的属性值
数组
设值,修改长度,push、pop、shift、unshift等原生方法
------------------------------------------------------------------------
解决方案
对象
单个属性:可使用Vue.set(object, key, value)方法将响应属性添加到嵌套的对象上
多个属性:替换方法,即:创建一个新的对象赋值给原对象
如:this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
数组
Vue提供的对原生方法修改的变异方法:
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
非变异方法(替换方法):(本质上也是创建一个新的数组赋值给原数组)
如:
example1.items = example1.items.filter(function (item) {
return item.message.match(/Foo/)
})
那么这儿就有一个思考,替换方法是否低效?是否会导致dom树的重新渲染?
不用担心,大胆用!因为Vue为了使得 DOM 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。
-----------------------------------------------------------------------------------------
另外,还有一种失效的场景,即给data对象添加属性时失效,这里得声明:
初始化时才会对属性执行getter/setter转化过程,所以属性必须在data对象上存在,或者设置为某个对象的属性。
Vue数据绑定失效的更多相关文章
- Vue数据绑定
gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson04 一 双括号用来数据绑定 (1)写法一: {{message}}, ...
- 浅析vue数据绑定
前言:最近团队需要做一个分享,脚进脑子,不知如何分享.最后想着之前一直想研究一下 vue 源码,今天刚好 "借此机会" 研究一下. 网上研究vue数据绑定的文章已经非常多了,但是自 ...
- ionic 搜索双向数据绑定失效
1.用data对象存储变化的数据 js: $scope.data={}; $scope.data.keywords = ""; $scope.search = function() ...
- Vue数据绑定和响应式原理
Vue数据绑定和响应式原理 当实例化一个Vue构造函数,会执行 Vue 的 init 方法,在 init 方法中主要执行三部分内容,一是初始化环境变量,而是处理 Vue 组件数据,三是解析挂载组件.以 ...
- 17: VUE数据绑定 与 Object.defineProperty
VUE数据绑定原理:https://segmentfault.com/a/1190000006599500?utm_source=tag-newest Object.defineProperty(): ...
- Vue数据绑定(一)
Contents Vue作为当下炙手可热的前端三大框架之一,一直都想深入研究一下其内部的实现原理,去学习MVVM模式的精髓.如果说MVVM是当下最流行的图形用户界面开发模式,那么数据绑定则是这一模式的 ...
- (三)vue数据绑定及相应的命令
vue数据绑定及相应的命令 {{ Text }} 双括号进行数据渲染 动态绑定数据 例如:{{message}} data: { return{ message: 'Hello Vue!' } } 2 ...
- 「每日一题」有人上次在dy面试,面试官问我:vue数据绑定的实现原理。你说我该如何回答?
关注「松宝写代码」,精选好文,每日一题 时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 来源:原创 一.前言 文章首发在「松宝写代码」 2020. ...
- 01.vue数据绑定
Vue特点 渐进式: 渐进, 可以理解成一步一步的. 在使用Vue的时候, 我们不需要把整个Vue框架的东西都用上, 可以一步一步的根据需要慢慢的替换之前的代码. 自底向上逐层应用: 由底层开始, 把 ...
随机推荐
- java中的最重要的 集合框架
java.util这个重要的包包含大量的类和接口,支持很多的功能.例如,java.util具有能产生伪随机数的类,还包括可以管理日期和时间.观察事件.操作位集合.标记字符串.处理格式化数据等的类.ja ...
- window 发布已编译好的ASP文件到IIS
1.进入window 7的控制面板,点击程序,选择程序和功能中的 打开或关闭Windows功能.安装IIS
- coderfun-boot接私活利器,文档详实,非一般的开发速度
项目主页:https://gitee.com/klguang/coderfun-boot 演示地址:http://106.15.195.9:8080/admin/项目文档:https://www.ka ...
- java环境变量、集成开发环境与使用两个类
1.集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调试器和图形用户界面等工具.集成了代码编 ...
- flask--简记
Jinjia变量过滤器: safe 渲染值时不转义 capitalize 把值的首字母转换成大写,其他字母转换成小写 lower 把值转换成小写形式 upper 把值转换成大写形式 title 把值中 ...
- 升级PHP版本导致zabbix无法访问解决办法
故障现象:无法打开zabbix首页,提示缺少zabbix.conf配置文件 原因分析:升级yum安装php版本了,升级前卸载了原PHP5.4版本导致 解决办法: 重新安装zabbix yum inst ...
- 解决VMware Workstation虚拟机不能联网的解决办法
在windows服务中查看,以下几个服务是否正常开启,没有就开启
- ctf百度杯十二月场what_the_fuck(一口盐汽水提供的答案)
目录 漏洞利用原理 具体利用步骤 漏洞利用原理 read(, &s, 0x20uLL); if ( strstr(&s, "%p") || strstr(& ...
- HDFS集群启动start-dfs.sh报错
[root@master sbin]# start-dfs.sh Starting namenodes on [master] master: Error: JAVA_HOME is not set ...
- CSS冲突1 要关掉的css在项目内:【material-table】 中 checkbox 点击checkbox无法选中or取消,点击旁边才能选中or取消
CSS优先级: !important > 行内样式 > 内嵌样式|链接外部样式(哪个在后面哪个优先级大) id选择器 > class选择器 > 元素选择器 react中好像还不 ...