解决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 相关文章推荐
做网页的一些技巧
Feb 01 Javascript
对xmlHttp对象的理解
Jan 17 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
Jul 12 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
Aug 30 Javascript
Javascript基础教程之数据类型 (数值 Number)
Jan 18 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
Mar 03 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
Jun 13 Javascript
详解jQuery插件开发方式
Nov 22 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
Feb 24 Javascript
Vue.js组件实现选项卡以及切换特效
Jul 24 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 29 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作的文本留言本的例子(二)
2006/10/09 PHP
透析PHP的配置文件php.ini
2006/10/09 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
php读取csc文件并输出
2015/05/21 PHP
学习YUI.Ext 第七天--关于View&JSONView
2007/03/10 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
js中replace的用法总结
2013/12/27 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
js实现抽奖功能
2020/11/24 Javascript
Python 的 with 语句详解
2014/06/13 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
详解Python:面向对象编程
2019/04/10 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
python之语音识别speech模块
2020/09/09 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
四风问题查摆材料
2014/08/25 职场文书
公司合作协议范文
2014/10/01 职场文书
小学体育组工作总结
2015/08/13 职场文书
医德医风学习心得体会
2016/01/25 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python