摘要:通常在組件的構(gòu)造函數(shù)內(nèi)創(chuàng)建,使其在整個(gè)組件中可用。例如純文本查看復(fù)制代碼如上所示一個(gè)實(shí)例在構(gòu)造函數(shù)中創(chuàng)建,并賦值給在方法內(nèi)部,將構(gòu)造函數(shù)中創(chuàng)建的傳遞給接下來(lái),讓我們看一個(gè)在組件中使用的示例。回調(diào)回調(diào)是在中使用的另一種方式。
使用 React 時(shí),我們的默認(rèn)思維方式應(yīng)該是 不會(huì)強(qiáng)制修改 DOM ,而是通過(guò)傳入 props 重新渲染組件。但是,有些情況卻無(wú)法避免修改 DOM 。
React 中的 Refs 提供了一種訪(fǎng)問(wèn) render() 方法中創(chuàng)建的 React 元素(或 DOM 節(jié)點(diǎn))的方法。
當(dāng)父組件需要與子組件交互時(shí),我們通常使用 props 來(lái)傳遞相關(guān)信息。 但是,在某些情況下,我們可能需要修改子項(xiàng),而不用新的props 重新呈現(xiàn) (re-rendering) 它。 這時(shí)候就需要 refs 出場(chǎng)了。
我什么時(shí)候應(yīng)該使用 Refs ?
我們建議在以下情況下使用 refs:
與第三方 DOM 庫(kù)集成
觸發(fā)命令式動(dòng)畫(huà)
管理焦點(diǎn),文本選擇或媒體播放
譯注:第三點(diǎn)是否也可以理解為使用 event 對(duì)象呢?在 React 中就是合成事件(SyntheticEvent)。
官方文檔中提到:避免使用 refs 來(lái)做任何可以通過(guò)聲明式實(shí)現(xiàn)來(lái)完成的事情。
所以一旦我們確定我們真的應(yīng)該使用 refs,我們需要如何使用它們呢?
在 React 中使用 Refs
您可以通過(guò)多種方式使用 refs :
React.createRef()
回調(diào)引用 (Callback refs)
String refs(已過(guò)時(shí))
轉(zhuǎn)發(fā) refs (Forwarding refs)
接下來(lái),讓我們看看每一種實(shí)現(xiàn)方式:
React.createRef()
可以使用該 React.createRef() 函數(shù)創(chuàng)建 Refs ,并通過(guò)該 ref 屬性附加到 React 組件中的 HTML 元素。
通常在組件的構(gòu)造函數(shù)內(nèi)創(chuàng)建 ref ,使其在整個(gè)組件中可用。例如:
[JavaScript] 純文本查看 復(fù)制代碼
?
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.firstRef = React.createRef();
}
render() {
return
接下來(lái),讓我們看一個(gè)在 React 組件中使用 refs 的示例。
使用 Refs 聚焦輸入
這是另一個(gè)例子:
[JavaScript] 純文本查看 復(fù)制代碼
?
// Ref.jsclass CustomTextInput extends React.Component {
constructor(props) {
super(props);
// create a ref to store the textInput DOM element
this.textInput = React.createRef();
this.focusTextInput = this.focusTextInput.bind(this);
}
focusTextInput() {
// Explicitly focus the text input using the raw DOM API
// Note: we"re accessing "current" to get the DOM node
this.textInput.current.focus();
}
render() {
// tell React that we want to associate the ref
// with the textInput that we created in the constructor
return (
注意,當(dāng) ref 屬性被一個(gè) HTML 元素使用時(shí)(比如當(dāng)前示例中的 input 元素),在 constructor 中使用 React.createRef() 創(chuàng)建的 ref 會(huì)接收來(lái)自底層 DOM 元素的 current 值。
譯注:這里的 current 應(yīng)該是 合成事件(SyntheticEvent)
這意味著訪(fǎng)問(wèn) DOM 值,我們需要寫(xiě)這樣的東西:
[JavaScript] 純文本查看 復(fù)制代碼
?
1
this.textInput.current;
第二個(gè)元素是一個(gè)按鈕,點(diǎn)擊它之后會(huì)自動(dòng)聚焦到第一個(gè)輸入框上面。我們?yōu)?onClick 屬性設(shè)置了 this.focusTextInput 函數(shù)。
[JavaScript] 純文本查看 復(fù)制代碼
?
type="button"
value="Focus the text input"
onClick={this.focusTextInput}/>
函數(shù) focusTextInput() 使用了 JavaScript 構(gòu)建 DOM 的標(biāo)準(zhǔn)函數(shù)。 .focus() 方法會(huì)將光標(biāo)聚焦于文本輸入框上。
[JavaScript] 純文本查看 復(fù)制代碼
?
focusTextInput() {
this.textInput.current.focus();}
最后,focusTextInput 函數(shù)綁定在這樣的 constructor 方法中的:
[JavaScript] 純文本查看 復(fù)制代碼
?
this.focusTextInput = this.focusTextInput.bind(this);
從 ref 中獲取值
在這個(gè)例子中,我們將看到如何為 input 輸入框設(shè)置 ref 屬性,并通過(guò) ref 來(lái)獲取值。示例如下:
在這個(gè)例子中,我們創(chuàng)建了一個(gè) input 輸入框來(lái)輸入值。然后,當(dāng)單擊提交按鈕時(shí),我們將讀取此值,并在控制臺(tái)打印。
[JavaScript] 純文本查看 復(fù)制代碼
?
// Ref.jsclass CustomTextInput extends React.Component {
constructor(props) {
super(props);
// create a ref to store the textInput DOM element
this.textInput = React.createRef();
}
handleSubmit = e => {
e.preventDefault();
console.log(this.textInput.current.value);
};
render() {
// tell React that we want to associate the ref
// with the textInput that we created in the constructor
return (
handleSubmit = e => {
e.preventDefault();
console.log(this.textInput);};
上面,參數(shù) e 包含事件對(duì)象。我們使用e.preventDefault() 來(lái)告訴瀏覽器我們正在處理被點(diǎn)擊的提交按鈕,我們不希望這個(gè)事件“冒泡”(意思就是說(shuō),阻止瀏覽器的默認(rèn)行為)。
譯注:這里可以看一下 React 對(duì)于事件的處理:在 React 中另一個(gè)不同點(diǎn)是你不能通過(guò)返回 false 的方式阻止默認(rèn)行為。你必須顯式的使用 preventDefault
在上面示例中,我們打印了 this.textInput ,在控制臺(tái)可以看到一個(gè) ref 對(duì)象。
[JavaScript] 純文本查看 復(fù)制代碼
?
1
Object {current: HTMLInputElement}
請(qǐng)注意,它有一個(gè) current屬性,即 HTMLInputElement 。這是 input DOM 元素本身,而不是實(shí)際值。 我們必須使用 this.textInput.current.value 來(lái)獲取 input 標(biāo)簽的實(shí)際值:
[JavaScript] 純文本查看 復(fù)制代碼
?
handleSubmit = e => {
e.preventDefault();
console.log(this.textInput.current.value);};
使用 refs 是一種從表單中直接提取值的方式:只需要給 input 標(biāo)簽設(shè)置 ref ,并在你需要的時(shí)候?qū)⒅堤崛〕鰜?lái)。
Refs 回調(diào)
Refs 回調(diào) 是在 React 中使用 ref 的另一種方式。要以這種方式使用 ref,我們需要為 ref 屬性設(shè)置回調(diào)函數(shù)。當(dāng)我們?cè)O(shè)置 ref 時(shí),React 會(huì)調(diào)用這個(gè)函數(shù),并將 element 作為第一個(gè)參數(shù)傳遞給它。
這是另一個(gè)例子的代碼。像上面的示例一樣,此代碼獲取 input 標(biāo)簽的文本值,但在這里我們使用回調(diào)引用:
[JavaScript] 純文本查看 復(fù)制代碼
?
// Refs.jsclass CustomTextInput extends React.Component {
constructor(props) {
super(props);
this.textInput = null;
this.setTextInputRef = element => {
this.textInput = element;
};
}
handleSubmit = e => {
e.preventDefault();
console.log(this.textInput.value);
};
render() {
return (
然后,我們可以在組建上得到這樣的值:this.refs.textInput.value - 但是,再次聲明,這不應(yīng)該在新代碼中使用,因?yàn)檫@個(gè) API 將被棄用。
轉(zhuǎn)發(fā) Refs (Forwarding Refs)
Ref forwarding 是一種將 ref 通過(guò)組件傳遞給其子節(jié)點(diǎn)的技術(shù)。它對(duì)于可復(fù)用組件庫(kù)和高階組件(HOC)等情況非常有用。
您可以使用 React.forwardRef 函數(shù)將 ref 轉(zhuǎn)發(fā)到組件。我們來(lái)看下面的例子:
[JavaScript] 純文本查看 復(fù)制代碼
?
// Ref.jsconst TextInput = React.forwardRef((props, ref) => (
));const inputRef = React.createRef();class CustomTextInput extends React.Component {
handleSubmit = e => {
e.preventDefault();
console.log(inputRef.current.value);
};
render() {
return (
然后,我們將 ref 通過(guò)為組件
接下來(lái),我們將此 ref 參數(shù)轉(zhuǎn)發(fā)給 。現(xiàn)在可以在外層組件通過(guò) inputRef.current 訪(fǎng)問(wèn)DOM節(jié)點(diǎn)的值了。
轉(zhuǎn)發(fā) refs 和高階組件
最后,讓我們看一下使用 refs 的另一個(gè)例子,但這次是使用高階組件(HOC)。
在上面的示例應(yīng)用程序中,會(huì)將所有 input 標(biāo)簽中輸入的值在控制臺(tái)打印。這里已經(jīng)為 input 標(biāo)簽設(shè)置了 ref 屬性,接下來(lái),讓我們看一下需要如何在高階組件中傳遞 / 轉(zhuǎn)發(fā) ref 。
[JavaScript] 純文本查看 復(fù)制代碼
?
const Input = InputComponent => {
const forwardRef = (props, ref) => {
const onType = () => console.log(ref.current.value);
return
};
return React.forwardRef(forwardRef);};
這里有一個(gè)名為 Input 的高階組件 ,它接受 InputComponent 作為參數(shù)。當(dāng)用戶(hù)輸入的時(shí)候,他還會(huì)將 ref 的值在控制臺(tái)打印。
在 Input 高階組件內(nèi),forwardRef 函數(shù)會(huì)返回 InputComponent。forwardRef 函數(shù)中所包含的 ref 參數(shù),是由 React.forwardRef 函數(shù)創(chuàng)建的。 高階組件最終會(huì)將包裝好的組件作為值返回。
接下來(lái),我們創(chuàng)建一個(gè)組件,將 input 作為子組件包含進(jìn)來(lái)。
[JavaScript] 純文本查看 復(fù)制代碼
?
const TextInput = ({ forwardedRef, children, ...rest }) => (
const InputField = Input(TextInput);class CustomTextInput extends Component {
render() {
const inputRef = React.createRef();
return
}}
最后,將 TextInput 傳入 Input 高階組件,會(huì)返回一個(gè) InputField component。
創(chuàng)建一個(gè) ref ,并作為參數(shù)傳遞給 InputField 組件。
結(jié)論
與通過(guò) props 和 state 不同,Refs 是一種將數(shù)據(jù)傳遞給特定子實(shí)例的好方法。
你必須要小心,因?yàn)?refs 操縱實(shí)際的 DOM,而不是虛擬的 DOM,這與 React 思維方式相矛盾。因此,雖然 refs 不應(yīng)該是通過(guò)應(yīng)用程序流動(dòng)數(shù)據(jù)的默認(rèn)方法,但是當(dāng)您需要時(shí),它們是可以從 DOM 元素讀取數(shù)據(jù)的好方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/53972.html
摘要:指定讀取當(dāng)前的。它為其后代元素觸發(fā)額外的檢查和警告。嚴(yán)格模式檢查僅在開(kāi)發(fā)模式下運(yùn)行它們不會(huì)影響生產(chǎn)構(gòu)建。作用識(shí)別不安全的生命周期關(guān)于使用過(guò)時(shí)字符串的警告關(guān)于使用廢棄的方法的警告檢測(cè)意外的副作用檢測(cè)過(guò)時(shí)的為高階組件。 react 進(jìn)階 懶加載 React.lazy函數(shù)能讓你像渲染常規(guī)組件一樣處理動(dòng)態(tài)引入(的組件)。Suspense加載指示器為組件做優(yōu)雅降級(jí)。fallback屬性接受任何在...
摘要:綁定屬性調(diào)用的時(shí)候使用調(diào)用子組件方法這是一個(gè)很神奇的方法,它可以調(diào)用子組件的方法以及屬性。建立組件建立子組件,并在子組件實(shí)現(xiàn)一個(gè)方法,如,這個(gè)方法實(shí)現(xiàn)變更當(dāng)前組件上面的文本,提供這樣一個(gè)測(cè)試用例。輸入框獲取焦點(diǎn)完整實(shí)例點(diǎn)我輸入框獲取焦點(diǎn) React 支持一種非常特殊的屬性 Ref ,你可以用來(lái)綁定到 render() 輸出的任何組件上。 ref : 綁定屬性 refs : 調(diào)用的時(shí)候...
摘要:顧名思義,受控組件的值由控制,能為與用戶(hù)交互的元素提供值,而不受控制的元素不獲取值屬性。另外我發(fā)現(xiàn)受控組件更容易理解和于使用。只是一種把組件作為參數(shù)的函數(shù),并且與沒(méi)有包裝器的組件相比,能夠返回具有擴(kuò)展功能的新組件。其中三個(gè)基本的是,和。 翻譯:瘋狂的技術(shù)宅原文:https://www.toptal.com/react/... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)...
摘要:基礎(chǔ)創(chuàng)建虛擬參數(shù)元素名稱(chēng),例如參數(shù)屬性集合,例如,,,從參數(shù)開(kāi)始,表示該元素的子元素,通常這些元素通過(guò)創(chuàng)建,文本文件可以直接插入嘻嘻哈哈這是渲染器,將元素渲染到頁(yè)面中。 React簡(jiǎn)介 FeceBook開(kāi)源的一套框架,專(zhuān)注于MVC的視圖V模塊。實(shí)質(zhì)是對(duì)V視圖的一種實(shí)現(xiàn)。 React框架的設(shè)計(jì)沒(méi)有過(guò)分依賴(lài)于某個(gè)環(huán)境,它自建一套環(huán)境,就是virtual DOM(虛擬DOM)。 提供基礎(chǔ)AP...
摘要:給賦值也是構(gòu)造函數(shù)的工作之一。在的構(gòu)造函數(shù)中,還給兩個(gè)成員函數(shù)綁定了當(dāng)前的執(zhí)行環(huán)境,因?yàn)榉绞絼?chuàng)建的組件并不自動(dòng)給我們綁定到當(dāng)前實(shí)例對(duì)象。我們可以利用的功能,避免判斷邏輯這種充斥在構(gòu)造函數(shù)之中,讓代碼更優(yōu)。 React系列---React(一)初識(shí)ReactReact系列---React(二)組件的prop和stateReact系列---React(三)組件的生命周期 組件是React...
閱讀 1491·2021-11-25 09:43
閱讀 2635·2021-09-24 10:30
閱讀 3690·2021-09-06 15:02
閱讀 3630·2019-08-30 15:55
閱讀 3321·2019-08-30 15:53
閱讀 1722·2019-08-30 15:52
閱讀 2164·2019-08-30 14:21
閱讀 2038·2019-08-30 13:55