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

相关推荐
浩星2 小时前
react+taro打包到不同小程序
react.js·小程序·taro
小蜜蜂嗡嗡3 小时前
【flutter对屏幕底部有手势区域(如:一条横杠)导致出现重叠遮挡】
前端·javascript·flutter
伍哥的传说4 小时前
Vue 3 useModel vs defineModel:选择正确的双向绑定方案
前端·javascript·vue.js·definemodel对比·usemodel教程·vue3.4新特性·vue双向绑定
秋秋小事6 小时前
React Hooks useEffect的使用
react.js
胡gh8 小时前
页面卡成PPT?重排重绘惹的祸!依旧性能优化
前端·javascript·面试
胡gh9 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
言兴9 小时前
# 深度解析 ECharts:从零到一构建企业级数据可视化看板
前端·javascript·面试
烛阴10 小时前
TypeScript 的“读心术”:让类型在代码中“流动”起来
前端·javascript·typescript
杨荧10 小时前
基于Python的农作物病虫害防治网站 Python+Django+Vue.js
大数据·前端·vue.js·爬虫·python
silent_missile12 小时前
element-plus穿梭框transfer的调整
前端·javascript·vue.js