Vue中对象或数组的数据更新视图不更新的问题解决

news/2024/7/24 7:01:59 标签: vue.js, javascript, 前端

我们知道在vue中,数据的绑定都不用我们操心,例如在data中有一个 msg 的变量,你修改它,那么在页面上,msg 的内容就会自动发生变化。但是如果对于一个复杂的对象,例如一个对象数组,你直接去给数组上某一个元素增加属性,或者直接把数组的 length 变成0,vue就无法知道发生了改变。

一、对象不响应

Vue 无法检测 property 的添加或移除。由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,所以 property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的。

//原始数据
data: {
    list:[
        {
            name:'张三',
            age:18
        },
        {
            name:'李四',
            age:19
        }
    ]
}

//增加性别属性
change() {
    this.list[1].sex = '男';
},

//清空数组
clear() {
    this.list.length = 0;
}

上面的写法没有效果,是因为没有按照vue的规范去写,因为vue文档里面写了,对于深层的,最好用$set方法,这样vue就可以知道发生了变化,同时vue也不建议直接修改length,可以给一个空数组来置空。

1、this.$set方法

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

//增加性别属性
change() {
    this.$set(this.list[1],'sex','男')
},

//清空数组
clear() {
    this.list=[];
}
2、$forceUpdate方法

可是如果我们不想利用 $set 去设置,非要按照我们第一种方式去写,可以实现么?

答案是可以的,就是利用 $forceUpdate 了,

因为你修改了数据,但是页面层没有变动,说明数据本身是被修改了,但是vue没有监听到而已,用$forceUpdate就相当于按照最新数据给渲染一下。

//增加性别属性
change() {
    this.list[1].sex = '男';
    this.$forceUpdate();
},

//清空数组
clear() {
    this.list.length = 0;
    this.$forceUpdate();
}
二、数组不响应

Vue 不能检测以下数组的变动:

  • 当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
  • 当你修改数组的长度时,例如:vm.items.length = newLength
//原始数据
data: {
    items: ['a', 'b', 'c']
}

//跟新数组值
change() {
    this.items[1] = 'd';
},

//更改数组长度
updata() {
    this.items.length = 2;
}

以上方法不会触发数据响应式,视图不更新。

//原始数据
data: {
    items: ['a', 'b', 'c']
}

//跟新数组值
change() {
   this.$set(this.list,1,'d')
   或
   this.list.splice(1,'d');
},

//更改数组长度
updata() {
    this.list.splice(2);
}

上面的方法都都可以实现,同时也将在响应式系统内触发状态更新。

三、$nextTick 和 $forceUpdate的区别

this.$nextTick() 将回调延迟到下次 DOM 更新循环之后执行,在修改数据之后立即使用它, 然后等待 DOM 更新。

this.$forceUpdate() 迫使Vue实例重新(rander)渲染虚拟DOM,注意并不是重新加载组件。

结合vue的生命周期,调用$forceUpdate后只会触发beforeUpdate和updated这两个钩子函数,

不会触发其他的钩子函数。它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。


http://www.niftyadmin.cn/n/5175726.html

相关文章

linux查看当前目录大小及磁盘大小

1、查看当前目录大小 du -sh ./*-h:以K,M,G为单位,提高信息的可读性 -s:仅显示总计 ./*:列出当前目录下的子项 2、查看磁盘大小 df -h还可以加个路径,仅查看当前目录所在的磁盘。例如&#x…

阿里云centos7.9乱码问题

1.vim输入中文乱码 在/etc/vimrc最下面输入以下代码 set fileencodingsutf-8,gb2312,gbk,gb18030 set termencodingutf-8 set fileformatsunix set encodingprc 2.vim复制的时候如果有#号,下面的代码开头都会有#号 在编辑模式输入:set paste 再进行粘贴即可 3…

零代码Prompt应用大赛正式开始!飞桨星河社区五周年活动第一站

五周年盛典将至!抢发第一站! 在大模型时代,飞桨星河社区致力于让人人都成为大模型开发者!飞桨星河社区零代码应用开发工具链,帮助大家轻松实现灵感落地、场景化需求落地,助力每个人实现工作与生活的效能提…

北大联合智源提出训练框架LLaMA-Rider

大语言模型因其强大而通用的语言生成、理解能力,展现出了成为通用智能体的潜力。与此同时,在开放式的环境中探索、学习则是通用智能体的重要能力之一。因此,大语言模型如何适配开放世界是一个重要的研究问题。 北京大学和北京智源人工智能研究…

flask框架报错解决方法

1、报错 jinja2.exceptions.TemplateNotFound 解决方法:报错jinja2.exceptions.TemplateNotFound,template没找到,由于我之前直接将.html文件和.py文件直接放在同一目录下,经了解,需要新增一个 templates目录&#xff…

电脑图标太小,看不清楚如何调大呢?

作为使用最为频繁的办公工具 - 电脑,在使用的时候是要安装软件的,从而生成快捷方式,快速启动应用程序,因此图标的大小对使用都会有很大的影响,那么电脑该如何调整图标的大小,其实是很简单的。跟随小编的步骤…

SystemC 学习之 VCS 仿真工具安装(八)

1、安装包下载 vcs、verdi 等工具下载地址(如果下载链接失效,可以私信我) 链接:https://pan.baidu.com/s/19CtwqWcxpv-4wPyAD4_ITw 提取码:3pib vcs-mx 下载地址 链接:https://pan.baidu.com/s/1dYELrG…

VINS-Mono-后端优化 (四:边缘化原理)

滑窗中固定只能有11帧,当来了新的帧的时候旧的帧就需要抹掉,但是不能直接把旧的帧的全部信息抹掉,因为旧的帧的经历过11次优化,其地图点中的优化信息是有用,边缘化的操作就是为了只把最旧帧的变量去掉,但是…