详解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 相关文章推荐
采用call方式实现js继承
May 20 Javascript
node.js中的fs.fchmod方法使用说明
Dec 16 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
Dec 18 Javascript
JavaScript实现N皇后问题算法谜题解答
Dec 29 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
vue升级之路之vue-router的使用教程
Aug 14 Javascript
JS中验证整数和小数的正则表达式
Oct 08 Javascript
vue 项目 iOS WKWebView 加载
Apr 17 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
Jan 07 Javascript
基于javascript处理二进制图片流过程详解
Jun 08 Javascript
如何使用vue3打造一个物料库
May 08 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
后勤人员自我鉴定
2013/10/20 职场文书
物业电工岗位职责
2013/11/20 职场文书
招聘单位介绍信
2014/01/14 职场文书
小学生开学感言
2014/02/28 职场文书
会计学专业自荐信
2014/06/25 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
地球上的星星观后感
2015/06/02 职场文书
工资证明格式模板
2015/06/12 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python
vue+iview实现手机号分段输入框
2022/03/25 Vue.js