亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

Backache / 1538人閱讀

摘要:通常在組件的構(gòu)造函數(shù)內(nèi)創(chuàng)建,使其在整個組件中可用。例如純文本查看復(fù)制代碼如上所示一個實例在構(gòu)造函數(shù)中創(chuàng)建,并賦值給在方法內(nèi)部,將構(gòu)造函數(shù)中創(chuàng)建的傳遞給接下來,讓我們看一個在組件中使用的示例?;卣{(diào)回調(diào)是在中使用的另一種方式。

使用 React 時,我們的默認(rèn)思維方式應(yīng)該是 不會強制修改 DOM ,而是通過傳入 props 重新渲染組件。但是,有些情況卻無法避免修改 DOM 。
React 中的 Refs 提供了一種訪問 render() 方法中創(chuàng)建的 React 元素(或 DOM 節(jié)點)的方法。
當(dāng)父組件需要與子組件交互時,我們通常使用 props 來傳遞相關(guān)信息。 但是,在某些情況下,我們可能需要修改子項,而不用新的props 重新呈現(xiàn) (re-rendering) 它。 這時候就需要 refs 出場了。
我什么時候應(yīng)該使用 Refs ?
我們建議在以下情況下使用 refs:
與第三方 DOM 庫集成
觸發(fā)命令式動畫
管理焦點,文本選擇或媒體播放

譯注:第三點是否也可以理解為使用 event 對象呢?在 React 中就是合成事件(SyntheticEvent)。
官方文檔中提到:避免使用 refs 來做任何可以通過聲明式實現(xiàn)來完成的事情。
所以一旦我們確定我們真的應(yīng)該使用 refs,我們需要如何使用它們呢?
在 React 中使用 Refs
您可以通過多種方式使用 refs :
React.createRef()
回調(diào)引用 (Callback refs)
String refs(已過時)
轉(zhuǎn)發(fā) refs (Forwarding refs)

接下來,讓我們看看每一種實現(xiàn)方式:
React.createRef()
可以使用該 React.createRef() 函數(shù)創(chuàng)建 Refs ,并通過該 ref 屬性附加到 React 組件中的 HTML 元素。
通常在組件的構(gòu)造函數(shù)內(nèi)創(chuàng)建 ref ,使其在整個組件中可用。例如:
[JavaScript] 純文本查看 復(fù)制代碼
?

class MyComponent extends React.Component {
constructor(props) {
super(props);
this.firstRef = React.createRef();
}
render() {
return

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

接下來,讓我們看一個在 React 組件中使用 refs 的示例。
使用 Refs 聚焦輸入
這是另一個例子:
[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)建了一個按鈕,當(dāng)單擊它時,該頁面會自動聚焦在輸入框上。
首先,我們在構(gòu)造方法中創(chuàng)建一個 ref 實例,并將其賦值給 this.textInput,然后通過 ref 屬性將其分配給 input 元素。
[HTML] 純文本查看 復(fù)制代碼
?
1

注意,當(dāng) ref 屬性被一個 HTML 元素使用時(比如當(dāng)前示例中的 input 元素),在 constructor 中使用 React.createRef() 創(chuàng)建的 ref 會接收來自底層 DOM 元素的 current 值。
譯注:這里的 current 應(yīng)該是 合成事件(SyntheticEvent)
這意味著訪問 DOM 值,我們需要寫這樣的東西:
[JavaScript] 純文本查看 復(fù)制代碼
?
1
this.textInput.current;

第二個元素是一個按鈕,點擊它之后會自動聚焦到第一個輸入框上面。我們?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() 方法會將光標(biāo)聚焦于文本輸入框上。
[JavaScript] 純文本查看 復(fù)制代碼
?

focusTextInput() {
this.textInput.current.focus();}
最后,focusTextInput 函數(shù)綁定在這樣的 constructor 方法中的:
[JavaScript] 純文本查看 復(fù)制代碼
?

this.focusTextInput = this.focusTextInput.bind(this);
從 ref 中獲取值
在這個例子中,我們將看到如何為 input 輸入框設(shè)置 ref 屬性,并通過 ref 來獲取值。示例如下:
在這個例子中,我們創(chuàng)建了一個 input 輸入框來輸入值。然后,當(dāng)單擊提交按鈕時,我們將讀取此值,并在控制臺打印。
[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)建一個 ref 實例,然后將它分配給實例變量 this.textInput。
在 render 函數(shù)中,我們希望讀取 form 下輸入框的值。我們?nèi)绾巫x取這個值? 通過為 input 指定一個 ref ,然后讀取 ref 的值。
[JavaScript] 純文本查看 復(fù)制代碼
?
1

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

handleSubmit = e => {
e.preventDefault();
console.log(this.textInput);};
上面,參數(shù) e 包含事件對象。我們使用e.preventDefault() 來告訴瀏覽器我們正在處理被點擊的提交按鈕,我們不希望這個事件“冒泡”(意思就是說,阻止瀏覽器的默認(rèn)行為)。
譯注:這里可以看一下 React 對于事件的處理:在 React 中另一個不同點是你不能通過返回 false 的方式阻止默認(rèn)行為。你必須顯式的使用 preventDefault
在上面示例中,我們打印了 this.textInput ,在控制臺可以看到一個 ref 對象。
[JavaScript] 純文本查看 復(fù)制代碼
?
1

Object {current: HTMLInputElement}
請注意,它有一個 current屬性,即 HTMLInputElement 。這是 input DOM 元素本身,而不是實際值。 我們必須使用 this.textInput.current.value 來獲取 input 標(biāo)簽的實際值:
[JavaScript] 純文本查看 復(fù)制代碼
?

handleSubmit = e => {
e.preventDefault();
console.log(this.textInput.current.value);};
使用 refs 是一種從表單中直接提取值的方式:只需要給 input 標(biāo)簽設(shè)置 ref ,并在你需要的時候?qū)⒅堤崛〕鰜怼?br>Refs 回調(diào)
Refs 回調(diào) 是在 React 中使用 ref 的另一種方式。要以這種方式使用 ref,我們需要為 ref 屬性設(shè)置回調(diào)函數(shù)。當(dāng)我們設(shè)置 ref 時,React 會調(diào)用這個函數(shù),并將 element 作為第一個參數(shù)傳遞給它。
這是另一個例子的代碼。像上面的示例一樣,此代碼獲取 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)組件安裝時,React 會將 DOM 元素傳遞給 ref 的回調(diào);當(dāng)組件卸載時,則會傳遞 null。(ref 回調(diào)會在 componentDidMount 和 componentDidUpdate 生命周期之前調(diào)用。)
String Ref(已過時)
還有另一種設(shè)置 refs 的方法,但它被認(rèn)為是過時的,可能很快就會被棄用。但是你可能會在其他人的代碼中看到它,所以這里說一下。
使用 string refs,你將會看到這樣的 input 標(biāo)簽:
[HTML] 純文本查看 復(fù)制代碼
?

然后,我們可以在組建上得到這樣的值:this.refs.textInput.value - 但是,再次聲明,這不應(yīng)該在新代碼中使用,因為這個 API 將被棄用。
轉(zhuǎn)發(fā) Refs (Forwarding Refs)
Ref forwarding 是一種將 ref 通過組件傳遞給其子節(jié)點的技術(shù)。它對于可復(fù)用組件庫和高階組件(HOC)等情況非常有用。
您可以使用 React.forwardRef 函數(shù)將 ref 轉(zhuǎn)發(fā)到組件。我們來看下面的例子:
[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 允許組件接收一個 ref ,并將它向下傳遞(換句話說,“轉(zhuǎn)發(fā)”它)給子組件。
在上面的示例中,我們使用 input 標(biāo)簽創(chuàng)建了一個名為 TextInput 的組件。那么,我們?nèi)绾螌?ref 傳遞或轉(zhuǎn)發(fā)到 input 標(biāo)簽?zāi)兀?br>首先,我們使用下面的代碼創(chuàng)建一個 ref :
[JavaScript] 純文本查看 復(fù)制代碼
?
1
const inputRef = React.createRef();

然后,我們將 ref 通過為組件 指定一個同名的 JSX 的屬性,將 ref 向下傳遞。然后 React 將會把 ref 作為第二個參數(shù)轉(zhuǎn)發(fā)給 forwardRef 函數(shù)。
接下來,我們將此 ref 參數(shù)轉(zhuǎn)發(fā)給 。現(xiàn)在可以在外層組件通過 inputRef.current 訪問DOM節(jié)點的值了。
轉(zhuǎn)發(fā) refs 和高階組件
最后,讓我們看一下使用 refs 的另一個例子,但這次是使用高階組件(HOC)。
在上面的示例應(yīng)用程序中,會將所有 input 標(biāo)簽中輸入的值在控制臺打印。這里已經(jīng)為 input 標(biāo)簽設(shè)置了 ref 屬性,接下來,讓我們看一下需要如何在高階組件中傳遞 / 轉(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);};
這里有一個名為 Input 的高階組件 ,它接受 InputComponent 作為參數(shù)。當(dāng)用戶輸入的時候,他還會將 ref 的值在控制臺打印。
在 Input 高階組件內(nèi),forwardRef 函數(shù)會返回 InputComponent。forwardRef 函數(shù)中所包含的 ref 參數(shù),是由 React.forwardRef 函數(shù)創(chuàng)建的。 高階組件最終會將包裝好的組件作為值返回。
接下來,我們創(chuàng)建一個組件,將 input 作為子組件包含進來。
[JavaScript] 純文本查看 復(fù)制代碼
?

const TextInput = ({ forwardedRef, children, ...rest }) => (



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

const InputField = Input(TextInput);class CustomTextInput extends Component {
render() {
const inputRef = React.createRef();

return ;
}}
最后,將 TextInput 傳入 Input 高階組件,會返回一個 InputField component。
創(chuàng)建一個 ref ,并作為參數(shù)傳遞給 InputField 組件。
結(jié)論
與通過 props 和 state 不同,Refs 是一種將數(shù)據(jù)傳遞給特定子實例的好方法。
你必須要小心,因為 refs 操縱實際的 DOM,而不是虛擬的 DOM,這與 React 思維方式相矛盾。因此,雖然 refs 不應(yīng)該是通過應(yīng)用程序流動數(shù)據(jù)的默認(rèn)方法,但是當(dāng)您需要時,它們是可以從 DOM 元素讀取數(shù)據(jù)的好方法。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/53972.html

相關(guān)文章

  • 02.react進階指南

    摘要:指定讀取當(dāng)前的。它為其后代元素觸發(fā)額外的檢查和警告。嚴(yán)格模式檢查僅在開發(fā)模式下運行它們不會影響生產(chǎn)構(gòu)建。作用識別不安全的生命周期關(guān)于使用過時字符串的警告關(guān)于使用廢棄的方法的警告檢測意外的副作用檢測過時的為高階組件。 react 進階 懶加載 React.lazy函數(shù)能讓你像渲染常規(guī)組件一樣處理動態(tài)引入(的組件)。Suspense加載指示器為組件做優(yōu)雅降級。fallback屬性接受任何在...

    zzbo 評論0 收藏0
  • ReactRefs方法獲取DOM實例 和 訪問子組件方法及屬性

    摘要:綁定屬性調(diào)用的時候使用調(diào)用子組件方法這是一個很神奇的方法,它可以調(diào)用子組件的方法以及屬性。建立組件建立子組件,并在子組件實現(xiàn)一個方法,如,這個方法實現(xiàn)變更當(dāng)前組件上面的文本,提供這樣一個測試用例。輸入框獲取焦點完整實例點我輸入框獲取焦點 React 支持一種非常特殊的屬性 Ref ,你可以用來綁定到 render() 輸出的任何組件上。 ref : 綁定屬性 refs : 調(diào)用的時候...

    geekzhou 評論0 收藏0
  • React教程:組件,Hooks和性能

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

    edagarli 評論0 收藏0
  • React

    摘要:基礎(chǔ)創(chuàng)建虛擬參數(shù)元素名稱,例如參數(shù)屬性集合,例如,,,從參數(shù)開始,表示該元素的子元素,通常這些元素通過創(chuàng)建,文本文件可以直接插入嘻嘻哈哈這是渲染器,將元素渲染到頁面中。 React簡介 FeceBook開源的一套框架,專注于MVC的視圖V模塊。實質(zhì)是對V視圖的一種實現(xiàn)。 React框架的設(shè)計沒有過分依賴于某個環(huán)境,它自建一套環(huán)境,就是virtual DOM(虛擬DOM)。 提供基礎(chǔ)AP...

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

    摘要:給賦值也是構(gòu)造函數(shù)的工作之一。在的構(gòu)造函數(shù)中,還給兩個成員函數(shù)綁定了當(dāng)前的執(zhí)行環(huán)境,因為方式創(chuàng)建的組件并不自動給我們綁定到當(dāng)前實例對象。我們可以利用的功能,避免判斷邏輯這種充斥在構(gòu)造函數(shù)之中,讓代碼更優(yōu)。 React系列---React(一)初識ReactReact系列---React(二)組件的prop和stateReact系列---React(三)組件的生命周期 組件是React...

    Labradors 評論0 收藏0

發(fā)表評論

0條評論

Backache

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<