之前的文章我們介紹了 React中的元件、父子元件、React props父元件給子元件傳值、子元件給父元件傳值、父元件中通過refs獲取子元件屬性和方法。接下來我們將介紹 React propTypes defaultProps。
之前我們已經根據 create-react-app 模組建立了一個 React 專案,並定義 App.js 為根元件,即父元件,Home.js 為子元件。我們看一下兩個元件的程式碼:
App.js
1 import React, {Component} from 'react'; 2 import Home from './components/Home'; 3 4 class App extends Component { 5 constructor(props) { 6 super(props); 7 this.state = { 8 title: "I am father", 9 age: 30, 10 info: "I like React", 11 } 12 } 13 14 render() { 15 return ( 16 <div className="App"> 17 <Home title={this.state.title} age={this.state.age}/> 18 </div> 19 ); 20 } 21 } 22 23 export default App;
Home.js
1 import React, {Component} from 'react'; 2 import PropTypes from 'prop-types'; 3 4 class Home extends Component { 5 constructor(props) { 6 super(props); 7 this.state = { 8 name: "zhangsan", 9 } 10 } 11 12 render() { 13 return ( 14 <div> 15 <p>Hello {this.state.name}</p> 16 17 {/*父元件將 title 傳過來*/} 18 {/*輸出結果:I am father*/} 19 <p>{this.props.title}</p> 20 21 {/*父元件將 age 傳過來,在下面的 defaultProps 中再重新定義*/} 22 {/*父元件將 age 傳過來,在下面的 propTypes 定義 age 必須為 number 型別*/} 23 {/*輸出結果:30*/} 24 <p>{this.props.age}</p> 25 26 {/*父元件沒有將 info 傳過來,在下面的 defaultProps 中定義*/} 27 {/*輸出結果:I like React too*/} 28 <p>{this.props.info}</p> 29 </div> 30 ); 31 } 32 } 33 34 Home.defaultProps = { 35 age: 60, 36 info: "I like React too", 37 } 38 39 Home.propTypes = { 40 age: PropTypes.number 41 } 42 43 export default Home;
在父元件 App.js 中,通過 <Home /> 將子元件 Home 掛載到父元件 App 上,然後將 title 和 age 傳遞給子元件。
在子元件 Home 中,我們通過 this.props 屬性來獲取父元件 App 傳遞過來的值,但是我們在子元件 Home 中定義了一個 defaultProps 屬性,並宣告瞭 age 和 info 變數。
在輸出結果中我們可以看出:
如果在子元件的 defaultProps 屬性中沒有更改父元件傳遞過來的值,那麼將按父元件傳遞過來的值輸出,
如果在子元件的 defaultProps 屬性中更改了父元件傳遞過來的值,那麼還是按父元件傳遞過來的值輸出,
如果父元件並沒有傳遞過來某值,但是在子元件的 defaultProps 屬性中定義了該值,那麼將按照定義的值輸出。
在子元件 Home 中我們還通過 import PropTypes from ‘prop-types’; 引入了 PropTypes 模組,並定義了一個 propTypes 屬性定義了一個 age: PropTypes.number 的約束,那麼如果父元件傳遞過來的 age 如果不是 number 型別的話,則會在控制檯報錯。
結論:
defaultProps:父子元件傳值中,如果父元件呼叫子元件的時候不給子元件傳值,可以在子元件中使用defaultProps定義的預設值
propTypes:驗證父元件傳值的型別合法性
最後的結果為: