vue中的ref属性与nextTick

Vue 3 中 refnextTick 使用整理


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 更新后执行操作。

相关推荐
ziyue75752 小时前
vue修改element-ui的默认的class
前端·vue.js·ui
程序定小飞3 小时前
基于springboot的在线商城系统设计与开发
java·数据库·vue.js·spring boot·后端
BumBle4 小时前
uniapp 用css实现圆形进度条组件
前端·vue.js·uni-app
Komorebi_99994 小时前
Vue3 + TypeScript provide/inject 小白学习笔记
前端·javascript·vue.js
二十雨辰5 小时前
vite性能优化
前端·vue.js
明月与玄武5 小时前
浅谈 富文本编辑器
前端·javascript·vue.js
FuckPatience6 小时前
Vue 与.Net Core WebApi交互时路由初探
前端·javascript·vue.js
aklry7 小时前
elpis之学习总结
前端·vue.js
FuckPatience8 小时前
Vue ASP.Net Core WebApi 前后端传参
前端·javascript·vue.js
Komorebi_99999 小时前
Vue3 provide/inject 详细组件关系说明
前端·javascript·vue.js