在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 相关文章推荐
web性能优化之javascript性能调优
Dec 28 Javascript
jquery 取子节点及当前节点属性值
Jul 25 Javascript
JQuery $.each遍历JavaScript数组对象实例
Sep 01 Javascript
Node.js中child_process实现多进程
Feb 03 Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
Sep 05 Javascript
Javascript Function.prototype.bind详细分析
Dec 29 Javascript
bootstrap多层模态框滚动条消失的问题
Jul 21 Javascript
ES6解构赋值的功能与用途实例分析
Oct 31 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
Feb 16 Javascript
详解Vue 单文件组件的三种写法
Feb 19 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调用数据库的存贮过程!
2006/10/09 PHP
关于尾递归的使用详解
2013/05/02 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
php unlink()函数使用教程
2018/07/12 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
用jquery来定位
2007/02/20 Javascript
js 方法实现返回多个数据的代码
2009/04/30 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
详解Python中的正则表达式的用法
2015/04/09 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
骨干教师培训制度
2014/01/13 职场文书
周年庆典主持词
2014/04/02 职场文书
产品质量保证书
2014/04/29 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
班主任寄语2015
2015/02/26 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫