Vue 和 React 使用ref

ref 用于访问 DOM 元素或子组件实例

Vue2:

复制代码
<template>
  <div>
    <input ref="inp" />
  </div>
</template>

<script>
export default {
  mounted() {
    this.$refs.inp.focus()
  }
}
</script>

Vue3 组合式API中使用ref

复制代码
<template>
  <div>
    <input ref="inp" />
  </div>
</template>

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const inp = ref(null)

    onMounted(() => {
      inp.value.focus()
    })

    return {
      inp
    }
  }
}
</script>

<template>
  <div>
    <input ref="inp" />
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
   
const inp = ref(null)

onMounted(() => {
   inp.value.focus()
})


</script>

在 Vue 中,ref 是一个响应式对象 ,修改 ref 的值会触发组件的重新渲染。因为 Vue 的 ref 是基于其响应式系统实现的,任何对 ref 的修改都会被 Vue 检测到,并触发组件的更新。

React 函数组件通过useRef Hook 来实现:

useRef 不仅可以用于访问 DOM 元素,还可以存储任何可变值

复制代码
import { useEffect, useRef } from "react"

const Hanshi = () => {
    const inp = useRef(null)
   
    useEffect(()=>{
        inp.current.focus()
    },[])
    return <>
        <div>
            <h3>函数组件</h3>
            <input type="text" ref={inp}/>
        </div>
    </>
 }
 export default Hanshi

useRef(null) 创建了一个 ref 对象,并将其初始值设置为 null

将 inp 绑定到 <input> 的 ref 属性上,这样inp.current就会指向该 DOM 元素

在 useEffect 中,通过 inp.current 访问 DOM 元素并调用 focus() 方法

存储任何可变值: 与 useState 不同,修改 useRef 的值不会触发组件的重新渲染

复制代码
import { useEffect, useRef } from "react"

const Hanshi = () => {
    const inp = useRef()
    const num = useRef(0)
   
    useEffect(()=>{
        inp.current.focus()
        num.current += 1
        console.log(`组件渲染了 ${num.current} 次`)
    },[])
    return <>
        <div>
            <h3>函数组件</h3>
            <input type="text" ref={inp}/>
        </div>
    </>
 }
 export default Hanshi

**函数组件中转发 ref(forwardRef):**forwardRef 允许父组件访问子组件中的 DOM 元素或组件实例

使用 forwardRef 将 ref 从父组件传递到子组件

父组件通过 inpt 访问子组件中的 <input> 元素

useImperativeHandle自定义子组件暴露给父组件的 ref 值

useImperativeHandle 允许子组件自定义暴露给父组件的 ref 值

父组件可以通过 inpt.current 调用子组件暴露的方法(如 focus 和 getValue)

React 类组件createRef

  1. 通过createRef创建一个ref对象

  2. 给元素绑定ref属性值 为创建的ref对象

  3. 通过ref对象的current获取元素,再获取它的值

    import { Component,createRef } from "react";

    export default class Detail extends Component{

    复制代码
     inp = createRef()
     getInp(){
    
      console.log(this.inp.current.value)
     }
     componentDidMount(){
         this.inp.current.focus()
     }
     render() {
         return <div>
             <h3>类组件</h3>
             <input type="text" ref={this.inp}/>
             <button onClick={this.getInp.bind(this)}>获取值按钮</button>
         </div>
     }

    }

类子组件

父组件通过 ref 访问子组件的实例,并调用子组件的方法(如 focus)

这种方式仅适用于类组件,函数组件没有实例

函数式子组件 forwardRef

相关推荐
某公司摸鱼前端7 分钟前
uniapp socket 封装 (可拿去直接用)
前端·javascript·websocket·uni-app
要加油哦~9 分钟前
vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用
前端·javascript·vue.js
小林学习编程14 分钟前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
wen's2 小时前
React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案
javascript·react native·react.js
vvilkim2 小时前
Electron 自动更新机制详解:实现无缝应用升级
前端·javascript·electron
vvilkim3 小时前
Electron 应用中的内容安全策略 (CSP) 全面指南
前端·javascript·electron
aha-凯心3 小时前
vben 之 axios 封装
前端·javascript·学习
漫谈网络3 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
失落的多巴胺4 小时前
使用deepseek制作“喝什么奶茶”随机抽签小网页
javascript·css·css3·html5
DataGear4 小时前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化