React Native 入門(五) - Props(屬性)

當前 RN 版本:0.49
操作環境:Windows 10

Props(屬性)是組件在被創建的時候就能夠使用的各種參數,通常是該組件被使用時傳遞過來的或者是該組件已經設置的默認參數。

傳遞屬性

我們有兩個文件 App.js 和 MyView.js:

App.js:

import React, { Component } from 'react';
import MyView from './MyView';

export default class App extends Component<{}> {
  render() {
    return <MyView name="小明"/>
  }
}

MyView.js:

import React, {Component} from 'react';
import {
  Text
} from 'react-native';

export default class MyView extends Component {
  render() {
    return <Text
        style={{backgroundColor: 'cyan'}}>
      你好{this.props.name}
    </Text>
  }
}

在 MyView 中我們渲染顯示一個文本組件,顯示的內容包含了傳遞過來的 name 屬性。在 App 中我們使用了 <MyView/> 并且傳遞了一個值為“小明”的 name 屬性,這樣在 MyView 中我們就可以獲取到 name。運行效果如下:

默認屬性與格式檢查

當 MyView 沒有接受到傳遞的屬性時,我們可以設置默認屬性。修改代碼如下:

export default class MyView extends Component {
  static defaultProps = {
    age: 12,
    sex: '男'
  }

  render() {
    return <Text
        style={{backgroundColor: 'cyan'}}>
      你好{this.props.name}{'\n'}年齡{this.props.age}{'\n'}性別{this.props.sex}
    </Text>
  }
}

通過 static defaultProps = {} 這種固定的格式來給一個組件添加默認屬性。我們在 App 中只傳遞了一個 name,所以 age 和 sex 都會從默認屬性中讀取,效果如下:

屬性也可以設置格式檢查,在設置之前我們需要先通過控制臺導入 prop-types。prop-types 是 fb 推出的專門用來做類型檢查的一個模塊,以前集成在 React 中,后來被單獨拿了出來。

yarn add prop-types

然后在 MyView 中導入:

import PropTypes from 'prop-types';

通過 static propTypes = {} 這種固定格式來設置屬性的格式,比如說我們將 age 設置為 number 類型:

static propTypes = {
    name: PropTypes.string,
    age: PropTypes.number,
    sex: PropTypes.string
  }

然后我們在 App 中故意傳遞一個 string 類型的 age:

render() {
    return <MyView
        name="小明"
        age="12"
    />
  }

再次運行就會彈出一個黃色的警告提示我們格式錯誤,age 期望是 number 類型,卻得到了 string 類型。

另外還可以設置必須要傳遞的屬性,修改如下:

static propTypes = {
    name: PropTypes.string,
    age: PropTypes.number,
    sex: PropTypes.string.isRequired
  }

PropTypes.string.isRequired 表示 sex 是必須要傳遞的 string 類型的屬性,由于 App 中只傳遞了 name 與 age,所以運行的時候會彈出下面的警告。不要忘記把 defaultProps 中的 sex 屬性刪除,有默認屬性值的話,是永遠不會有警告的。

更多的格式枚舉請參考官方文檔:facebook/prop-types

延展操作符

延展操作符 ... 是 ES6 語法的新特性,具體的說明可以參考 ECMAScript 6 入門

我們修改代碼如下:

App.js:

import React, {Component} from 'react';
import MyView from './MyView';

export default class App extends Component<{}> {
  render() {
    var params = {name: '小明', age: 12, sex: '男'}
    return <MyView {...params}/>
  }
}

我們定義了一個對象 params,它包含了好幾個屬性。{...params} 表示的是將 params 中所有的屬性傳遞給 MyView 。

MyView.js:

import React, {Component} from 'react';
import PropTypes from 'prop-types';
import MySecondView from './MySecondView';

export default class MyView extends Component {

  static defaultProps = {
    age: 22
  }

  static propTypes = {
    name: PropTypes.string,
    age: PropTypes.number,
    sex: PropTypes.string.isRequired
  }

  render() {
    return <MySecondView {...this.props}/>
  }
}

這里我們又通過 {...this.props} 將 MyView 獲取到的所有屬性傳遞給了 MySecondView 。

MySecondView:

import React, {Component} from 'react';
import {
  Text
} from 'react-native';

export default class MySecondView extends Component {
  render() {
    return <Text
        style={{backgroundColor: 'cyan'}}>
      你好{this.props.name}{'\n'}年齡{this.props.age}{'\n'}性別{this.props.sex}
    </Text>
  }
}

在 MySecondView 中,我們就可以使用 name、age 以及 sex 這些屬性了。運行效果和我們預想的一樣:

解構賦值

解構賦值也是 ES6 語法的新特性,極大的簡化了代碼,增強了代碼的可讀性。

在上面代碼的基礎上,我們在 App 中如果只想把 params 的 name 和 sex 傳遞過去,可以有如下寫法:

export default class App extends Component<{}> {
  render() {
    var params = {name: '小明', age: 12, sex: '男'}
    var {name: name, sex: sex} = params;
    return <MyView
        name={name}
        sex={sex}
    />
  }
}

由于我們只傳遞了 name 和 sex,那么 age 就顯示默認值了:

我們講一下這行代碼的意思:

2 處是我們新定義的名為 name 和 sex 的新變量,而 1 處的 name 和 sex 代表的是 params 中的屬性,這行代碼的意思是我們新定義了兩個變量 name 和 sex,它們的值分別是 params.name 和 params.sex 。并且在屬性名稱和變量名稱相同時,我們可以簡寫成如下形式:

var {name, sex} = params;

關于解構賦值的詳細介紹,可以參考這篇博文:【探秘ES6】系列專欄(六):解構賦值

文章同步自 CSDN:http://blog.csdn.net/qq_24867873/article/details/78342908

歡迎關注我的微信公眾號
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • Address:https://www.zybuluo.com/XiangZhou/note/208532 Exp...
    天蠍蒗漫閱讀 11,363評論 2 55
  • 從聽到叫她的名字準備開始,她就從座位上站了起來,半低著頭,在過道的墻角來來回回的踱著,兩只手局促不安的相互揉搓,嘴...
    青三1219閱讀 640評論 2 51
  • 最近的《得到》內容太多,有點招架不住,這不,昨天發現又上新一個欄目,叫《寧向東的清華管理學課》,一直對管理很感興趣...
    絢爛秋葉閱讀 491評論 0 4
  • 我們常說愛一個人不需要理由, 其實是為了表達自己對愛情的純粹。 我們經常說分手需要理由, 其實是為了撇清關系,推卸...
    糖二傻子閱讀 206評論 0 0