在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 相关文章推荐
input链接页面、打开新网页等等的具体实现
Dec 30 Javascript
jQuery简单tab切换效果实现方法
Apr 08 Javascript
jQuery实现磁力图片跟随效果完整示例
Sep 16 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 Javascript
js实现tab切换效果
Feb 16 Javascript
BetterScroll 在移动端滚动场景的应用
Sep 18 Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 Javascript
如何在vue里添加好看的lottie动画
Aug 02 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
Aug 31 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
Dec 11 Javascript
ajax jquery实现页面某一个div的刷新效果
Mar 04 jQuery
js基于div丝滑实现贝塞尔曲线
Sep 23 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
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
图片自动更新(说明)
2006/10/02 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
详谈js的变量提升以及使用方法
2018/10/06 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
javascript实现弹幕墙效果
2019/11/28 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
Python生成随机MAC地址
2015/03/10 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python中for循环控制语句用法实例
2015/06/02 Python
python实现RSA加密(解密)算法
2016/02/17 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
询价采购方案
2014/06/09 职场文书
计算机毕业生求职信
2014/06/10 职场文书
无房证明范本
2014/09/17 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
详解TypeScript中的类型保护
2021/04/29 Javascript
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android