详解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 相关文章推荐
JavaScript使用cookie
Feb 02 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
Apr 14 Javascript
jQuery 回车事件enter使用示例
Feb 18 Javascript
javascript进行四舍五入方法汇总
Dec 16 Javascript
bootstrap下拉菜单使用方法解析
Jan 13 Javascript
vue如何从接口请求数据
Jun 22 Javascript
jQuery实现简单的计时器功能实例分析
Aug 29 jQuery
详解原生JS动态添加和删除类
Mar 26 Javascript
vue+element+Java实现批量删除功能
Apr 08 Javascript
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
JavaScript中变量提升机制示例详解
Dec 27 Javascript
vue-cli设置publicPath小记
Apr 14 Javascript
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 url路由入门实例
2014/04/23 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
Python日期操作学习笔记
2008/10/07 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
Python有参函数使用代码实例
2020/01/06 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
西安众合通用.net笔试题
2013/03/18 面试题
群众路线党课主持词
2014/04/01 职场文书
学校宣传标语
2014/06/18 职场文书
美术社团活动总结
2014/06/27 职场文书
学校消防安全责任书
2014/07/23 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
js实现自动锁屏功能
2021/06/02 Javascript