详解vue 数组和对象渲染问题


Posted in Javascript onSeptember 21, 2018

最近项目有点忙碌,遇到好多问题都没有总结(???),在开发过程中,取vuex中的数组渲染完成之后,再次修改数组的值,数据更新了,但是视图并没有更新。以为是数组更新的问题,后来又以为是因为vuex导致的问题. 最后强制刷新组件解决了问题,但是还没有找到根本问题的所在...

数组更新检测

  1. 在 vue 中使用数组的push()、pop()、shift()、unshift()、splice()、sort()、reverse() 、filter()、concat() 方法时,改变数组的同时可以触发视图的变化。
  2. 注意: 有两种情况 vue 无法检测到变动的数组,分别是:

(1)直接操作数组的长度;

// Vue.set
this.$set(arr, indexOfItem, newValue)
// Array.prototype.splice
this.arr.splice(indexOfItem, 1, newValue)

(2)利用索引直接设置一个项时,例如:this.arr[indexOfItem] = newValue

this.arr.splice(newLength)

demo如下:

<template>
 <div class="demo">
 <div class="list-item" v-for="item in arr[0].elements" :key="item.name">{{item.name}}</div>
 <div class="change-btn" @click="changeArr">改变列表的值</div>
 </div>
</template>

<script>
 export default {
 data() {
  return {
  index: 0,
  arr: [{
   elements: [{
   name: '0'
   }, {
   name: '1'
   }, {
   name: '2'
   }]
  }]
 
  }
 },
 methods: {
  changeArr() {
  // 可以改变数组的值
   this.arr[0].elements.push({
   name: '3'
   })
  // this.arr[0].elements[1].name = '4' 可以改变数组的值
  // this.arr[0].elements[1] = { 无法改变数组的值
  // name: '4'
  // }
  }
 }
 }
</script>

问题: 用v-for循环渲染数组数据时,数据更新了,视图却没有更新

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

1. 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue
2. 当你修改数组的长度时,例如: 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)

对象更新检测

方法一:this.$set()

方法二:Object.assign()

demo.vue

<template>
 <div class="demo">
 {{object}}
 <div class="change-btn" @click="changeArr">改变列表的值</div>
 </div>
</template>

<script>
 export default {
 data() {
  return {
  index: 0,
  object: {
   name: 'haha'
  }
  }
 },
 methods: {
  changeArr() {
  // 方法一: 
   this.$set(this.object, 'age', 27)
  // 方法二:
   this.object = Object.assign({}, this.object, {
   age: 27
   })
  // 方法三: ---不可行
   this.object.age = '27'
  }
 }
 }
 </script>

补充:

this.$forceUpdate()迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。
使用 v-if 在切换时,元素及它的绑定数据和组件都会被销毁并重建

参考文献

https://cn.vuejs.org/v2/api/#vm-forceUpdate
https://cn.vuejs.org/v2/guide/list.html?#

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

Javascript 相关文章推荐
js获取TreeView控件选中节点的Text和Value值的方法
Nov 24 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 Javascript
JS清除选择内容的方法
Jan 29 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
Mar 12 Javascript
JavaScript操作cookie类实例
Mar 31 Javascript
jQuery代码实现表格中点击相应行变色功能
May 09 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 Javascript
利用Bootstrap实现表格复选框checkbox全选
Dec 21 Javascript
用JavaScript实现让浏览器停止载入页面的方法
Jan 19 Javascript
vue.js声明式渲染和条件与循环基础知识
Jul 31 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 #Javascript
Puppeteer环境搭建的详细步骤
Sep 21 #Javascript
jQuery序列化form表单数据为JSON对象的实现方法
Sep 20 #jQuery
JavaScript 高性能数组去重的方法
Sep 20 #Javascript
vue2 设置router-view默认路径的实例
Sep 20 #Javascript
vue实现同一个页面可以有多个router-view的方法
Sep 20 #Javascript
vuejs router history 配置到iis的方法
Sep 20 #Javascript
You might like
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
2014/05/23 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
VueJS全面解析
2016/11/10 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
pandas去除重复列的实现方法
2019/01/29 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
PyQt5实现简易电子词典
2019/06/25 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
文言文形式的学生求职信
2013/12/03 职场文书
先进党支部事迹材料
2014/01/13 职场文书
导游实习生自荐书
2014/01/28 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
新手必备Python开发环境搭建教程
2021/05/28 Python
java泛型通配符详解
2021/07/25 Java/Android