在vue中对数组值变化的监听与重新响应渲染操作


Posted in Javascript onJuly 17, 2020

在我们项目开发过程中,实例中的数据类型可以是对象、数组等。在对象中,某个属性值发生更改时,我们可以通过对象的深度监听,以达到重新渲染页面的需求。或者查阅这篇文章

例如:

<script>
 export default {
 data(){
 return {
 objVal: {
  name: 'obj',
  type: 'obj'
 }
 }
 },
 watch:{
 objVal:{
 handler(val,oldval){
 
 },
 deep: true,
 }
 },
 methods:{
 changeObj(){
 this.objVal.name = 'newobj';
 }
 }
 }
</script>

但是,在使用同一种方式进行数组值更改监听时,这种做法是无效的。

<script>
export default {
 data() {
 return {
 arrList: [1,2,3,4,5]
 };
 },
 watch: {
 arrList: {
 handler(val, oldval) {
 
 },
 deep: true
 }
 },
 methods: {
 changeArr() {
 // 无效
 this.arrList[0] = 10;
 }
 }
};
</script>

上述用以监听数组值变化的方法是无效的,vue是不会响应数据变化而重新去渲染页面。在vue中仅需要通过修改赋值语句的方式,即可让vue响应数组数据的变化。具体操作如下:

使用方法:

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)

具体使用案例:

<script>
export default {
 data() {
 return {
 arrList: [1,2,3,4,5]
 };
 },
 methods: {
 changeArr() {
 // this.arrList[0] = 10;
 // 修改为:
 this.arrList.splice(0, 1, 10);
 }
 }
};
</script>

或:

<script>
export default {
 data() {
 return {
 arrList: [1,2,3,4,5]
 };
 },
 methods: {
 changeArr() {
 // this.arrList[0] = 10;
 // 修改为:
 this.$set(this.arrList, 0, 10);
 }
 }
};
</script>

以上两种方式,均可达到监听数组值变化的效果。

补充知识:vue数组操作不触发前端重新渲染

暂时使用给数组先赋值 [ ] ,然后重新赋值的方式解决。

此外,能够监听的数组变异方法

https://cn.vuejs.org/v2/guide/list.html#%E5%8F%98%E5%BC%82%E6%96%B9%E6%B3%95

还有就是set

Javascript 相关文章推荐
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
Javascript操纵Cookie实现购物车程序
Feb 15 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
JavaScript 核心参考教程 内置对象
Oct 13 Javascript
JavaScript之HTMLCollection接口代码
Apr 27 Javascript
Jquery 点击按钮显示和隐藏层的代码
Jul 25 Javascript
js跳转页面方法实现汇总
Feb 11 Javascript
jQuery学习笔记之toArray()
Jun 09 Javascript
BootStrap制作导航条实例代码
May 06 Javascript
js实现加载更多功能实例
Oct 27 Javascript
学习JavaScript图片预加载模块
Nov 07 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
Feb 18 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
Jul 17 #Javascript
解决vue无法侦听数组及对象属性的变化问题
Jul 17 #Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
Jul 17 #Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 #Javascript
简单了解常用的JavaScript 库
Jul 16 #Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 #jQuery
浅谈js中的attributes和Attribute的用法与区别
Jul 16 #Javascript
You might like
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
Python break语句详解
2014/03/11 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
python实现人脸识别代码
2017/11/08 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
避暑山庄导游词
2015/02/04 职场文书
台风停课通知
2015/04/24 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
python 详解turtle画爱心代码
2022/02/15 Python
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
MySQL分布式恢复进阶
2022/07/23 MySQL
HttpClient实现表单提交上传文件
2022/08/14 Java/Android