国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

react中的DOM操作實(shí)現

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:小火柴的藍色理想 欄目: JavaScript 歡迎投稿:712375056

目錄

    前面的話(huà)

      某些情況下需要在典型數據流外強制修改子代。要修改的子代可以是 React 組件實(shí)例,也可以是 DOM 元素。這時(shí)就要用到refs來(lái)操作DOM

    使用場(chǎng)景

      下面是幾個(gè)適合使用 refs 的情況

      1、處理焦點(diǎn)、文本選擇或媒體控制

      2、觸發(fā)強制動(dòng)畫(huà)

      3、集成第三方 DOM 庫

      如果可以通過(guò)聲明式實(shí)現,則盡量避免使用 refs

      [注意]不要在 Dialog 組件上直接暴露 open() 和 close() 方法,最好傳遞 isOpen 屬性

    ref

      React 支持給任意組件添加特殊屬性。ref 屬性接受一個(gè)回調函數,它在組件被加載或卸載時(shí)會(huì )立即執行

      [注意]在組件mount之后再去獲取ref。componentWillMount和第一次render時(shí)都獲取不到,在componentDidMount才能獲取到

    【HTML元素】

      當給 HTML 元素添加 ref 屬性時(shí),ref 回調接收了底層的 DOM 元素作為參數

      React 組件在加載時(shí)將 DOM 元素傳入 ref 的回調函數,在卸載時(shí)則會(huì )傳入 null。ref 回調會(huì )在componentDidMount 或 componentDidUpdate 這些生命周期回調之前執行。

    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)短的寫(xiě)法如下

    ref={input => this.textInput = input}
    

    【類(lèi)組件】

      當 ref 屬性用于使用 class 聲明的自定義組件時(shí),ref 的回調接收的是已經(jīng)加載的 React 實(shí)例

    class AutoFocusTextInput extends React.Component {
      componentDidMount() {
        this.textInput.focusTextInput();
      }
    
      render() {
        return (
          <CustomTextInput
            ref={(input) => { this.textInput = input; }} />
        );
      }
    }
    
    

      [注意]這種方法僅對 class 聲明的 CustomTextInput 有效

    【函數式組件】

      不能在函數式組件上使用 ref 屬性,因為它們沒(méi)有實(shí)例

    【對父組件暴露DOM節點(diǎn)】

      在子節點(diǎn)上暴露一個(gè)特殊的屬性。子節點(diǎn)將會(huì )獲得一個(gè)函數屬性,并將其作為 ref 屬性附加到 DOM 節點(diǎn)。這允許父代通過(guò)中間件將 ref 回調給子代的 DOM 節點(diǎn)

      該方法適用于類(lèi)組件和函數式組件

    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 回調作為一個(gè)特殊的 inputRef 傳遞給 CustomTextInput,然后 CustomTextInput 通過(guò) ref 屬性將其傳遞給 <input>。最終,Parent 中的 this.inputElement 將被設置為與 CustomTextInput 中的 <input> 元素相對應的 DOM 節點(diǎn)

    非受控組件

      要編寫(xiě)一個(gè)非受控組件,而非為每個(gè)狀態(tài)更新編寫(xiě)事件處理程序,可以使用 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í)數據保存在 DOM 中,因此在使用非受控組件時(shí),更容易同時(shí)集成React和非React代碼

    【默認值】

      在 React 的生命周期中,表單元素上的 value 屬性將會(huì )覆蓋 DOM 中的值。使用非受控組件時(shí),通常希望 React 可以為其指定初始值,但不再控制后續更新。要解決這個(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

    ReactDOM

      react-dom這個(gè)軟件包提供了針對DOM的方法,可以在應用的頂級域中調用,也可以在有需要的情況下用作跳出React模型的出口。但大部分組件都不應該需要使用這個(gè)包

    render()
    unmountComponentAtNode()
    findDOMNode()
    

    【render()】

    ReactDOM.render(
      element,
      container,
      [callback]
    )
    

      渲染一個(gè)React元素,添加到位于提供的container里的DOM元素中,并返回這個(gè)組件的一個(gè) 引用 (或者對于無(wú)狀態(tài)組件返回null)

      如果這個(gè)React元素之前已經(jīng)被渲染到container里去了,這段代碼就會(huì )進(jìn)行一次更新,并且只會(huì )改變那些反映元素最新?tīng)顟B(tài)所必須的DOM元素

    【unmountComponentAtNode()】

    ReactDOM.unmountComponentAtNode(container)
      從DOM元素中移除已掛載的React組件,清除它的事件處理器和state。如果容器內沒(méi)有掛載任何組件,這個(gè)函數什么都不會(huì )干。 有組件被卸載的時(shí)候返回true,沒(méi)有組件可供卸載時(shí)返回 false

    【findDOMNode()】

    ReactDOM.findDOMNode(component)
      如果這個(gè)組件已經(jīng)被掛載到DOM中,函數會(huì )返回對應的瀏覽器中生成的DOM元素 。需要從DOM中讀取值時(shí),比如表單的值,或者計算DOM元素的尺寸,這個(gè)函數會(huì )非常有用。 大多數情況下,可以添加一個(gè)指向DOM節點(diǎn)的引用,從而完全避免使用findDOMNode 這個(gè)函數。當 render 返回 null 或者 false 時(shí), findDOMNode 也返回 null

    新ref

      版本16.3 之前,React 有兩種提供 ref 的方式:字符串和回調,因為字符串的方式有些問(wèn)題,所以官方建議使用回調來(lái)使用 ref。而現在引入的 createRef API,據官方說(shuō)是一種零缺點(diǎn)的使用 ref 的方式,回調方式也可以讓讓路了

    class MyComponent extends React.Component {
      constructor(props) {
        super(props);
        this.myRef = React.createRef();
      }
      render() {
        return <div ref={this.myRef} />;
      }
    }
    

      然后使用current屬性,即可獲得當前元素

    this.myRef.current
    

      典型應用如下所示

      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í)現的文章就介紹到這了,更多相關(guān)react DOM操作內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

    亚洲小说乱欧美另类| 99久久全国免费观看| 久久精品道一区二区三区 | 亚洲国产精品一区二区成人片国内 | 精品无码一区在线观看| 国产特级毛片AAAAAA高潮流水 |