首页 > 其他分享 >Vue中的异步更新和 $nextTick

Vue中的异步更新和 $nextTick

时间:2023-11-11 21:45:39浏览次数:36  
标签:nextTick 异步 Vue DOM 更新 文本框 操作

场景引入

需求:当用户点击编辑按钮后,显示一个弹窗,该弹窗有一个文本框,使得文本框自动聚焦
看似代码如下:

this.isShowEdit = true; // 显示输入框
this.$refs.inp.focus(); // 获取焦点

代码看似没有问题,显示文本框后,让文本框聚焦,但是在vue中却不能实现,这是由于vue是异步更新Dom的

this.$nextTick 是 Vue 提供的一个方法,用于在下次 DOM 更新循环结束之后执行回调函数。在 Vue 中,数据变化后,DOM 并不会立即更新,而是等待下一个事件循环(Event Loop)中执行。

使用 $nextTick 有以下几个常见的场景:

1.在数据变化后立即操作 DOM: 当你修改了数据,然后想要立即基于更新后的 DOM 进行一些操作时,可以使用 $nextTick:

methods: {
  updateData() {
    this.data = newData; // 修改数据
    this.$nextTick(() => {
      // DOM 已经更新,可以操作更新后的 DOM
      // ...
    });
  }
}

2.在 mounted 生命周期钩子中操作 DOM: 在 mounted 钩子中,组件已经挂载到 DOM 上,但此时 DOM 还未更新。如果你需要在 DOM 更新后执行操作,也可以使用 $nextTick:

mounted() {
  this.$nextTick(() => {
    // DOM 已经更新,可以操作更新后的 DOM
    // ...
  });
}

3.在 watch 监听器中操作 DOM: 当使用 watch 监听数据变化时,如果需要在 DOM 更新后执行操作,同样可以使用 $nextTick:

watch: {
  data: function(newValue, oldValue) {
    this.$nextTick(() => {
      // DOM 已经更新,可以操作更新后的 DOM
      // ...
    });
  }
}

使用 $nextTick 有助于确保你在操作 DOM 时,DOM 已经更新完成,避免了在同一事件循环中可能导致的问题。

标签:nextTick,异步,Vue,DOM,更新,文本框,操作
From: https://www.cnblogs.com/zgf123/p/17826406.html

相关文章

  • vue2.0,把vform666、workFlow开源组件集成到vue-admin-template框架上心得体会
    以上三个都是vue2版本的开源项目,有的已经有vue3版本了,我把他们集成到一起,是出于练习的目的,也是消磨时间。vue-admin-template是一个很基础简洁的后台管理系统框架;vform666是可以用作表单低代码开发的组件项目;workFlow是模仿钉钉的工作流的组件项目,这三个项目在gitee上都能搜索到,......
  • Vue中的ref和$refs
    ref和$refs作用:利用ref和$refs可以用于获取dom元素,或组件实例特点:查找范围->当前组件内(更精确稳定)注意:在操作ref获取dom元素时,最快也得是mounted时期获取,也就是页面渲染之后使用步骤:目标标签-添加ref属性<divref="chartRef">我是div标签</div>通过this.$re......
  • Vue2中的父子通信
    父子通信流程图:父组件通过props将数据传递给子组件子组件利用$emit通知父组件修改更新父组件传递子组件注意点但是需要注意的是,通过props传递的数据是只读状态的,也就是说,我们不能去修改这个值。注意:props是只读的,如果直接对props中的数据进行修改,Vue就会发出警告。如果......
  • vue 项目改为微应用后,原本的项目地址打不开为什么?
    当将Vue项目改为微应用之后,需要进行一些配置才能正常运行。首先,确保微应用项目的依赖中已经添加了qiankun,并在主应用的main.js中进行了相关配置。可以参考qiankun官方文档来配置主应用。在进行部署时,需要注意以下几点:跨域配置:微应用可能会存在跨域请求的问题。在部署时,需确保主应用......
  • 记录--啊?Vue是有三种路由模式的?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助众所周知,vue路由模式常见的有history和hash模式,但其实还有一种方式-abstract模式(了解一哈~)别急,本文我们将重点逐步了解:路由+几种路由模式+使用场景+思考+freestyle路由概念路由的本质就是一种对......
  • 11 11 vue3代码优化
     使用axios发送异步请求是这种格式,现在异步请求都封装到api中。说法如下:接口调用的js代码一般都会封装到js文件中,并一函数的形式暴露给外部,例如: 这张图片包括了没有参数和有参数的两种情况 然后在组件中的script中调用函数就行,但这样不行,好像跟什么同步异步有关,反正这样......
  • vue2 vue.min.js和vue-cli-service build --target lib 构建的.min.js的压缩原理,使用
    1vue-cli-service --targetlibhttps://github.com/vuejs/vue-cli/blob/f0f254e4bc81ed322eeb9f7de346e987e845068e/packages/%40vue/cli-service/lib/commands/build/index.js#L5可以看到这里formats:'commonjs,umd,umd-min',默认有三种格式,其中的umd-min经过了压缩再去搜u......
  • requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级
    以下代码执行后,console输出的信息是?for(leti=0;i<5;i++){requestAnimationFrame(()=>console.log(i));}01234requestAnimationFrame虽然是异步函数,但是由于i是用let定义的,每一次都会生成一个块级作用域,来把当前值和requestAnimationFrame放在这个作用域中......
  • vue里面数据
    <template><div><BaseCountItem></BaseCountItem><br><BaseCountItem></BaseCountItem><br><BaseCountItem></BaseCountItem></div></template><script>importBaseCo......
  • vue完成记事本小功能(没有css样式)
    app.vue<template><divclass=""><SchuRuKuang@Add="handleAdd"></SchuRuKuang><LieBiaoZhanShi:list="list"@delOne="handledelOne"></LieBiaoZhanShi><TongjiQingKo......