在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 相关文章推荐
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
Jan 02 Javascript
用javascript替换URL中的参数值示例代码
Jan 27 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
Jan 23 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
Sep 07 Javascript
利用js给datalist或select动态添加option选项的方法
Jan 25 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
Aug 20 Javascript
微信小程序缓存过期时间的使用详情
May 12 Javascript
vue 检测用户上传图片宽高的方法
Feb 06 Javascript
如何基于filter实现网站整体变灰功能
Apr 17 Javascript
vue 递归组件的简单使用示例
Jan 14 Vue.js
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
一个程序下载的管理程序(三)
2006/10/09 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
python通过cython加密代码
2020/12/11 Python
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
何玥事迹观后感
2015/06/16 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
浅谈Python数学建模之数据导入
2021/06/23 Python
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技