react中的DOM操作

来源:https://www.cnblogs.com/xiaohuochai/archive/2018/04/04/8625445.html
-Advertisement-
Play Games

[1]使用場景 [2]ref [3]非受控組件 [4]ReactDOM ...


前面的話

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

 

使用場景

  下麵是幾個適合使用 refs 的情況

  1、處理焦點、文本選擇或媒體控制

  2、觸發強制動畫

  3、集成第三方 DOM 庫

  如果可以通過聲明式實現,則儘量避免使用 refs

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

 

ref

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

  [註意]在組件mount之後再去獲取ref。componentWillMount和第一次render時都獲取不到,在componentDidMount才能獲取到

【HTML元素】

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

  React 組件在載入時將 DOM 元素傳入 ref 的回調函數,在卸載時則會傳入 nullref 回調會在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>
    );
  }
}

  更簡短的寫法如下

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

【類組件】

  當 ref 屬性用於使用 class 聲明的自定義組件時,ref 的回調接收的是已經載入的 React 實例

class AutoFocusTextInput extends React.Component {
  componentDidMount() {
    this.textInput.focusTextInput();
  }

  render() {
    return (
      <CustomTextInput
        ref={(input) => { this.textInput = input; }} />
    );
  }
}

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

【函數式組件】

  不能在函數式組件上使用 ref 屬性,因為它們沒有實例

【對父組件暴露DOM節點】

  在子節點上暴露一個特殊的屬性。子節點將會獲得一個函數屬性,並將其作為 ref 屬性附加到 DOM 節點。這允許父代通過中間件將 ref 回調給子代的 DOM 節點

  該方法適用於類組件和函數式組件

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

 

非受控組件

  要編寫一個非受控組件,而非為每個狀態更新編寫事件處理程式,可以使用 ref 從 DOM 獲取表單值

  [註意]可能通過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>
    );
  }
}

  由於非受控組件將真實數據保存在 DOM 中,因此在使用非受控組件時,更容易同時集成React和非React代碼

【預設值】

  在 React 的生命周期中,表單元素上的 value 屬性將會覆蓋 DOM 中的值。使用非受控組件時,通常希望 React 可以為其指定初始值,但不再控制後續更新。要解決這個問題,可以指定一個 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這個軟體包提供了針對DOM的方法,可以在應用的頂級域中調用,也可以在有需要的情況下用作跳出React模型的出口。但大部分組件都不應該需要使用這個包

render()
unmountComponentAtNode()
findDOMNode()

【render()】

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

  渲染一個React元素,添加到位於提供的container里的DOM元素中,並返回這個組件的一個 引用 (或者對於無狀態組件返回null)

  如果這個React元素之前已經被渲染到container里去了,這段代碼就會進行一次更新,並且只會改變那些反映元素最新狀態所必須的DOM元素

【unmountComponentAtNode()】

ReactDOM.unmountComponentAtNode(container)

  從DOM元素中移除已掛載的React組件,清除它的事件處理器和state。如果容器內沒有掛載任何組件,這個函數什麼都不會幹。 有組件被卸載的時候返回true,沒有組件可供卸載時返回 false

【findDOMNode()】

ReactDOM.findDOMNode(component)

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、創建一個資料庫,資料庫的名字是UserInfo create database UserInfo; 2、創建一個數據表,數據表的名字是UserInfocreate table UserInfo( UserId int primary key identity(1, 1), UserName va ...
  • 晚上快從自習室回來的時候,跟著老師想做個添加好友功能,結果…… 用戶詳情頁直接掛了,什麼都顯示渲染不出來了,改動的地方太多了,也不知道是哪裡的代碼出了問題。 真是……要氣死了,又得把視頻看一遍,一步步找改了哪些地方…… 改動的地方大致全都是上面截下來的圖片,但是具體是哪裡出了問題,也不知道。 又得從 ...
  • 導讀: 如下是收集整理的 JS 相關問題,若是文中有什麼錯誤,歡迎大家指正批評,願與大家在交流之中共同進步。愈激烈,愈深刻。 1.使用 typeof bar "object" 來確定 obj 是否是對象的缺陷是什麼?如何避免? 在類型檢測中,typeof 適合原始數據類型和 function 的檢測 ...
  • 我用的是Koala。 IDE是intellij_idea(其他IDE也可) 2.安裝(選好位置,下一步即可) 3.打開Koala,創建項目 ==》創建css文件夾==》創建XXX.scss文件,拖到Koala中 4.寫sccs代碼,便可自動變成css代碼。具體見下一篇:scss牛刀小試:解決css中 ...
  • 一、css 繪製圓 key: 1、width = height 相當於畫一個正方形 2、border-radius > 0.5*width (border-radius:圓角半徑 ) 二、absolute構成同心圓 繪製外面的圓: key: 1、margin: auto 使圓居中顯示 2、外部圓的半 ...
  • 我希望能通過這篇文章能讓大家迅速上手vue的全家桶。從入門到放棄,只在一念之間。 ...
  • 1.效果圖 2.源碼 ...
  • 項目做到中期遇到一個問題,華為手機有些頁面顯示不全且無法下滑。 因為之前一直用的Google瀏覽器的模擬模式進行開發和調試的,一直未發現這個問題。 剛開始 選用mui的下拉刷新上拉載入的方式來進行頁面配置。 忙活半天總算是把android的問題給解決了。然後轉頭去os上看看。果然ios又出問題了。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...