详解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 相关文章推荐
网页整体变灰白色(兼容各浏览器)实例
Apr 21 Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 Javascript
JS与C#编码解码
Dec 03 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
js格式化时间的方法
Dec 18 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
Mar 29 Javascript
jquery实现轮播图效果
Feb 13 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
Jul 15 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 Javascript
React实现todolist功能
Dec 28 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传输数据的代码
2007/11/13 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
测试php函数的方法
2013/11/13 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
Django--权限Permissions的例子
2019/08/28 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
大四学年自我鉴定
2013/11/13 职场文书
会计应聘求职信范文
2013/12/17 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
解决xampp安装后Apache无法启动
2022/03/21 Servers