Vue 和 React 使用ref的示例詳解
ref 用于訪問(wèn) DOM 元素或子組件實(shí)例
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>
在 Vue 中,ref 是一個(gè)響應(yīng)式對(duì)象,修改 ref 的值會(huì)觸發(fā)組件的重新渲染。因?yàn)?Vue 的 ref 是基于其響應(yīng)式系統(tǒng)實(shí)現(xiàn)的,任何對(duì) ref 的修改都會(huì)被 Vue 檢測(cè)到,并觸發(fā)組件的更新。
React 函數(shù)組件通過(guò)useRef Hook 來(lái)實(shí)現(xiàn):
useRef 不僅可以用于訪問(wèn) DOM 元素,還可以存儲(chǔ)任何可變值
import { useEffect, useRef } from "react" const Hanshi = () => { const inp = useRef(null) useEffect(()=>{ inp.current.focus() },[]) return <> <div> <h3>函數(shù)組件</h3> <input type="text" ref={inp}/> </div> </> } export default Hanshi
useRef(null) 創(chuàng)建了一個(gè) ref 對(duì)象,并將其初始值設(shè)置為 null
將 inp 綁定到 <input> 的 ref 屬性上,這樣 inp.current 就會(huì)指向該 DOM 元素
在 useEffect 中,通過(guò) inp.current 訪問(wèn) DOM 元素并調(diào)用 focus() 方法
存儲(chǔ)任何可變值:與 useState 不同,修改 useRef 的值不會(huì)觸發(fā)組件的重新渲染
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>函數(shù)組件</h3> <input type="text" ref={inp}/> </div> </> } export default Hanshi
函數(shù)組件中轉(zhuǎn)發(fā) ref(forwardRef): forwardRef 允許父組件訪問(wèn)子組件中的 DOM 元素或組件實(shí)例
使用 forwardRef 將 ref 從父組件傳遞到子組件
父組件通過(guò) inpt 訪問(wèn)子組件中的 <input> 元素
useImperativeHandle 自定義子組件暴露給父組件的 ref 值
useImperativeHandle 允許子組件自定義暴露給父組件的 ref 值
父組件可以通過(guò) inpt.current 調(diào)用子組件暴露的方法(如 focus 和 getValue)
React 類組件 createRef
1. 通過(guò)createRef創(chuàng)建一個(gè)ref對(duì)象
2. 給元素綁定ref屬性值 為創(chuàng)建的ref對(duì)象
3. 通過(guò)ref對(duì)象的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> } }
類子組件
父組件通過(guò) ref 訪問(wèn)子組件的實(shí)例,并調(diào)用子組件的方法(如 focus)
這種方式僅適用于類組件,函數(shù)組件沒(méi)有實(shí)例
函數(shù)式子組件 forwardRef
到此這篇關(guān)于Vue 和 React 使用ref的文章就介紹到這了,更多相關(guān)Vue 和 React 使用ref內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ElementUI之表格toggleRowSelection選中踩坑記錄
這篇文章主要介紹了ElementUI之表格toggleRowSelection選中踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03使用mint-ui實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)效果的示例代碼
下面小編就為大家分享一篇使用mint-ui實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)效果的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02vue-router history模式服務(wù)器端配置過(guò)程記錄
vue路由有hash和history兩種模式,這篇文章主要給大家介紹了關(guān)于vue-router history模式服務(wù)器端配置的相關(guān)資料,需要的朋友可以參考下2021-06-06Vue3+Antd實(shí)現(xiàn)彈框顯示內(nèi)容并加入復(fù)制按鈕
這篇文章主要介紹了Vue3+Antd實(shí)現(xiàn)彈框顯示內(nèi)容并加入復(fù)制按鈕,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12Vue?Router路由hash模式與history模式詳細(xì)介紹
Vue?Router是Vue.js官方的路由管理器。它和Vue.js的核心深度集成,讓構(gòu)建單頁(yè)面應(yīng)用變得易如反掌。路由實(shí)際上就是可以理解為指向,就是我在頁(yè)面上點(diǎn)擊一個(gè)按鈕需要跳轉(zhuǎn)到對(duì)應(yīng)的頁(yè)面,這就是路由跳轉(zhuǎn)2022-08-08vue element-ui中table合計(jì)指定列求和實(shí)例
這篇文章主要介紹了vue element-ui中table合計(jì)指定列求和實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11vue3中使用router路由實(shí)現(xiàn)跳轉(zhuǎn)傳參的方法
這篇文章主要介紹了vue3中使用router路由實(shí)現(xiàn)跳轉(zhuǎn)傳參的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03vue項(xiàng)目預(yù)覽excel表格功能(file-viewer插件)
這篇文章主要介紹了vue項(xiàng)目預(yù)覽excel表格功能(file-viewer插件),本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10