this.$nextTick与this.$set,解决拖拽表格没有刷新问题!

一:this.$nextTick的用法

将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

原因是,Vue是异步执行DOM更新的,一旦观察到数据变化,Vue就会开启一个队列,然后把在同一个事件循环 (event loop) 当中观察到数据变化的 watcher 推送进这个队列。如果这个watcher被触发多次,只会被推送到队列一次。这种缓冲行为可以有效的去掉重复数据造成的不必要的计算和DOM操作。而在下一个事件循环时,Vue会清空队列,并进行必要的DOM更新。

在异步队列被清除,也就是下一个事件循环开始时执行更新时才会进行必要的DOM更新。如果此时你想要根据更新的 DOM 状态去做某些事情,就会出现问题。为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback) 。这样回调函数在 DOM 更新完成后就会调用。

简单来说就是你桌上有一个盒子,盒子里面装着一个苹果,我们console.log(this.盒子),会拿到苹果。但是我们给盒子一个点击事件,点击的时候,把苹果变成香蕉,此时我们去加一个console.log(this.盒子),会拿到苹果。再加一个

this.$nextTick(function () {
console.log(this.盒子)
})则会拿到香蕉。

当时我想利用这个方法,解决表格不刷新的问题,但是忽略了另外一个问题,表格的数据是层次深的数组,需要使用深拷贝转换一下,直接赋值的话,只能改变值,不能改变地址。

二:this.$set可以实现动态为data中的对象添加具有响应式效果的属性

用法:

Vue.set( target, key, value )

调用方法:this.$set( target, key, value )

//参数

target:要更改的数据源(可以是对象或者数组)

key:要更改或者新增属性的具体数据 (对象的key为键,数组的key为下标)

value :重新赋的值

官方解释:向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。

应用场景:

需要为data对象添加一个新属性时或修改某个属性的值时,却没有更新到视图上,这个时候就用$set解决

javascript 复制代码
 // 给数组层次较深的数据赋值,使用深拷贝,
//另外,使用set把tableData的索引替换成targetObject,解决刷新表格内容!
            if (resData.Data.length > 0) {
              const targetObject = JSON.parse(
                JSON.stringify(this.tableData[this.addIndex])
              );
              targetObject.SimuCadres.map(item => {
                if (item.CadreID == this.addOneCadreID) {
                  item.DisplayInformation = true;
                }
              });
              this.$set(this.tableData, this.addIndex, targetObject);
              this.$nextTick(() => {
                this.$refs.tableDataAgain[0].doLayout();
              });
            }
相关推荐
m0_748239335 分钟前
前端(Ajax)
前端·javascript·ajax
Fighting_p8 分钟前
【记录】列表自动滚动轮播功能实现
前端·javascript·vue.js
前端Hardy10 分钟前
HTML&CSS:超炫丝滑的卡片水波纹效果
前端·javascript·css·3d·html
技术思考者13 分钟前
HTML速查
前端·css·html
缺少动力的火车14 分钟前
Java前端基础—HTML
java·前端·html
Domain-zhuo27 分钟前
Git和SVN有什么区别?
前端·javascript·vue.js·git·svn·webpack·node.js
雪球不会消失了32 分钟前
SpringMVC中的拦截器
java·开发语言·前端
李云龙I43 分钟前
解锁高效布局:Tab组件最佳实践指南
前端
m0_748237051 小时前
Monorepo pnpm 模式管理多个 web 项目
大数据·前端·elasticsearch
JinSoooo1 小时前
pnpm monorepo 联调方案
前端·pnpm·monorepo