Vue 3 中的 nextTick 使用详解与实战案例

简介: Vue 3 中的 nextTick 使用详解与实战案例在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。

Vue 3 中的 nextTick 使用详解与实战案例

在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。

什么是 nextTick?

在 Vue 3 中,nextTick 是一个异步函数,它会在下次 DOM 更新循环结束之后执行回调。这是因为 Vue 会将响应式数据的更新进行批处理,在当前“tick”中收集所有变化并在下一个“tick”中统一更新 DOM。nextTick 的作用就是等待这个过程结束之后再执行某段逻辑。

基本用法

Composition API 中使用

import { nextTick } from 'vue'

nextTick(() => {
  // DOM 更新完成后执行
})

Options API 中使用

this.$nextTick(() => {
  // DOM 更新完成后执行
})

实战案例一:表单校验后滚动到第一个错误项

在实际开发中,表单校验失败后,如果页面内容较多,用户往往看不到错误提示。这时,我们可以利用 nextTick 等待错误信息渲染完毕后,滚动到第一个出错的字段。

<template>
  <el-form ref="formRef" :model="form" :rules="rules">
    <el-form-item label="姓名" prop="name">
      <el-input v-model="form.name" />
    </el-form-item>
    <el-form-item label="邮箱" prop="email">
      <el-input v-model="https://www.91chuli.com/" />
    </el-form-item>
    <el-button @click="submit">提交</el-button>
  </el-form>
</template>

<script setup>
import { reactive, ref, nextTick } from 'vue'

const formRef = ref()
const form = reactive({ name: '', email: '' })
const rules = {
  name: [{ required: true, message: '请输入姓名' }],
  email: [{ required: true, message: '请输入邮箱' }]
}

function submit() {
  formRef.value.validate((valid, fields) => {
    if (!valid) {
      nextTick(() => {
        const firstError = Object.keys(fields)[0]
        const el = document.querySelector(`[prop="${firstError}"]`)
        if (el) {
          el.scrollIntoView({ behavior: 'smooth', block: 'center' })
        }
      })
    }
  })
}
</script>

实战案例二:弹窗打开后自动聚焦输入框 + 播放动画

弹窗打开时,通常需要自动聚焦第一个输入框,并希望有一个淡入动画。这同样需要 nextTick 保证 DOM 已完全渲染。

<template>
  <el-button @click="openDialog">新增记录</el-button>
  <el-dialog v-model="visible" title="表单" class="fade-dialog">
    <div ref="formBox" class="form-box" :class="{ 'animate-in': animate }">
      <el-input ref="inputRef" v-model="form.name" placeholder="请输入用户名" />
    </div>
  </el-dialog>
</template>

<script setup>
import { ref, reactive, nextTick } from 'vue'

const visible = ref(false)
const animate = ref(false)
const inputRef = ref()
const form = reactive({ name: '' })

function openDialog() {
  visible.value = true
  nextTick(() => {
    animate.value = true
    inputRef.value?.focus()
  })
}
</script>

<style scoped>
.fade-dialog .form-box {
  opacity: 0;
  transform: scale(0.9);
  transition: all 0.3s ease;
}
.fade-dialog .form-box.animate-in {
  opacity: 1;
  transform: scale(1);
}
</style>

实战案例三:ECharts 图表在弹窗中初始化

如果你在弹窗或 Tab 页中使用图表(如 ECharts),需要等容器 DOM 显示后再初始化图表,否则图表会渲染失败或大小异常。

<template>
  <el-button @click="openDialog">查看图表</el-button>
  <el-dialog v-model="visible" width="50%">
    <div ref="chartRef" style="height: 400px;"></div>
  </el-dialog>
</template>

<script setup>
import { ref, nextTick, onMounted } from 'vue'
import * as echarts from 'echarts'

const visible = ref(false)
const chartRef = ref(null)
let chartInstance = null

function openDialog() {
  visible.value = true
  nextTick(() => {
    if (!chartInstance) {
      chartInstance = echarts.init(chartRef.value)
    }
    chartInstance.setOption({
      title: { text: '访问量趋势' },
      xAxis: { type: 'category', data: ['一月', '二月', '三月'] },
      yAxis: { type: 'value' },
      series: [{ data: [120, 200, 150], type: 'bar' }]
    })
  })
}
</script>

总结

nextTick 在 Vue 3 中解决的是“响应式数据变更后,需要访问更新后的 DOM”的问题。在以下场景中尤为关键:

表单校验提示后的自动滚动;

弹窗打开后的输入框聚焦;

Tab 页切换后图表初始化;

动态组件挂载后的插件调用。

目录
相关文章
|
30天前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
243 5
|
22天前
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
25天前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
84 0
|
JavaScript 前端开发 缓存
|
2月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
241 4
|
8天前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
93 17
|
13天前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
95 21
|
11天前
|
监控 JavaScript 前端开发
Vue 文件批量下载组件封装完整使用方法及优化方案解析
本文详细介绍了批量下载功能的技术实现与组件封装方案。主要包括两种实现方式:**前端打包方案(基于file-saver和jszip)** 和 **后端打包方案**。前者通过前端直接将文件打包为ZIP下载,适合小文件场景;后者由后端生成ZIP文件流返回,适用于大文件或大量文件下载。同时,提供了可复用的Vue组件`BatchDownload`,支持进度条、失败提示等功能。此外,还扩展了下载进度监控和断点续传等高级功能,并针对跨域、性能优化及用户体验改进提出了建议。可根据实际需求选择合适方案并快速集成到项目中。
94 17
|
2月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
12天前
|
JavaScript 前端开发 UED
Vue 手风琴实现的三种常用方式及长尾关键词解析
手风琴效果是Vue开发中常见的交互组件,可节省页面空间、提升用户体验。本文介绍三种实现方式:1) 原生Vue结合数据绑定与CSS动画;2) 使用Element UI等组件库快速构建;3) 自定义指令操作DOM实现独特效果。每种方式适用于不同场景,可根据项目需求选择。示例包括产品特性页、后台菜单及FAQ展示,灵活满足多样需求。附代码示例与资源链接,助你高效实现手风琴功能。
45 10

热门文章

最新文章