解决vue数组中对象属性变化页面不渲染问题


Posted in Javascript onAugust 09, 2018

做checkbox多选功能的时候遇到了一个坑,逻辑怎么看都对,但是就是有bug,最后发现数组那里值变了页面勾选没有重新渲染。

换了关键词搜索找到了相关方法。

其实之前读文档教程的时候看到过这里,但是只有真的使用之后才会有最直接的感触。

数组更新检测

变异方法

Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下:

push()
pop()
shift()
unshift()
splice()
sort()
reverse()

你打开控制台,然后用前面例子的 items 数组调用变异方法:example1.items.push({ message: 'Baz' }) 。

替换数组

变异方法 (mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如:filter(), concat() 和 slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

example1.items = example1.items.filter(function (item) {
return item.message.match(/Foo/)
})

你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

注意事项

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如:vm.items.length = newLength

为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)

为了解决第二类问题,你可以使用 splice:

example1.items.splice(newLength)

对象更改检测注意事项

还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` 现在是响应式的
 
vm.b = 2
// `vm.b` 不是响应式的

对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如,对于:

var vm = new Vue({
data: {
userProfile: {
name: 'Anika'
}
}
})

你可以添加一个新的 age 属性到嵌套的 userProfile 对象:

Vue.set(vm.userProfile, 'age', 27)

你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:

this.$set(this.userProfile, 'age', 27)

有时你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

Object.assign(this.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})

你应该这样做:

this.userProfile = Object.assign({}, this.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})

以上这篇解决vue数组中对象属性变化页面不渲染问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
[对联广告] JS脚本类
Aug 27 Javascript
jQuery控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
Mar 31 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
js获取及修改网页背景色和字体色的方法
Dec 29 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 Javascript
浅谈js中的this问题
Aug 31 Javascript
vue项目中的webpack-dev-sever配置方法
Dec 14 Javascript
Express进阶之log4js实用入门指南
Feb 10 Javascript
jquery.pager.js分页实现详解
Jul 29 jQuery
layui表格 列自动适应大小失效的解决方法
Sep 06 Javascript
JavaScript引用类型Function实例详解
Aug 09 #Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 #jQuery
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 #Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 #Javascript
vue异步axios获取的数据渲染到页面的方法
Aug 09 #Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 #Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
Aug 09 #Javascript
You might like
《APMServ 5.1.2》使用图解
2006/10/23 PHP
PHP 加密解密内部算法
2010/04/22 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
js电话号码验证方法
2015/09/28 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
layui动态渲染生成select的option值方法
2019/09/23 Javascript
javascript History对象原理解析
2020/02/17 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
python解析中国天气网的天气数据
2014/03/21 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
详解pandas映射与数据转换
2021/01/22 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
高考备战决心书
2014/03/11 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
2014年学校工作总结
2014/11/20 职场文书
地道战观后感2000字
2015/06/04 职场文书
800字作文之大雪
2019/12/04 职场文书