React 從入門到進階之路(八)

豐寸發表於2019-05-22

之前的文章我們介紹了 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:驗證父元件傳值的型別合法性

最後的結果為:

 

相關文章