在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 相关文章推荐
jQuery JSON的解析方式分享
Apr 05 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
Apr 16 Javascript
jquery索引在使用中的一些困惑
Oct 24 Javascript
node.js实现爬虫教程
Aug 25 Javascript
jquery插件格式实例分析
Jun 16 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
JavaScript基础进阶之数组方法总结(推荐)
Sep 04 Javascript
详解Node 定时器
Feb 26 Javascript
vue axios登录请求拦截器
Apr 02 Javascript
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
vue data恢复初始化数据的实现方法
Oct 31 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
typescript配置alias的详细步骤
2020/08/12 Javascript
python不带重复的全排列代码
2013/08/13 Python
python回调函数用法实例分析
2015/05/09 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
python实现超市商品销售管理系统
2019/11/22 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
优秀英语专业毕业生求职信
2013/11/23 职场文书
10的分与合教学反思
2014/04/30 职场文书
项目合作协议书
2014/09/23 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
房贷工资证明范本
2015/06/12 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书