nextTick的使用

vue 复制代码
<el-tree
	ref="treeRef"
    style="max-width: 600px"
    :data="permissionsData"
    show-checkbox
    node-key="id"
    :default-expanded-keys="[2]"
    :default-checked-keys="defaultCheckedKeys"
    :props="{ children: 'children', label: 'label'}"
 />

【业务逻辑】:点击 table 操作栏中的编辑按钮,出现编辑权限的弹框

js 复制代码
const treeRef = ref()
const formData = reactive({
  id: '',
  name: '',
  permissions: ''
})
const dialogVisible = ref(false)
// 打开弹框,编辑权限
const editMenu = ({ id, name, permission }) => {      
  dialogVisible.value = true
  Object.assign(formData, { id, name, permission })
  treeRef.value.setCheckedKeys(permission)
}

运行的时候,报错:

因为 js 是单线程运作的,如果采用同步更新的策略,对属性值的每一次修改,都可能会触发虚拟 DOM 的计算和真实 DOM 的渲染,非常影响性能。所以 vue 引入了异步更新,会将要更新的副作用(虚拟 DOM diff、patch)放到一个队列中,等当前调用栈清空且 DOM 渲染完毕之后,再执行 nextTick 的回调。
dialogVisible.value = true 只是改了数据,此时 Vue 还没将 <el-dialog> 的真实 DOM 渲染出来, treeRef.value 也就为 undefined,导致出现上述报错。

因此,修改 formData 和获取 treeRef.value 的操作需要放到下次一 DOM 渲染完成之后执行:

js 复制代码
const editMenu = async ({ id, name, permission }) => {      
  dialogVisible.value = true
  await nextTick()		// 将下面的操作延迟到本轮DOM批量更新之后执行
  Object.assign(formData, { id, name, permission })
  treeRef.value.setCheckedKeys(permission)
}
相关推荐
风骏时光牛马9 分钟前
大模型底层架构与推理流程AI源码深度剖析
前端
程序员Sunday9 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
Setsuna_F_Seiei9 小时前
前端转型 Agent 开发 06 之 Agent Memory 记忆系统(让 Agent 更智能,更懂你)
前端·agent·ai编程
志尊宝10 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
zhangzeyuaaa10 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
默_笙10 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
优选资讯11 小时前
标签打印软件怎么对接 Excel 数据
前端·excel
思无邪6611 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
一个风轻云淡12 小时前
GCC 和 GDB命令简单解读
java·linux·前端
u01110267512 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式