在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 相关文章推荐
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
跟我学习javascript的执行上下文
Nov 18 Javascript
不想让浏览器运行javascript脚本的方法
Nov 20 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
Sep 26 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
Oct 25 Javascript
浅谈Postman解决token传参的问题
Mar 31 Javascript
解决vue 引入子组件报错的问题
Sep 06 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
vue更改数组中的值实例代码详解
Feb 07 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
Apr 26 Javascript
vue3中provide && inject的使用
Jul 01 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
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
python刷投票的脚本实现代码
2014/11/08 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
python实现简单颜色识别程序
2020/02/19 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
Python 多进程、多线程效率对比
2020/11/19 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
国贸专业个人求职信分享
2013/12/04 职场文书
前处理班长职位说明书
2014/03/01 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
服务承诺书格式
2014/05/21 职场文书
婚前财产协议书范本
2014/10/19 职场文书
质量整改通知单
2015/04/21 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书