在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 相关文章推荐
JavaScript中的Document文档对象
Jan 16 Javascript
效率高的Javscript字符串替换函数的benchmark
Aug 02 Javascript
JavaScript中number转换成string介绍
Dec 31 Javascript
JavaScript中的类与实例实现方法
Jan 23 Javascript
BOM系列第二篇之定时器requestAnimationFrame
Aug 17 Javascript
简单实现js进度条加载效果
Mar 25 Javascript
JS中call和apply函数用法实例分析
Jun 20 Javascript
原生js实现trigger方法示例代码
May 22 Javascript
JavaScript中的连续赋值问题实例分析
Jul 12 Javascript
JS实现盒子拖拽效果
Feb 06 Javascript
OpenLayers3实现鼠标移动显示坐标
Sep 25 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 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
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
python集合用法实例分析
2015/05/30 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
Python中属性和描述符的正确使用
2016/08/23 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
同程旅游英文网站:LY.com
2018/11/13 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
技能竞赛活动方案
2014/02/21 职场文书
协议书怎么写
2014/04/21 职场文书
垃圾桶标语
2014/06/24 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
一个都不能少观后感
2015/06/04 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript