摘要:受控組件例假設有一個方法非受控組件例接下來我們來看下如果編寫這兩種組件,打個比方我們要自定義一個組件。于是修改后的代碼如下確定使用這個組件的代碼以上就是兩種組件的編寫思路,你可以選擇把你的組件編寫成任意一種,那么使用者使用時也會有所不同。
新手寫 React 組件往往無從入手,怎么寫,什么時候用 props,什么時候用 state 摸不著頭腦。其實是沒有了解到 React 的一些思想。就我個人的經驗大多數的組件都有一定的套路可言,接下來就先介紹下 React 組件的基本思想。
React 組件可以分為可控組件和非可控組件。可控組件意思是組件自身控制自己的狀態(屬性),可以通過自身提供的方法(供調用者使用)來改變自己的狀態。譬如一個 input text 輸入框提供一個 reset 方法,如果要清空用戶輸入則通過獲得 inupt 組件對象,然后調用 reset 方法來做
refs.inputRef.rest() 。
非可控組件的意思是組件本身的狀態(屬性)自己無法更改,只能隨著外部傳入的值(props)而變化。還是拿輸入框清空這一個操作來說,非可控的 input 不通過自己提供方法來改變(維護)自己的狀態(value),只通過外部傳入一個值為空字符串的 value 來做到清空的效果。
reset(){ this.setState({ inputValue: "" }) } render(){ return }
我們拿一個場景來看下完整的代碼(一個 form 中有一個 input,有一個 reset 按妞,點擊 reset 按妞會清空用戶的輸入),看下這兩種組件書寫的區別。
受控組件例:
class App extends React.Component { reset = ()=>{ this.refs.myInput.reset() // 假設 input 有一個 reset 方法 } render() {} }
非受控組件例:
class App extends React.Component { constructor( props ){ super( props ); this.state = { inputValue: "Plz input your text." } } reset = ()=>{ this.setState( { inputValue: "" } ) } render() {} }
接下來我們來看下如果編寫這兩種組件,打個比方我們要自定義一個 alert 組件。我們先從非受控組件說起,因為較簡單。非受控組件所要做的就是把所有狀態提取到組件的 props 中去,render 中就用 props。一個 alert 有哪些最基本的狀態(屬性)呢?我們以最基礎的功能定出一個表示顯示與否的 show,一個表示顯示內容的 content。那么組件代碼如下。
class Alert extends React.Component { constructor( props ) { super( props ) } render() { let style = { display: this.props.show ? "fixed" : "none" } return (); } } Alert.propTypes = { show: React.PropTypes.bool, content: React.PropTypes.string }Alert{ this.props.content }
我們看到最直觀的就是只需要考慮到 props 的可能取值就行,不需要關心如何改變props。而使用這個非可控 alert 的代碼如下:
class App extends React.Component { constructor() { super(); this.state = { alertMsg: "", showAlert: false } this.saveHandler = ()=>{ // ajax success this.setState( { alertMsg: "Save successfully", showAlert: true } ) } } render() {} }
接下來我們看下可控組件的alert怎么寫。可控組件通過方法來供調用者來改變組件的狀態(屬性)。所以暫時我們不定義 props 只定義幾個方法 show(content), hide()。組件代碼如下:
class Alert extends React.Component { constructor( props ) { super( props ) this.state = { content: "", show: false } this.show = ( content )=>{ this.setState( { content: content, show: true } ) } this.hide = ()=>{ this.setState( { show: false } ) } } render() { let style = { display: this.state.show ? "fixed" : "none" } return (); } }Alert{ this.state.content }
我們看到可控組件內部需要用到 state 來自己改變自己的狀態。使用這個可控 alert 的代碼如下:
import { Alert } from "Alert"; class App extends React.Component { constructor() { super(); this.saveHandler = ()=>{ // ajax success this.refs.myAlert.show( "Save Successfully" ); } } render() {} }
但是可控組件有一個問題就是他的初始化狀態如何設置(如何由外部定義組件 state 的初始化值)?由于沒有 props 那么只能通過方法來設置,那么這么做法很別扭。這時可以通過定義 props 把初始化狀態在生成這個組件時傳入,而不必等組件生成完再通過調用方法傳入。于是修改后的代碼如下:
class Alert extends React.Component { constructor( props ) { super( props ) this.state = { content: this.props.defaultContent, show: this.props.defaultShow } this.show = ( content )=>{ this.setState( { content: content, show: true } ) } this.hide = ()=>{ this.setState( { show: false } ) } } render() { let style = { display: this.state.show ? "fixed" : "none" } return (); } } Alert.propTypes = { defaultShow: React.PropTypes.bool, defaultContent: React.PropTypes.string } Alert.defaultProps = { defaultShow: false, defaultContent: "" }Alert{ this.state.content }
使用這個組件的代碼:
class App extends React.Component { constructor() { super(); this.state = { alertMsg: "", showAlert: false } this.saveHandler = ()=>{ // ajax success this.refs.myAlert.show( "Save Successfully" ); } } render() {} }
以上就是兩種 React 組件的編寫思路,你可以選擇把你的組件編寫成任意一種,那么使用者使用時也會有所不同。但是作為一個具有良好可用性的組件,不應該限制使用者的用法,那么下篇將介紹如何編寫一個既可以作為可控組件,也可以作為一個非可控組件的組件寫法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82964.html
摘要:那什么時候使用受控組件,什么時候使用非受控組件呢我們知道受控組件是比較符合我們傳統組件開發的思路的。故最基本的組件編寫套路就這些。 上一篇講了 React 兩種最常見的組件:受控組件和非受控組件。為了可用性,我們一般編寫出來的組件希望支持這兩種特性:可以通過組件自身的方法來改變組件的某(些)狀態,也可以通過 props 的值的變化來改變組件自身的同一個(些)狀態。 組件改變自己的狀態只...
摘要:在深入技術棧一書中,提到了基于的。書里對基于的沒有給出完整的實現,在這里實現并記錄一下實現的思路。在這里最小的組件就是。對比范式與父組件的范式,如果完全利用來實現的,將操作與分離,也未嘗不可,但卻不優雅。 在深入react 技術棧一書中,提到了基于Decorator的HOC。而不是直接通過父組件來逐層傳遞props,因為當業務邏輯越來越復雜的時候,props的傳遞和維護也將變得困難且冗...
摘要:對于高階組件的使用場景如果有相關經驗的或者有不同的見解的希望能夠在我的博客下面留言最近在重構組件時,學習了一些高階組件的編寫思路,其實是由高階函數沿伸而來。 對于高階組件的使用場景如果有相關經驗的或者有不同的見解的希望能夠在我的博客下面留言 最近在重構react組件時,學習了一些高階組件的編寫思路,其實是由高階函數沿伸而來。一般情況我們編寫一個react組件大致樣子如下: class ...
摘要:簡介來構建用戶界面的庫,不是框架關注于層虛擬單向數據流這些概念如何使用下載文件也可以使用,需要用到的模塊介紹是編寫組件的一種語法規范,可以看為是的擴展,它支持將和混寫在一起,最后使用編譯為常規的,方便瀏覽器解析編寫第一個例子使用編寫組件 react簡介 來構建用戶界面的庫,不是框架 關注于view層 虛擬DOM 單向數據流 JSX這些概念 如何使用react 下載文件 rea...
閱讀 1037·2023-04-25 17:51
閱讀 2852·2021-11-23 09:51
閱讀 1470·2021-11-08 13:21
閱讀 2428·2021-09-22 15:14
閱讀 1515·2019-08-30 12:48
閱讀 1076·2019-08-29 12:44
閱讀 1138·2019-08-26 12:21
閱讀 1396·2019-08-26 10:47