最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年06月30日 16:18:14   作者:小火柴的藍(lán)色理想  
某些情況下需要在典型數(shù)據(jù)流外強(qiáng)制修改子代。要修改的子代可以是 React 組件實(shí)例,也可以是 DOM 元素。這時(shí)就要用到refs來(lái)操作DOM,本文詳細(xì)的介紹一下使用,感興趣的可以了解一下

前面的話(huà)

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

使用場(chǎng)景

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

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

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

  3、集成第三方 DOM 庫(kù)

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

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

ref

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

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

【HTML元素】

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

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

【類(lèi)組件】

  當(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ù)式組件】

  不能在函數(shù)式組件上使用 ref 屬性,因?yàn)樗鼈儧](méi)有實(shí)例

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

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

  該方法適用于類(lèi)組件和函數(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)

非受控組件

  要編寫(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í)數(shù)據(jù)保存在 DOM 中,因此在使用非受控組件時(shí),更容易同時(shí)集成React和非React代碼

【默認(rèn)值】

  在 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

ReactDOM

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

render()
unmountComponentAtNode()
findDOMNode()

【render()】

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元素

【unmountComponentAtNode()】

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

【findDOMNode()】

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

新ref

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

相關(guān)文章

  • Modal.confirm是否違反了React模式分析

    Modal.confirm是否違反了React模式分析

    這篇文章主要為大家介紹了Modal.confirm是否違反了React模式分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 淺談react.js 之 批量添加與刪除功能

    淺談react.js 之 批量添加與刪除功能

    下面小編就為大家?guī)?lái)一篇淺談react.js 之 批量添加與刪除功能。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • react中涉及的增加,刪除list方式

    react中涉及的增加,刪除list方式

    這篇文章主要介紹了react中涉及的增加,刪除list方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • React?Context用法小結(jié)(附完整代碼)

    React?Context用法小結(jié)(附完整代碼)

    這篇文章主要介紹了React?Context用法小結(jié)(附完整代碼),Context提供了一種新的組件之間共享數(shù)據(jù)的方式,允許數(shù)據(jù)隔代傳遞,而不必顯式的通過(guò)組件樹(shù)逐層傳遞props,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 在?React?Native?中給第三方庫(kù)打補(bǔ)丁的過(guò)程解析

    在?React?Native?中給第三方庫(kù)打補(bǔ)丁的過(guò)程解析

    這篇文章主要介紹了在?React?Native?中給第三方庫(kù)打補(bǔ)丁的過(guò)程解析,有時(shí)使用了某個(gè)React Native 第三方庫(kù),可是它有些問(wèn)題,我們不得不修改它的源碼,本文介紹如何修改源碼又不會(huì)意外丟失修改結(jié)果的方法,需要的朋友可以參考下
    2022-08-08
  • ReactQuery?渲染優(yōu)化示例詳解

    ReactQuery?渲染優(yōu)化示例詳解

    這篇文章主要為大家介紹了ReactQuery?渲染優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React RenderProps模式超詳細(xì)講解

    React RenderProps模式超詳細(xì)講解

    render props是指一種在 React 組件之間使用一個(gè)值為函數(shù)的 prop 共享代碼的技術(shù)。簡(jiǎn)單來(lái)說(shuō),給一個(gè)組件傳入一個(gè)prop,這個(gè)props是一個(gè)函數(shù),函數(shù)的作用是用來(lái)告訴這個(gè)組件需要渲染什么內(nèi)容,那么這個(gè)prop就成為render prop
    2022-11-11
  • create-react-app 修改為多入口編譯的方法

    create-react-app 修改為多入口編譯的方法

    這篇文章主要介紹了create-react-app 修改為多入口編譯的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • React-router4路由監(jiān)聽(tīng)的實(shí)現(xiàn)

    React-router4路由監(jiān)聽(tīng)的實(shí)現(xiàn)

    這篇文章主要介紹了React-router4路由監(jiān)聽(tīng)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • React列表欄及購(gòu)物車(chē)組件使用詳解

    React列表欄及購(gòu)物車(chē)組件使用詳解

    這篇文章主要為大家詳細(xì)介紹了React列表欄及購(gòu)物車(chē)組件使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評(píng)論

赞皇县| 军事| 蓬溪县| 扎鲁特旗| 五台县| 资中县| 依兰县| 镇康县| 习水县| 黎川县| 台东县| 井研县| 桂林市| 通许县| 佳木斯市| 酒泉市| 平乡县| 白河县| 连云港市| 舒兰市| 开封县| 云龙县| 中宁县| 平湖市| 东安县| 蕉岭县| 奎屯市| 西吉县| 格尔木市| 宜昌市| 阳江市| 衡东县| 商丘市| 昌吉市| 和平县| 增城市| 松江区| 朝阳市| 白银市| 南陵县| 上饶市|