解决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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
javascript 动态生成私有变量访问器
Dec 06 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
Aug 13 Javascript
用js实现trim()的解决办法
Apr 16 Javascript
JS实现Enter键跳转及控件获得焦点
Aug 12 Javascript
jquery $("#variable") 循环改变variable的值示例
Feb 23 Javascript
jquery判断当前浏览器的实现代码
Nov 07 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
Jun 14 Javascript
使用react-router4.0实现重定向和404功能的方法
Aug 28 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
Apr 19 jQuery
vue组件之间的数据传递方法详解
Apr 19 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
May 10 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
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
javascript 播放器 控制
2007/01/22 Javascript
javascript StringBuilder类实现
2008/12/22 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
jquery获取节点名称
2015/04/26 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
python实现八大排序算法(2)
2017/09/14 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
python实现在线翻译功能
2020/03/03 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
python能开发游戏吗
2020/06/11 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
英国办公用品商店:Office Outlet
2018/04/04 全球购物
城市规划应届生推荐信
2014/09/08 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
文明单位创建材料
2014/12/24 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
工作简历的自我评价
2019/05/16 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书