详解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的public、private和privileged模式
Dec 28 Javascript
Extjs学习笔记之二 初识Extjs之Form
Jan 07 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 Javascript
瀑布流布局代码一例
Apr 11 Javascript
js拼接html注意问题示例探讨
Jul 14 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
Apr 12 Javascript
实现JavaScript高性能的数据存储
Dec 11 Javascript
Angularjs 实现动态添加控件功能
May 25 Javascript
js 实现复选框只能选择一项的示例代码
Jan 23 Javascript
react 实现页面代码分割、按需加载的方法
Apr 03 Javascript
详解angular如何调用HTML字符串的方法
Jun 30 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
几种显示数据的方法的比较
2006/10/09 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JS中获取数据库中的值的方法
2013/07/14 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
分享ES6的7个实用技巧
2018/01/18 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
vue实现信息管理系统
2020/05/30 Javascript
Python中关于字符串对象的一些基础知识
2015/04/08 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python使用wxPython实现计算器
2018/01/30 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
国际会计专业求职信
2014/08/04 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
Nginx进程调度问题详解
2021/09/25 Servers