摘要:默認配置上面的組件默認配置我們是通過操作符來實現。但這并不意味著由決定的顯示形態不能被修改。組件可以在內部通過獲取到配置參數,組件可以根據的不同來確定自己的顯示形態,達到可配置的效果。下一節中我們將介紹小書。
React.js 小書 Lesson11 - 配置組件的 props
本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson11
轉載請注明出處,保留原文鏈接以及作者信息
在線閱讀:http://huziketang.com/books/react
組件是相互獨立、可復用的單元,一個組件可能在不同地方被用到。但是在不同的場景下對這個組件的需求可能會根據情況有所不同,例如一個點贊按鈕組件,在我這里需要它顯示的文本是“點贊”和“取消”,當別的同事拿過去用的時候,卻需要它顯示“贊”和“已贊”。如何讓組件能適應不同場景下的需求,我們就要讓組件具有一定的“可配置”性。
React.js 的 props 就可以幫助我們達到這個效果。每個組件都可以接受一個 props 參數,它是一個對象,包含了所有你對這個組件的配置。就拿我們點贊按鈕做例子:
下面的代碼可以讓它達到上述的可配置性:
class LikeButton extends Component { constructor () { super() this.state = { isLiked: false } } handleClickOnLikeButton () { this.setState({ isLiked: !this.state.isLiked }) } render () { const likedText = this.props.likedText || "取消" const unlikedText = this.props.unlikedText || "點贊" return ( ) } }
從 render 函數可以看出來,組件內部是通過 this.props 的方式獲取到組件的參數的,如果 this.props 里面有需要的屬性我們就采用相應的屬性,沒有的話就用默認的屬性。
那么怎么把 props 傳進去呢?在使用一個組件的時候,可以把參數放在標簽的屬性當中,所有的屬性都會作為 props 對象的鍵值:
class Index extends Component { render () { return () } }
就像你在用普通的 HTML 標簽的屬性一樣,可以把參數放在表示組件的標簽上,組件內部就可以通過 this.props 來訪問到這些配置參數了。
前面的章節我們說過,JSX 的表達式插入可以在標簽屬性上使用。所以其實可以把任何類型的數據作為組件的參數,包括字符串、數字、對象、數組、甚至是函數等等。例如現在我們把一個對象傳給點贊組件作為參數:
class Index extends Component { render () { return () } }
現在我們把 likedText 和 unlikedText 這兩個參數封裝到一個叫 wordings 的對象參數內,然后傳入點贊組件中。大家看到 {{likedText: "已贊", unlikedText: "贊"}} 這樣的代碼的時候,不要以為是什么新語法。之前討論過,JSX 的 {} 內可以嵌入任何表達式,{{}} 就是在 {} 內部用對象字面量返回一個對象而已。
這時候,點贊按鈕的內部就要用 this.props.wordings 來獲取到到參數了:
class LikeButton extends Component { constructor () { super() this.state = { isLiked: false } } handleClickOnLikeButton () { this.setState({ isLiked: !this.state.isLiked }) } render () { const wordings = this.props.wordings || { likedText: "取消", unlikedText: "點贊" } return ( ) } }
甚至可以往組件內部傳入函數作為參數:
class Index extends Component { render () { return () } }console.log("Click on like button!")}/>
這樣可以通過 this.props.onClick 獲取到這個傳進去的函數,修改 LikeButton 的 handleClickOnLikeButton 方法:
... handleClickOnLikeButton () { this.setState({ isLiked: !this.state.isLiked }) if (this.props.onClick) { this.props.onClick() } } ...
當每次點擊按鈕的時候,控制臺會顯示 Click on like button! 。但這個行為不是點贊組件自己實現的,而是我們傳進去的。所以,一個組件的行為、顯示形態都可以用 props 來控制,就可以達到很好的可配置性。
默認配置 defaultProps上面的組件默認配置我們是通過 || 操作符來實現。這種需要默認配置的情況在 React.js 中非常常見,所以 React.js 也提供了一種方式 defaultProps,可以方便的做到默認配置。
class LikeButton extends Component { static defaultProps = { likedText: "取消", unlikedText: "點贊" } constructor () { super() this.state = { isLiked: false } } handleClickOnLikeButton () { this.setState({ isLiked: !this.state.isLiked }) } render () { return ( ) } }
注意,我們給點贊組件加上了以下的代碼:
static defaultProps = { likedText: "取消", unlikedText: "點贊" }
defaultProps 作為點贊按鈕組件的類屬性,里面是對 props 中各個屬性的默認配置。這樣我們就不需要判斷配置屬性是否傳進來了:如果沒有傳進來,會直接使用 defaultProps 中的默認屬性。 所以可以看到,在 render 函數中,我們會直接使用 this.props 而不需要再做判斷。
props 不可變props 一旦傳入進來就不能改變。修改上面的例子中的 handleClickOnLikeButton :
... handleClickOnLikeButton () { this.props.likedText = "取消" this.setState({ isLiked: !this.state.isLiked }) } ...
我們嘗試在用戶點擊按鈕的時候改變 this.props.likedText ,然后你會看到控制臺報錯了:
你不能改變一個組件被渲染的時候傳進來的 props。React.js 希望一個組件在輸入確定的 props 的時候,能夠輸出確定的 UI 顯示形態。如果 props 渲染過程中可以被修改,那么就會導致這個組件顯示形態和行為變得不可預測,這樣會可能會給組件使用者帶來困惑。
但這并不意味著由 props 決定的顯示形態不能被修改。組件的使用者可以主動地通過重新渲染的方式把新的 props 傳入組件當中,這樣這個組件中由 props 決定的顯示形態也會得到相應的改變。
修改上面的例子的 Index 組件:
class Index extends Component { constructor () { super() this.state = { likedText: "已贊", unlikedText: "贊" } } handleClickOnChange () { this.setState({ likedText: "取消", unlikedText: "點贊" }) } render () { return () } }
在這里,我們把 Index 的 state 中的 likedText 和 unlikedText 傳給 LikeButton 。Index 還有另外一個按鈕,點擊這個按鈕會通過 setState 修改 Index 的 state 中的兩個屬性。
由于 setState 會導致 Index 重新渲染,所以 LikedButton 會接收到新的 props,并且重新渲染,于是它的顯示形態也會得到更新。這就是通過重新渲染的方式來傳入新的 props 從而達到修改 LikedButton 顯示形態的效果。
總結為了使得組件的可定制性更強,在使用組件的時候,可以在標簽上加屬性來傳入配置參數。
組件可以在內部通過 this.props 獲取到配置參數,組件可以根據 props 的不同來確定自己的顯示形態,達到可配置的效果。
可以通過給組件添加類屬性 defaultProps 來配置默認參數。
props 一旦傳入,你就不可以在組件內部對它進行修改。但是你可以通過父組件主動重新渲染的方式來傳入新的 props,從而達到更新的效果。
下一節中我們將介紹《React.js 小書 Lesson12 - state vs props》。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89663.html
摘要:因為工作中一直在使用,也一直以來想總結一下自己關于的一些知識經驗。于是把一些想法慢慢整理書寫下來,做成一本開源免費專業簡單的入門級別的小書,提供給社區。本書的后續可能會做成視頻版本,敬請期待。本作品采用署名禁止演繹國際許可協議進行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:的主要作用是用于組件保存控制修改自己的可變狀態。它們都可以決定組件的行為和顯示形態。但是它們的職責其實非常明晰分明是讓組件控制自己的狀態,是讓外部對組件自己進行配置。下一節中我們將介紹小書渲染列表數據。 React.js 小書 Lesson12 - state vs props 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesso...
摘要:傳入一個對象的時候,這個對象表示該組件的新狀態。下一節中我們將介紹小書配置組件的。 React.js 小書 Lesson10 - 組件的 state 和 setState 本文作者:胡子大哈本文原文:http://huziketang.com/books/react/lesson10 轉載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huziketang.com/bo...
摘要:最后抽離出來了一個類,可以幫助我們更好的做組件化。一個組件有自己的顯示形態上面的結構和內容行為,組件的顯示形態和行為可以由數據狀態和配置參數共同決定。接下來我們開始正式進入主題,開始正式介紹。下一節鏈接直達小書基本環境安裝 React.js 小書 Lesson4 - 前端組件化(三):抽象出公共組件類 本文作者:胡子大哈本文原文:http://huziketang.com/books...
摘要:由于會把插入表達式里面數組中的一個個羅列下來顯示。這樣通過這個布局組件,就可以在各個地方高度復用我們的布局。嵌套的結構在組件內部都可以通過獲取到,這種組件編寫方式在編寫容器類型的組件當中非常有用。下一節中我們將介紹小書和屬性。 React.js 小書 Lesson22 - props.children 和容器類組件 本文作者:胡子大哈本文原文:http://huziketang.co...
閱讀 2789·2021-11-24 09:39
閱讀 2548·2021-11-23 09:51
閱讀 1802·2021-11-17 09:33
閱讀 1737·2021-10-22 09:54
閱讀 1870·2021-08-16 11:00
閱讀 3421·2019-08-30 15:53
閱讀 1733·2019-08-30 13:19
閱讀 2902·2019-08-30 12:49