詳細解讀react受控組件與非受控組件
本篇文章主要介紹了淺談react受控組件與非受控組件(小結),現在分享給大家,也給大家做個參考。
我們都知道,有許多的web元件可以被使用者的互動發生改變,例如:,
1.一個維護它自己state裡的value值的元件無法從外部修改;
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來創建。
鑑於受控組件與非受控組件的特點,二者應用的地方也有所不同,主要表現在:
受控元素,一般用在需要動態設定其初始值的情況;例如某些form表單資訊編輯時,input表單元素需要初始顯示伺服器傳回的某個值然後進行編輯。
非受控元素, 一般用於無任何動態初始值資訊的情況; 例如form表單建立資訊時,input表單元素都沒有初始值,需要使用者輸入的情況
上面是我整理給大家的,希望今後會對大家有幫助。
相關文章:
webpack 4.0.0-beta.0版本新功能(詳細教學)
#以上是詳細解讀react受控組件與非受控組件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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