深入淺析React refs的簡介

一、是什么
Refs在計算機中稱為彈性文件系統(tǒng)(英語:Resilient File System,簡稱ReFS)
React中的Refs提供了一種方式,允許我們訪問DOM節(jié)點或在render方法中創(chuàng)建的React元素
本質為ReactDOM.render()返回的組件實例,如果是渲染組件則返回的是組件實例,如果渲染dom則返回的是具體的dom節(jié)點
二、如何使用
創(chuàng)建ref的形式有三種:
- 傳入字符串,使用時通過 this.refs.傳入的字符串的格式獲取對應的元素
- 傳入對象,對象是通過 React.createRef() 方式創(chuàng)建出來,使用時獲取到創(chuàng)建的對象中存在 current 屬性就是對應的元素
- 傳入函數,該函數會在 DOM 被掛載時進行回調,這個函數會傳入一個 元素對象,可以自己保存,使用時,直接拿到之前保存的元素對象即可
- 傳入hook,hook是通過 useRef() 方式創(chuàng)建,使用時通過生成hook對象的 current 屬性就是對應的元素
傳入字符串
只需要在對應元素或組件中ref屬性
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return <div ref="myref" />;
}
}
訪問當前節(jié)點的方式如下:
this.refs.myref.innerHTML = "hello";
傳入對象
refs通過React.createRef()創(chuàng)建,然后將ref屬性添加到React元素中,如下:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return <div ref={this.myRef} />;
}
}
當ref被傳遞給render中的元素時,對該節(jié)點的引用可以在ref的current屬性中訪問
const node = this.myRef.current;
傳入函數
當ref傳入為一個函數的時候,在渲染過程中,回調函數參數會傳入一個元素對象,然后通過實例將對象進行保存
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return <div ref={element => this.myref = element} />;
}
}
獲取ref對象只需要通過先前存儲的對象即可
const node = this.myref
傳入hook
通過useRef創(chuàng)建一個ref,整體使用方式與React.createRef一致
function App(props) {
const myref = useRef()
return (
<>
<div ref={myref}></div>
</>
)
}
獲取ref屬性也是通過hook對象的current屬性
const node = myref.current;
上述三種情況都是ref屬性用于原生HTML元素上,如果ref設置的組件為一個類組件的時候,ref對象接收到的是組件的掛載實例
注意的是,不能在函數組件上使用ref屬性,因為他們并沒有實例
三、應用場景
在某些情況下,我們會通過使用refs來更新組件,但這種方式并不推薦,更多情況我們是通過props與state的方式進行去重新渲染子元素
過多使用refs,會使組件的實例或者是DOM結構暴露,違反組件封裝的原則
例如,避免在Dialog組件里暴露open()和close()方法,最好傳遞isOpen屬性
但下面的場景使用refs非常有用:
- 對Dom元素的焦點控制、內容選擇、控制
- 對Dom元素的內容設置及媒體播放
- 對Dom元素的操作和對組件實例的操作
- 集成第三方 DOM 庫
到此這篇關于React refs 的理解的文章就介紹到這了,更多相關React refs 的理解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
React router cache route實現(xiàn)緩存頁面流程介紹
react-router自身沒有路由緩存的特性,在5.x版本之前,我們可以基于react-router-cache-route來實現(xiàn)路由緩存功能。但是react-router 6.x在實現(xiàn)上做了比較大的變化,react-router-cache-route沒有提供相應的支持2023-01-01
React教程之Props驗證的具體用法(Props Validation)
這篇文章主要介紹了React教程之Props驗證的具體用法(Props Validation),非常具有實用價值,需要的朋友可以參考下2017-09-09
React-router中結合webpack實現(xiàn)按需加載實例
本篇文章主要介紹了React-router中結合webpack實現(xiàn)按需加載實例,非常具有實用價值,需要的朋友可以參考下2017-05-05
Taro?React自定義TabBar使用useContext解決底部選中異常
這篇文章主要為大家介紹了Taro?React底部自定義TabBar使用React?useContext解決底部選中異常(需要點兩次才能選中的問題)示例詳解,有需要的朋友可以借鑒參考下2023-08-08
react性能優(yōu)化useMemo與useCallback使用對比詳解
這篇文章主要為大家介紹了react性能優(yōu)化useMemo與useCallback使用對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

