成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

如何在 React 組件中正確使用 Refs的指南

Backache / 1508人閱讀

摘要:通常在組件的構(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

;
}}
如上所示:
一個(gè) ref 實(shí)例在構(gòu)造函數(shù)中創(chuàng)建,并賦值給 this.firstRef
在 render() 方法內(nèi)部,將構(gòu)造函數(shù)中創(chuàng)建的 ref 傳遞給 div

接下來(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 (



);
}}
在上面的代碼塊中,我們構(gòu)建了一個(gè)按鈕,當(dāng)單擊它時(shí),該頁(yè)面會(huì)自動(dòng)聚焦在輸入框上。
首先,我們?cè)跇?gòu)造方法中創(chuàng)建一個(gè) ref 實(shí)例,并將其賦值給 this.textInput,然后通過(guò) ref 屬性將其分配給 input 元素。
[HTML] 純文本查看 復(fù)制代碼
?
1

注意,當(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 (


this.handleSubmit(e)}>




);
}}
同樣,我們使用該 React.createRef() 函數(shù)創(chuàng)建一個(gè) ref 實(shí)例,然后將它分配給實(shí)例變量 this.textInput。
在 render 函數(shù)中,我們希望讀取 form 下輸入框的值。我們?nèi)绾巫x取這個(gè)值? 通過(guò)為 input 指定一個(gè) ref ,然后讀取 ref 的值。
[JavaScript] 純文本查看 復(fù)制代碼
?
1

點(diǎn)擊提交按鈕,上面示例中 form 元素會(huì)通過(guò) onSubmit 方法,調(diào)用 this.handleSubmit 函數(shù) ,并在控制臺(tái)打印輸入框中的信息。
[JavaScript] 純文本查看 復(fù)制代碼
?

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.handleSubmit(e)}>




);
}}
上面的示例中,我們將 input 標(biāo)簽的 ref 設(shè)置為 this.setTextInputRef。
當(dāng)組件安裝時(shí),React 會(huì)將 DOM 元素傳遞給 ref 的回調(diào);當(dāng)組件卸載時(shí),則會(huì)傳遞 null。(ref 回調(diào)會(huì)在 componentDidMount 和 componentDidUpdate 生命周期之前調(diào)用。)
String Ref(已過(guò)時(shí))
還有另一種設(shè)置 refs 的方法,但它被認(rèn)為是過(guò)時(shí)的,可能很快就會(huì)被棄用。但是你可能會(huì)在其他人的代碼中看到它,所以這里說(shuō)一下。
使用 string refs,你將會(huì)看到這樣的 input 標(biāo)簽:
[HTML] 純文本查看 復(fù)制代碼
?

然后,我們可以在組建上得到這樣的值: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 (


this.handleSubmit(e)}>




);
}}
Ref forwarding 允許組件接收一個(gè) ref ,并將它向下傳遞(換句話(huà)說(shuō),“轉(zhuǎn)發(fā)”它)給子組件。
在上面的示例中,我們使用 input 標(biāo)簽創(chuàng)建了一個(gè)名為 TextInput 的組件。那么,我們?nèi)绾螌?ref 傳遞或轉(zhuǎn)發(fā)到 input 標(biāo)簽?zāi)兀?br>首先,我們使用下面的代碼創(chuàng)建一個(gè) ref :
[JavaScript] 純文本查看 復(fù)制代碼
?
1
const inputRef = React.createRef();

然后,我們將 ref 通過(guò)為組件 指定一個(gè)同名的 JSX 的屬性,將 ref 向下傳遞。然后 React 將會(huì)把 ref 作為第二個(gè)參數(shù)轉(zhuǎn)發(fā)給 forwardRef 函數(shù)。
接下來(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 }) => (



{children}
);
上面的組件會(huì)將 forwardedRef 分配給 ref 屬性, 當(dāng)渲染子組件的時(shí)候,input 輸入框就會(huì)接收到這個(gè) ref ?!璻est 是 props 的解構(gòu)(也就是說(shuō),我們會(huì)將 rest 數(shù)組中的所有參數(shù)作為 props 傳遞給 input 組件)。那么我們?cè)撊绾问褂?TextInput 組件呢?像這樣:
[JavaScript] 純文本查看 復(fù)制代碼
?

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

相關(guān)文章

  • 02.react進(jìn)階指南

    摘要:指定讀取當(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屬性接受任何在...

    zzbo 評(píng)論0 收藏0
  • ReactRefs方法獲取DOM實(shí)例 和 訪(fǎng)問(wèn)子組件方法及屬性

    摘要:綁定屬性調(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í)候...

    geekzhou 評(píng)論0 收藏0
  • React教程:組件,Hooks和性能

    摘要:顧名思義,受控組件的值由控制,能為與用戶(hù)交互的元素提供值,而不受控制的元素不獲取值屬性。另外我發(fā)現(xiàn)受控組件更容易理解和于使用。只是一種把組件作為參數(shù)的函數(shù),并且與沒(méi)有包裝器的組件相比,能夠返回具有擴(kuò)展功能的新組件。其中三個(gè)基本的是,和。 翻譯:瘋狂的技術(shù)宅原文:https://www.toptal.com/react/... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)...

    edagarli 評(píng)論0 收藏0
  • React

    摘要:基礎(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...

    hlcc 評(píng)論0 收藏0
  • React系列---React(二)組件prop和state

    摘要:給賦值也是構(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...

    Labradors 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<