這篇“react中的DOM操作怎么實(shí)現(xiàn)”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“react中的DOM操作怎么實(shí)現(xiàn)”文章吧。
十載的靖遠(yuǎn)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整靖遠(yuǎn)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“靖遠(yuǎn)網(wǎng)站設(shè)計(jì)”,“靖遠(yuǎn)網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
下面是幾個(gè)適合使用 refs 的情況
1、處理焦點(diǎn)、文本選擇或媒體控制
2、觸發(fā)強(qiáng)制動(dòng)畫
3、集成第三方 DOM 庫(kù)
如果可以通過(guò)聲明式實(shí)現(xiàn),則盡量避免使用 refs
[注意]不要在 Dialog 組件上直接暴露 open() 和 close() 方法,最好傳遞 isOpen 屬性
React 支持給任意組件添加特殊屬性。ref 屬性接受一個(gè)回調(diào)函數(shù),它在組件被加載或卸載時(shí)會(huì)立即執(zhí)行
[注意]在組件mount之后再去獲取ref。componentWillMount和第一次render時(shí)都獲取不到,在componentDidMount才能獲取到
當(dāng)給 HTML 元素添加 ref 屬性時(shí),ref 回調(diào)接收了底層的 DOM 元素作為參數(shù)
React 組件在加載時(shí)將 DOM 元素傳入 ref 的回調(diào)函數(shù),在卸載時(shí)則會(huì)傳入 null。ref 回調(diào)會(huì)在componentDidMount 或 componentDidUpdate 這些生命周期回調(diào)之前執(zhí)行。
class CustomTextInput extends React.Component { constructor(props) { super(props); this.focus = this.focus.bind(this); } focus() { this.textInput.focus(); } render() { return ( <div> <input type="text" ref={(input) => { this.textInput = input; }} /> <input type="button" value="Focus the text input" onClick={this.focus} /> </div> ); } }
更簡(jiǎn)短的寫法如下
ref={input => this.textInput = input}
當(dāng) ref 屬性用于使用 class 聲明的自定義組件時(shí),ref 的回調(diào)接收的是已經(jīng)加載的 React 實(shí)例
class AutoFocusTextInput extends React.Component { componentDidMount() { this.textInput.focusTextInput(); } render() { return ( <CustomTextInput ref={(input) => { this.textInput = input; }} /> ); } }
[注意]這種方法僅對(duì) class 聲明的 CustomTextInput 有效
不能在函數(shù)式組件上使用 ref 屬性,因?yàn)樗鼈儧](méi)有實(shí)例
在子節(jié)點(diǎn)上暴露一個(gè)特殊的屬性。子節(jié)點(diǎn)將會(huì)獲得一個(gè)函數(shù)屬性,并將其作為 ref 屬性附加到 DOM 節(jié)點(diǎn)。這允許父代通過(guò)中間件將 ref 回調(diào)給子代的 DOM 節(jié)點(diǎn)
該方法適用于類組件和函數(shù)式組件
function CustomTextInput(props) { return ( <div> <input ref={props.inputRef} /> </div> ); } class Parent extends React.Component { render() { return ( <CustomTextInput inputRef={el => this.inputElement = el} /> ); } }
在上面的例子中,Parent 將它的 ref 回調(diào)作為一個(gè)特殊的 inputRef 傳遞給 CustomTextInput,然后 CustomTextInput 通過(guò) ref 屬性將其傳遞給 <input>。最終,Parent 中的 this.inputElement 將被設(shè)置為與 CustomTextInput 中的 <input> 元素相對(duì)應(yīng)的 DOM 節(jié)點(diǎn)
要編寫一個(gè)非受控組件,而非為每個(gè)狀態(tài)更新編寫事件處理程序,可以使用 ref 從 DOM 獲取表單值
[注意]可能通過(guò)e.target.value取得DOM值,而不用綁定react
class NameForm extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); } handleSubmit(event) { alert("A name was submitted: " + this.input.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> Name: <input type="text" ref={(input) => this.input = input} /> </label> <input type="submit" value="Submit" /> </form> ); } }
由于非受控組件將真實(shí)數(shù)據(jù)保存在 DOM 中,因此在使用非受控組件時(shí),更容易同時(shí)集成React和非React代碼
在 React 的生命周期中,表單元素上的 value 屬性將會(huì)覆蓋 DOM 中的值。使用非受控組件時(shí),通常希望 React 可以為其指定初始值,但不再控制后續(xù)更新。要解決這個(gè)問(wèn)題,可以指定一個(gè) defaultValue 屬性而不是 value
render() { return ( <form onSubmit={this.handleSubmit}> <label> Name: <input defaultValue="Bob" type="text" ref={(input) => this.input = input} /> </label> <input type="submit" value="Submit" /> </form> ); }
同樣,<input type="checkbox"> 和 <input type="radio"> 支持 defaultChecked,<select> 和 <textarea> 支持 defaultValue
react-dom這個(gè)軟件包提供了針對(duì)DOM的方法,可以在應(yīng)用的頂級(jí)域中調(diào)用,也可以在有需要的情況下用作跳出React模型的出口。但大部分組件都不應(yīng)該需要使用這個(gè)包
render() unmountComponentAtNode() findDOMNode()
ReactDOM.render( element, container, [callback] )
渲染一個(gè)React元素,添加到位于提供的container里的DOM元素中,并返回這個(gè)組件的一個(gè) 引用 (或者對(duì)于無(wú)狀態(tài)組件返回null)
如果這個(gè)React元素之前已經(jīng)被渲染到container里去了,這段代碼就會(huì)進(jìn)行一次更新,并且只會(huì)改變那些反映元素最新?tīng)顟B(tài)所必須的DOM元素
ReactDOM.unmountComponentAtNode(container)
從DOM元素中移除已掛載的React組件,清除它的事件處理器和state。如果容器內(nèi)沒(méi)有掛載任何組件,這個(gè)函數(shù)什么都不會(huì)干。 有組件被卸載的時(shí)候返回true,沒(méi)有組件可供卸載時(shí)返回 false
ReactDOM.findDOMNode(component)
如果這個(gè)組件已經(jīng)被掛載到DOM中,函數(shù)會(huì)返回對(duì)應(yīng)的瀏覽器中生成的DOM元素 。需要從DOM中讀取值時(shí),比如表單的值,或者計(jì)算DOM元素的尺寸,這個(gè)函數(shù)會(huì)非常有用。 大多數(shù)情況下,可以添加一個(gè)指向DOM節(jié)點(diǎn)的引用,從而完全避免使用findDOMNode 這個(gè)函數(shù)。當(dāng) render 返回 null 或者 false 時(shí), findDOMNode 也返回 null
版本16.3 之前,React 有兩種提供 ref 的方式:字符串和回調(diào),因?yàn)樽址姆绞接行﹩?wèn)題,所以官方建議使用回調(diào)來(lái)使用 ref。而現(xiàn)在引入的 createRef API,據(jù)官方說(shuō)是一種零缺點(diǎn)的使用 ref 的方式,回調(diào)方式也可以讓讓路了
class MyComponent extends React.Component { constructor(props) { super(props); this.myRef = React.createRef(); } render() { return <div ref={this.myRef} />; } }
然后使用current屬性,即可獲得當(dāng)前元素
this.myRef.current
典型應(yīng)用如下所示
constructor(props){ super(props) this.Mask = React.createRef() this.MenuList = React.createRef() } handleClick = () => { ReactDOM.findDOMNode(this.MenuList.current).classList.toggle("transform-zero") ReactDOM.findDOMNode(this.Mask.current).classList.toggle("mask-show") }
[注意]使用styledComponents樣式化的元素暴露的接口是innerRef,而不是ref
<Wrap innerRef={this.itemRef}>
以上就是關(guān)于“react中的DOM操作怎么實(shí)現(xiàn)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁(yè)題目:react中的DOM操作怎么實(shí)現(xiàn)
轉(zhuǎn)載源于:http://muchs.cn/article14/gcidge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、營(yíng)銷型網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、品牌網(wǎng)站建設(shè)、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)