vue中的ref属性与nextTick

Vue 3 中 ref 与 nextTick 使用整理


ref 的两种使用方式

1. ref() 用于创建响应式数据

csharp 复制代码
 jsCopyEditimport { ref } from 'vue'
 ​
 const count = ref(0)
 count.value++ // 注意使用 .value

2. ref="xxx" 用于获取 DOM 或组件实例引用

xml 复制代码
 vueCopyEdit<template>
   <input ref="inputRef" />
 </template>
 ​
 <script setup>
 import { ref, onMounted } from 'vue'
 ​
 const inputRef = ref(null)
 ​
 onMounted(() => {
   inputRef.value.focus() // 获取 DOM 节点并调用方法
 })
 </script>

ref="inputRef" 绑定到 DOM 或子组件,配合 <script setup> 中的 ref(null) 一起使用。


组合式 API 中访问子组件的方法

使用 ref + defineExpose

子组件
xml 复制代码
 vueCopyEdit<script setup>
 const sayHello = () => console.log("Hello")
 defineExpose({ sayHello })
 </script>
父组件
xml 复制代码
 vueCopyEdit<Child ref="childRef" />
 <button @click="childRef?.sayHello()">调用子组件</button>
 ​
 <script setup>
 import { ref } from 'vue'
 import Child from './Child.vue'
 ​
 const childRef = ref(null)
 </script>

nextTick() 的作用和使用

作用:

等待 DOM 更新完成后 再执行某段逻辑。

常用场景:

  • 等待 v-if 切换 DOM 后获取或操作 DOM
  • 等待响应式数据更新完成后做副作用
  • 设置 input.focus() 等

使用方式

javascript 复制代码
 import { nextTick } from 'vue'
 ​
 nextTick(() => {
   // 此处 DOM 已更新
   console.log('DOM updated')
 })

或:

csharp 复制代码
const edit = async () => {
  isShow.value = false
  await nextTick()
  inputRef.value?.focus()
}

🧪 示例:点击按钮显示输入框并自动聚焦

xml 复制代码
 vueCopyEdit<template>
   <div v-if="isShow">
     {{ msg }}
     <button @click="edit">编辑</button>
   </div>
   <div v-else>
     <input ref="inputRef" />
     <button @click="end">完成</button>
   </div>
 </template>
 ​
 <script setup>
 import { ref, nextTick } from 'vue'
 ​
 const isShow = ref(true)
 const msg = ref("hello")
 const inputRef = ref(null)
 ​
 const edit = async () => {
   isShow.value = false
   await nextTick()
   inputRef.value?.focus()
 }
 ​
 const end = () => {
   isShow.value = true
 }
 </script>

总结:

ref="xxx" 用于获取 DOM/组件,nextTick() 用于等待 DOM 更新后执行操作。

相关推荐
用户9177533718751 小时前
从零封装一个地图组件库:OpenLayers + Vue 的工程化实践
vue.js
雪芽蓝域zzs2 小时前
第7节:多选模式、自定义选项渲染、受控弹窗显隐
vue.js·elementui
acd120094 小时前
前端随笔:数据明明变了,Vue 页面就是不更新
前端·javascript·vue.js
vx_Biye_Design4 小时前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
vx_Biye_Design4 小时前
springboot宠物寄养服务预约与监管系统82684-计算机课程设计、毕业设计
java·vue.js·spring boot·elasticsearch·课程设计·express·宠物
vx_Biye_Design4 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
vx_Biye_Design5 小时前
expressDeepSeek社团咨询助手的学生社团管理系统60746-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·课程设计·express
vx_Biye_Design5 小时前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
vx_Biye_Design5 小时前
django就业信息推荐系统61953-计算机课程设计、毕业设计
java·vue.js·spring boot·python·架构·django·课程设计
羲云6 小时前
给 Vue 页面加个 Markdown 编辑器:ME.js 的接入、图片粘贴与音视频
javascript·vue.js