React 受控和非受控組件

来源:https://www.cnblogs.com/hubert-style/archive/2023/11/29/17865380.html
-Advertisement-
Play Games

無論你做什麼,都要相信自己可以做到,因為你的潛力是無限的。 把父組件的狀態變成屬性傳遞給子組件,子組件接受這個屬性,聽命於父組件。這個子組件就是叫做受控組件。在受控與非受控組件有兩種理解方案,第一:狹義上的受控與非受控,就是我們在表單中的受控與非受控組件。第二:廣義上的受控與非受控組件,就是 Rea ...


無論你做什麼,都要相信自己可以做到,因為你的潛力是無限的。

把父組件的狀態變成屬性傳遞給子組件,子組件接受這個屬性,聽命於父組件。這個子組件就是叫做受控組件。在受控與非受控組件有兩種理解方案,第一:狹義上的受控與非受控,就是我們在表單中的受控與非受控組件。第二:廣義上的受控與非受控組件,就是 React 組件的數據渲染是通過父組件傳遞過來的屬性控制的,能完全控制得住的就是受控組件,不能完全控制住的就是非受控組件。

1. 表單中非受控組件

React 要編寫一個表單非受控組件,可以使用 ref 來從 DOM 節點中獲取表單數據(訪問節點,通過節點訪問值),與狀態沒有任何關係,這種就是非受控組件。 下麵代碼使用非受控組件接受一個表單的值:

import React, { Component } from 'react'

export default class App extends Component {
  myusername = React.createRef()
  render() {
    return (
      <div>
        <h4>登錄頁</h4>
        {/* 這裡設置 value 後導致 input 不能輸入了。寫成 value 形式本身就是一種受控方式。被字元串 “hubert” 控制住了。*/}
        <input type={"text"} ref={this.myusername} value="hubert"></input>
        {/* 非受控需要通過 defaultValue 設置預設值,只是第一次設置值 */}
        <input type={"text"} ref={this.myusername} defaultValue="hubert"></input>
        <button onClick={()=>{
          console.log(this.myusername.current.value)
        }}>登錄</button>
        <button onClick={()=>{
          this.myusername.current.value = ""
        }}>重置</button>
      </div>
    )
  }
}

因為非受控組件將真實數據儲存在 DOM 節點中,所以在使用非受控組件時,有時候反而更容易同時集成 React 和非 React 代碼。如果你不介意代碼美觀性,並且希望快速編寫代碼,使用非受控組件往往可以減少你的代碼量。否則,你應該使用受控組件。

預設值問題:在React 渲染生命周期時,表單元素上的 value 將會覆蓋 DOM 節點中的值,在非受控組件中,你經常希望 React 能賦予組件一個初始值,但是不去控制後續的更新。在這種情況下,你可以指定一個 defaultvalue 屬性,而不是 value。

2. 表單中受控組件

現在如果有一個子組件需要拿到表單中的 value 值,該怎麼辦?這裡在輸入框值變更的時候,是不會同步、分享到子組件的,因為 render 函數是不會重新執行的。

在 HTML 中,表單元素(如 <input><select>)通常自己維護 state,並根據用戶輸入進行更新。而在 React 中,可變狀態(mutable state)通常保存在組件的 state 屬性中,並且只能通過使用 setState() 來更新。我們可以把兩者結合起來,使 React 的 state 成為“唯一數據源”。渲染表單的 React 組件還控制著用戶輸入過程中表單發生的操作。被 React 以這種方式控制取值的表單輸入元素就叫做"受控組件”。

 {/* 在輸入框值變更的時候,是不會同步、分享到子組件的 */}
 <Child value={this.myusername.current.value}></Child>

// 設置成受控組件後後
<Child value={this.state.username}></Child>
import React, { Component } from 'react'

export default class App extends Component {
  state = {
    username: "hubert"
  }
  render() {
    return (
      <div>
        <h4>登錄頁</h4>
        {/* 這裡設置 value 後導致 input 不能輸入了。寫成 value 形式本身就是一種受控方式。被字元串 “hubert” 控制住了。*/}
        {/* 非受控需要通過 defaultValue 設置預設值,只是第一次設置值 */}
        <input type={"text"} ref={this.myusername} value={this.state.username} onChange={(evt)=>{
          this.setState({
            username: evt.target.value
          })
        }}></input>
        <button onClick={()=>{
          console.log(this.state.username)
        }}>登錄</button>
        <button onClick={()=>{
          this.setState({
            username:""
          })
        }}>重置</button>
        {/* 在輸入框值變更的時候,是不會同步、分享到子組件的 */}
        {/* <Child value={this.myusername.current.value}></Child> */}
      </div>
    )
  }
}

// 在 react 中 onInput 和 onChange 事件的行為一樣的。原生 JS 則不然。

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

-Advertisement-
Play Games
更多相關文章
  • 只是記錄一些我認為比較有用而且容易忘記的操作,主要系統為CentOS CentOS yum使用鏡像源 sudo yum install epel-release (虛擬機)使用主機代理 使用ip route show查看預設路由埠 設置代理: #添加Proxy代理信息(其中username和pas ...
  • SQL HAVING子句 HAVING子句被添加到SQL中,因為WHERE關鍵字不能與聚合函數一起使用。 HAVING語法 SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING con ...
  • 稀疏索引 密集索引:文件中的每個搜索碼值都對應一個索引值,就是葉子節點保存了整行. 稀疏索引:文件只為索引碼的某些值建立索引項. 稀疏索引的創建過程包括將集合中的元素分段,並給每個分段中的最小元素創建索引。在搜索時,先定位到第一個大於搜索值的索引的前一個索引,然後從該索引所在的分段中從前向後順序遍歷 ...
  • WebSocket 是一種用於實現持久連接的通信協議,它的原理和工作方式相對複雜,但我們可以嘗試以儘可能簡單和清晰的方式來解釋它。 WebSocket 的原理 在理解 WebSocket 的工作原理之前,我們首先要瞭解 HTTP 協議的短連接性質。在傳統的 HTTP 通信中,客戶端發送一個請求到服務 ...
  • 一個變數如果聲明為聯合類型,而後續操作需要針對其具體的單一類型做不同處理,這個過程就叫做類型收窄(`Narrowing`) ...
  • 項目代碼同步至碼雲 weiz-vue3-template Vue Router 是 Vue.js 的官方路由。它與 Vue.js 核心深度集成,讓用 Vue.js 構建單頁應用變得輕而易舉。 1. 安裝 npm i vue-router@4 2. 集成 1. 新建兩頁面進行示例 在src/view下 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 函數創建與定義的過程 函數定義階段 在堆記憶體中開闢一段空間 把函數體內的代碼一模一樣的存儲在這段空間內 把空間賦值給棧記憶體的變數中 函數調用階段 按照變數名內的存儲地址找到堆記憶體中對應的存儲空間 在調用棧中開闢一個新的函數執行空間 在執行 ...
  • TS官方Handbook: TypeScript: Handbook - The TypeScript Handbook (typescriptlang.org) 基礎 相關概念 運行時錯誤:JS 的大多數錯誤都只能在運行的過程中被髮現。 靜態類型系統:TS 可以在運行代碼之前發現錯誤。 非異常失敗 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...