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)
}
相关推荐
qq. 28040339845 小时前
js 原型链分析
开发语言·javascript·ecmascript
有趣的野鸭5 小时前
JAVA课程十一次实验课程主要知识点示例
java·前端·数据库
格鸰爱童话5 小时前
next.js(二)——从react到next.js
前端·javascript·react.js
Hammer Ray8 小时前
SourceMap知识点
javascript·sourcemap
西洼工作室8 小时前
项目环境变量配置全攻略
前端
阿珊和她的猫8 小时前
Webpack 优化:构建速度与包体积的双重提升
前端·webpack·node.js
阿珊和她的猫8 小时前
Webpack 打包体积优化:让应用更轻量、更高效
前端·webpack·状态模式
im_AMBER8 小时前
Vite + React 项目启动深度踩坑指南
前端·学习·react.js·前端框架
Hammer Ray9 小时前
前端开发基础概念(React)
前端·react.js·前端框架
Sunlightʊə11 小时前
2.登录页测试用例
运维·服务器·前端·功能测试·单元测试