vue数组中对象属性变化页面不渲染问题

问题引入

Vue之所以能够监听Model状态的变化,是因为JavaScript语言本身提供了Proxy或者Object.observe()机制来监听对象状态的变化。但是,对于数组元素的赋值,却没有办法直接监听。

因此,如果我们直接对数组元素赋值

<ul><li v-for="(item,index) in arrInfo">{{item.name}}--{{item.age}}</li>
</ul>
data(){return {arrInfo:[{'name':'zuobaiquan','age':22},{'name':'zhangsan','age':20}]}
},
// created(){
//   this.arrInfo[0]={'name':'zuobaiquan01','age':22}
// },
mounted(){this.arrInfo[0]={'name':'zuobaiquan02','age':22}
}

在mounted阶段,直接对数组元素 arrInfo 赋值会导致Vue无法更新View

说明:在 created 视图未渲染时 直接对数组元素 arrInfo 赋值 data里面的初值会改变的。

此时在mounted阶段,简单的做法是不要对数组元素赋值,而是更新

mounted(){this.arrInfo[0]={'name':'zuobaiquan02','age':22}//正确做法//this.arrInfo[0].name='zuobaiquan02'//this.arrInfo[0].age=23
}

另一种做法:通过splice()方法,删除某个元素后,再添加一个元素,达到“赋值”的效果:

//正确做法二 通过splice()方法,删除某个元素后,再添加一个元素,达到“赋值”的效果:
var newArrItem={'name':'zuobaiquan02','age':24}
this.arrInfo.splice(0, 1, newArrItem); 

源码地址:https://github.com/zuobaiquan/vue/blob/master/vueExercise/vue-test/src/views/vue-set/index01.vue

针对此问题 vue还提供了另外一种方法 set   https://cn.vuejs.org/v2/api/#vm-set

调用方法:Vue.set( target, key, value )

target:要更改的数据源(可以是对象或者数组)

key:要更改的具体数据

value :重新赋的值

 

此时 应该这样处理

//正确做法三 利用vue内置属性 set
var newArrItem={'name':'zuobaiquan02','age':24}
this.$set(this.arrInfo,0,newArrItem)

 

 

数组更新检测

变异方法

Vue 包含一组监听数组的变异方法,所以它们也将会触发视图更新。这些方法有 push、pop、shift、unshift、splice、sort、reverse

替换数组

变异方法 (mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如:filter()concat() 和 slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

example1.items = example1.items.filter(function (item) {return item.message.match(/Foo/)
})

你可能认为这将导致 vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

整理:变异方法:push、pop、shift、unshift、splice、sort、reverse

非变异方法:filter、 concat、 slice

总结

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

第一类问题:当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue

第二类问题:当你修改数组的长度时,例如: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)

对象更改检测注意事项

还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

var vm = new Vue({data: {a: 1}
})
// `vm.a` 现在是响应式的
 
vm.b = 2
// `vm.b` 不是响应式的

对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如,对于:

var vm = new Vue({data: {userProfile: {name: 'Anika'}}
})

你可以添加一个新的 age 属性到嵌套的 userProfile 对象:

Vue.set(vm.userProfile, 'age', 27)

你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:

this.$set(this.userProfile, 'age', 27)

有时你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

Object.assign(this.userProfile, {age: 27,favoriteColor: 'Vue Green'
})

你应该这样做:

this.userProfile = Object.assign({}, this.userProfile, {age: 27,favoriteColor: 'Vue Green'
})

 参考原文:https://www.cnblogs.com/thinkingthigh/p/7789108.html

转载于:https://www.cnblogs.com/zuobaiquan01/p/9034516.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webservice生成客户端的方法

2011-11-09 20:33 webservice生成客户端的方法 目前为止webservice生成客户端方法比较多&#xff0c;我本身使用的主要有三种方式&#xff1a; &#xff08;1&#xff09;使用eclipse自带。 file->new->other->web services->web service client PS:这种方式生成的…

使用Hibernate(JPA)一键式删除

在旧版本的Hibernate中&#xff0c;我可以看到手册中指示的一键式删除 。 但是较新的版本不再包含此部分。 我不知道为什么。 因此&#xff0c;在这篇文章中&#xff0c;我来看看它是否仍然有效。 一键式删除部分显示&#xff1a; 有时一个接一个地删除收集元素可能效率极低。…

UDP和TCP

TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输&#xff0c;它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说&#xff0c;它…

MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice

MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice 6人收藏此文章, 我要收藏 发表于1个月前(2013-06-06 09:41) , 已有116次阅读 &#xff0c;共0个评论 首先鄙视一下自己&#xff0c;还在用myeclipse,竟然还是6.0版本&#xff0c;没办法&#xff0c;用习惯了&#xff0c…

Eclipse中要导出jar包中引用了第三方jar包怎么办

Eclipse中要导出jar包中引用了第三方jar包怎么办 (2009-07-20 15:28:44) 转载▼标签&#xff1a; it 分类&#xff1a; Eclipse 今天做个小的java程序&#xff0c;想要先将其导出成一个可执行的jar包&#xff01;向往常一样&#xff0c;单击菜单栏中的 File -> export,弹出…

枚举类型定义

enum orientation:byte { north 1, south 2, east 3, west4 } 注意&#xff1a;声明在代码的主体之外 转载于:https://www.cnblogs.com/judes/p/9042426.html

拖动滑块拼图背景图没显示_计划B? 那是计划N…没什么。 拼图于2015年问世

拖动滑块拼图背景图没显示真是一天 当典型的欧洲人逐渐破产时&#xff0c;美国的人们开始喝咖啡。 这就是为什么我在Mark Reinhold最近的新闻中睡个好觉的原因。 他在题为“ Project Jigsaw&#xff1a;火车晚点 ”的帖子中建议将Project Jigsaw推迟到下一个版本Java 9。 在最近…

vi 常用命令行

vi 常用命令行 vi 常用命令行 1.vi 模式   a) 一般模式&#xff1a; vi 处理文件时&#xff0c;一进入该文件&#xff0c;就是一般模式了.   b) 编辑模式&#xff1a;在一般模式下可以进行删除&#xff0c;复制&#xff0c;粘贴等操作&#xff0c;却无法进行编辑操作。等…

java keytool证书工具使用小结

Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥&#xff08;key&#xff09;和证书&#xff08;certificates&#xff09;存在一个称为keystore的文件中在keystore里&#xff0c;包含两种数据:密钥实体&#xff08;Key entity&#xff09;-密钥&#xff08;secret key&a…

在Kafka中发布订阅模型

这是第四个柱中的一系列关于同步客户端集成与异步系统&#xff08; 1&#xff0c; 2&#xff0c; 3 &#xff09;。 在这里&#xff0c;我们将尝试了解Kafka的工作方式&#xff0c;以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 &#xff1a; Kafka是一种分布式的&…

深入理解C++中的mutable关键字

2006-12-16 05:00 来源&#xff1a;BLOG 作者&#xff1a;寒星轩 责任编辑&#xff1a;方舟yesky 评论(32)推荐&#xff1a;经典教程专区mutalbe的中文意思是“可变的&#xff0c;易变的”&#xff0c;跟constant&#xff08;既C中的const&#xff09;是反义词。在C中&…

my.ini优化mysql数据库性能的十个参数(推荐)

(1)、max_connections&#xff1a;允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加&#xff0c;否则&#xff0c;你将经常看到 too many connections 错误。 默认数值是100&#xff0c;我把它改为1024 。(2)、record_buffer&#xff1a;每…

sizeof(string)

2012-07-14 00:38:54| 分类&#xff1a; C | 标签&#xff1a; |字号大中小 订阅 今天看《程序员面试宝典》一书&#xff08;为了应付将要到来的微软笔试&#xff09;&#xff0c;看到了sizeof(string)这个问题。在Dev C上测试的结果是4&#xff0c;很不明白。上网搜了一下…

实现userdetails_Spring Security使用Hibernate实现自定义UserDetails

实现userdetails大多数时候&#xff0c;我们将要在Web应用程序中配置我们自己的安全访问角色。 这在Spring Security中很容易实现。 在本文中&#xff0c;我们将看到最简单的方法。 首先&#xff0c;我们将在数据库中需要以下表格&#xff1a; CREATE TABLE IF NOT EXISTS myd…

C++类内存结构布局

分类&#xff1a;C 2011-01-16 09:40 阅读(379)评论(0)编辑删除 一、没有虚函数&#xff0c;没有继承的类内存结构&#xff1a;1.如下定义一个类&#xff1a;class A{public:void seta(int x) {a x;}; void setb(int x) {b x;};int sum() {return ab;};private:int a;int b;…

使用Boxfuse为您的REST API设置https

在我的上 一篇 文章中&#xff0c;我展示了在Boxfuse的帮助下&#xff0c;基于Spring Boot框架建立REST API并在AWS上运行非常容易 。 下一步是利用SSL与API进行通信。 通过使用SSL&#xff0c;我们确保在REST API服务器和API客户端之间的传输过程中保存了数据 。 要为Spring B…

Python类与对象实验

一、任务描述 本实验任务主要对Python类与对象进行一些基本操作&#xff0c;通过完成本实验任务&#xff0c;要求学生熟练掌握Python类与对象的关系&#xff0c;并对Python类与对象的基本操作进行整理并填写工作任务报告。 二、任务目标 1、掌握Python类的创建 2、掌握类对象 三…

c++类的内存布局

by andydeng • 2011 年 4 月 3 日 • C • 1 Comment 本文基本上是对于Stanley B.Lippman的Inside The C Object Model一书第一章第三章的概括,描述了c类的内存布局情况. c的类的内存布局有如下规则: 1. Nonstatic data member 存放在Class Object中; 2. Static data membe…

matlab 五点三次平滑算法

(2012-04-23 21:01:31) 转载▼标签&#xff1a; 杂谈 分类&#xff1a; matlab http://www.ilovematlab.cn/thread-71818-1-1.html 这里提供一个函数mean5_3(五点三次平滑算法)对数据进行平滑处理&#xff1a; load V1.mat subplot 211; plot(V1); ylim([2000 7000]); grid; y…

spring配置xml文件_XML配置文件中的Spring配置文件

spring配置xml文件我的上一个博客非常简单&#xff0c;因为它涵盖了我从Spring 3.0.x到Spring 3.1.x的轻松升级&#xff0c;最后我提到可以将Spring模式升级到3.1&#xff0c;以利用Spring的最新功能。 在今天的博客中&#xff0c;我将介绍这些功能中最酷的功能之一&#xff1a…