首頁 web前端 js教程 詳細解讀react受控組件與非受控組件

詳細解讀react受控組件與非受控組件

Jun 06, 2018 pm 04:06 PM
react

本篇文章主要介紹了淺談react受控組件與非受控組件(小結),現在分享給大家,也給大家做個參考。

我們都知道,有許多的web元件可以被使用者的互動發生改變,例如:元件無法從外部修改;

2.一個透過props來設定value值的元件只能透過外部控制來更新。

最近在使用螞蟻金服出品的一條基於react的ant-design UI組件時遇到一個問題,編輯頁面時input輸入框會展示保存前的數據,但是是用defaultValue就是不起作用,輸入框始終為空值而不是具體的傳入的值。具體編輯頁面中文字方塊相關的程式碼如下:

    ... //render方法上面的内容省略
 <FormItem
   label="问题描述:"
   hasFeedback
   {...props.formItemLayout}
 >
  <Input type="textarea" defaultValue={props.value}/>
</FormItem>
      //render下面的内容省略
      ...
登入後複製

在給程式碼片段所屬的元件傳遞value props後,文字方塊中的預設值一直為空,因為該頁面所在的狀態state中,value所對應的狀態初始值為空,導致後續非同步請求成功後改變value對應的狀態中的值,仍顯示為空。

google一下具體原因,原來React的form表單元件中的defaultValue一經傳遞值後,後續改變defaultValue都會無法運作,被忽略了。

具體來說這是一種react非受控元件,其狀態是在input的react內部控制,不受呼叫者控制。可以使用受控組件來實現。

下面就說說這個受控元件與非受控元件,它們都是基於react的form表單元件元素的,具體也可參考react官網這方面介紹

受控元件

就形式上來說,受控元件就是為某個form表單元件添加value屬性;非受控元件就是沒有添加value屬性的元件;,受控元件的形式如下形式:

render: function() {
  return <input type="text" value="Hello!" />;
 }
登入後複製

新增了value 屬性的表單元件元素其內部是不會維護自己狀態state,元件的value值一旦設定某個特定值就總是這個值,所以需要呼叫者來控制元件value的改變。

這種寫法帶來一個問題:渲染後的input組件的用戶交互,用戶輸入的任何值將不起作用,input輸入框中的值始終為Hello!。這與HTML中input表現不一致。

為此,為了控制該組件,就需要能能夠控制input組件的值,需要藉助其內部的狀態state,即組件內部要維護一個狀態state以便配合input組件的onChange和setState方法來完成對元件的控制;例如對上面形式可以進行封裝一個inputItem元件,其內部維護一個state狀態,具體程式碼如下:

 export default class InputItem extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      value: ""
    }
  }

  componentWillReceiveProps(nextProps){
    this.setState({
      value: nextProps.value
    })
  }

  _onChange(evt){
    this.setState({
      value: evt.target.value
    })
  }

  render(){
    return (
      <input type="text" 
        value={this.state.value} 
        onChange={this._onChange.bind(this)}/>
    );
  }
}
登入後複製

這樣就可以在外部像下面這樣呼叫InputItem元件了:

<InputItem value={this.state.userName} />
登入後複製

這樣就可以控制react的Input元件了,其實就是需要藉助react的有狀態component來完成,因為有狀態component可以內部維護state。

非受控元件

表現形式上,react中沒有加入value屬性的表單元件元素就是非受控元件。表現形式如下:

<input type="text" />
登入後複製

非受控元件在底層實現時是在其內部維護了自己的狀態state;這樣表現出使用者輸入任何值都能反應到元素上。

總結

在使用react component時,都會遇到受控元件或非受控元件;目前,react元件推薦使用stateless component,但使用該形式來實現react component時使用非受控組件到倒是沒有什麼大問題,若是需要控制受控元素就會有出現問題,表現在:

`受控組件`需要主動維護一個內部state狀態的,而`stateless component`是無需維護組件的state狀態的,二者有衝突。
所以,受控元素就不能使用stateless component來創建。

鑑於受控組件與非受控組件的特點,二者應用的地方也有所不同,主要表現在:

  1. 受控元素,一般用在需要動態設定其初始值的情況;例如某些form表單資訊編輯時,input表單元素需要初始顯示伺服器傳回的某個值然後進行編輯。

  2. 非受控元素, 一般用於無任何動態初始值資訊的情況; 例如form表單建立資訊時,input表單元素都沒有初始值,需要使用者輸入的情況

上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

webpack 4.0.0-beta.0版本新功能(詳細教學)

Vue元件和Route的生命週期(詳細教學)

利用SpringMVC解決vue跨域請求

#

以上是詳細解讀react受控組件與非受控組件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

React前後端分離指南:如何實作前後端的解耦與獨立部署 React前後端分離指南:如何實作前後端的解耦與獨立部署 Sep 28, 2023 am 10:48 AM

React前後端分離指南:如何實現前後端的解耦和獨立部署,需要具體程式碼範例在當今的Web開發環境中,前後端分離已經成為一種趨勢。透過將前端和後端程式碼分開,可以讓開發工作更加靈活、高效,並且方便進行團隊協作。本文將介紹如何使用React實現前後端分離,從而實現解耦和獨立部署的目標。首先,我們要先理解什麼是前後端分離。傳統的Web開發模式中,前端和後端是耦合在

如何利用React和RabbitMQ建立可靠的訊息應用 如何利用React和RabbitMQ建立可靠的訊息應用 Sep 28, 2023 pm 08:24 PM

如何利用React和RabbitMQ建立可靠的訊息傳遞應用程式引言:現代化的應用程式需要支援可靠的訊息傳遞,以實現即時更新和資料同步等功能。 React是一種流行的JavaScript庫,用於建立使用者介面,而RabbitMQ是一種可靠的訊息傳遞中間件。本文將介紹如何結合React和RabbitMQ建立可靠的訊息傳遞應用,並提供具體的程式碼範例。 RabbitMQ概述:

React Router使用指南:如何實現前端路由控制 React Router使用指南:如何實現前端路由控制 Sep 29, 2023 pm 05:45 PM

ReactRouter使用指南:如何實現前端路由控制隨著單頁應用的流行,前端路由成為了一個不可忽視的重要部分。 ReactRouter作為React生態系統中最受歡迎的路由庫,提供了豐富的功能和易用的API,使得前端路由的實作變得非常簡單和靈活。本文將介紹ReactRouter的使用方法,並提供一些具體的程式碼範例。安裝ReactRouter首先,我們需要

PHP、Vue和React:如何選擇最適合的前端框架? PHP、Vue和React:如何選擇最適合的前端框架? Mar 15, 2024 pm 05:48 PM

PHP、Vue和React:如何選擇最適合的前端框架?隨著互聯網技術的不斷發展,前端框架在Web開發中起著至關重要的作用。 PHP、Vue和React作為三種代表性的前端框架,每一種都具有其獨特的特徵和優勢。在選擇使用哪種前端框架時,開發人員需要根據專案需求、團隊技能和個人偏好做出明智的決策。本文將透過比較PHP、Vue和React這三種前端框架的特徵和使

Java框架與前端React框架的整合 Java框架與前端React框架的整合 Jun 01, 2024 pm 03:16 PM

Java框架與React框架的整合:步驟:設定後端Java框架。建立專案結構。配置建置工具。建立React應用程式。編寫RESTAPI端點。配置通訊機制。實戰案例(SpringBoot+React):Java程式碼:定義RESTfulAPI控制器。 React程式碼:取得並顯示API回傳的資料。

如何利用React開發一個響應式的後台管理系統 如何利用React開發一個響應式的後台管理系統 Sep 28, 2023 pm 04:55 PM

如何利用React開發一個響應式的後台管理系統隨著互聯網的快速發展,越來越多的企業和組織需要一個高效、靈活、易於管理的後台管理系統來處理日常的操作事務。 React作為目前最受歡迎的JavaScript庫之一,提供了一種簡潔、高效和可維護的方式來建立使用者介面。本文將介紹如何利用React開發一個響應式的後台管理系統,並給出具體的程式碼範例。建立React專案首先

vue.js vs.反應:特定於項目的考慮因素 vue.js vs.反應:特定於項目的考慮因素 Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

react有哪些閉包 react有哪些閉包 Oct 27, 2023 pm 03:11 PM

react有事件處理函數、useEffect和useCallback、高階元件等等閉包。詳細介紹:1、事件處理函數閉包:在React中,當我們在元件中定義事件處理函數時,函數會形成一個閉包,可以存取元件作用域內的狀態和屬性。這樣可以在事件處理函數中使用元件的狀態和屬性,實現互動邏輯;2、useEffect和useCallback中的閉包等等。

See all articles