props解釋
props就是屬性,是為了描述一個(gè)組件的特征而存在的俏脊。它是父組件傳遞給子組件的艘包,而且一經(jīng)指定,在被指定的組件的生命周期中則不再改變(這就引出后面state這個(gè)屬性了寨典,后面會(huì)講)氛雪,所以要使用,我們首先的在父控件使用子組件時(shí)定義需要的屬性,但不是絕對(duì)的可以添加默認(rèn)屬性耸成,而且props作用不僅僅只是傳遞屬性值报亩,還有約束的作用,后面會(huì)講井氢。
單純的使用
例:在父組件中給子組件定義一個(gè)名字
- 1弦追、創(chuàng)建一個(gè)PropsTest組件,并使用props中的name屬性
/**
* Created by laer on 2018/2/5.
*/
import React,{Component }from 'react';
import {Text}from 'react-native';
export default class PropsTest extends Component{
render(){
//在這里我們使用props中的name屬性
return <Text>{this.props.name}</Text>
}
}
- 2花竞、在父控件中使用剛剛定義的PropsTest組件并設(shè)置name的值
/**
* Created by laer on 2018/2/5.
*/
import React,{Component }from 'react';
import PropsText from './js/Props_Text.js';
export default class HomePager extends Component{
render(){
return<PropsText name='Laitianbing'/>
}
}
但是:如果父組件在使用子組件的時(shí)候并沒(méi)有對(duì)name賦值劲件,然而我們有要用到怎么辦,所以這里我們可以在子組件中設(shè)置默認(rèn)屬性
export default class PropsTest extends Component{
static defaultProps={ name: '小鳴' }
render(){
//在這里我們使用props中的name屬性
return <Text>{this.props.name}</Text>
}
}
父組件使用子組件時(shí):
render(){
return<PropsText />
}
對(duì)props中的屬性值進(jìn)行約束和檢查
-
1约急、引用PropsTypes
注意:過(guò)去我們可以直接使用 React.PropTypes 進(jìn)行屬性確認(rèn)零远,不過(guò)這個(gè)自 React v15.5 起就被移除了。所以現(xiàn)在我們改用 prop-types 庫(kù)代替厌蔽。
-
首先打開(kāi)ws的terminal窗口
terminal窗口 - 其次輸入
npm install --save prop-types
,這npm命令就是安裝prop-types這個(gè)庫(kù)牵辣,類似與安卓依賴庫(kù),但是這個(gè)是安裝一次即可奴饮,更像安卓的插件吧(特別提示:這句命令行中的'--'兩個(gè)端橫線最好是手動(dòng)敲不要復(fù)制纬向,原因系統(tǒng)不同--也不同,不懂沒(méi)關(guān)系戴卜,安裝不了出問(wèn)題你就懂了)
直接復(fù)制有可能報(bào)錯(cuò)
把命令行中的兩個(gè)"--"自己手動(dòng)敲
正常的 - 引用
import PropTypes from 'prop-types';
特別提示:有時(shí)候我們?cè)侔惭b一些庫(kù)的時(shí)候罢猪,一切都正常,但還是安裝不了叉瘩,關(guān)閉IDE膳帕,或是重啟電腦就可以了,實(shí)話我自己也不知道具體的原因薇缅,可能是npm中catch里面庫(kù)關(guān)系亂了
-
2危彩、定義子組件
export default class PropsTest extends Component{
static defaultProps={ name: 'xiao ming',sex:'man'}
//約束的關(guān)鍵就是這里在定義屬性的時(shí)候指定屬性的類型,類似安卓private String name;
static propTypes={
name: PropTypes.string
, age: PropTypes.number
, sex: PropTypes.string.isRequired }
render(){
//在這里我們使用props中的name屬性
return <Text>{this.props.name}+' age:'+{this.props.age}+' sex:'+{this.props.sex}</Text>
}
}
- 3泳桦、在父組件中調(diào)用子組件
export default class HomePager extends Component{
render(){
var params = {name: 'Laitianbing', age: 18, sex: 'man'}
//return<PropsText name={'Laitianbing'} sex={'man'} age={23}/>
return<PropsText name = {params.name} sex = {params.sex} age = {params.age}/>
}
}
但是屬性太多這樣寫(xiě)肯定不行啊汤徽,最新的ES6支持以下寫(xiě)法
return<PropsText {...params}/>//params前面三個(gè)點(diǎn)和Markdown語(yǔ)言的```及安卓的...都是一個(gè)意思就是多個(gè)的意思,就是說(shuō)攜帶多個(gè)屬性或是說(shuō)攜帶全部屬性
變量的解構(gòu)賦值
提示錯(cuò)誤:既然我們加了類型檢驗(yàn)灸撰,肯定是有用的谒府,根據(jù)其他資料拼坎,如果我們傳入錯(cuò)誤的類型,會(huì)在控制臺(tái)中發(fā)現(xiàn)有如下的警告完疫,例如
Warning: Failed propType: Invalid prop
optionalArrayof type
stringsupplied to
Propsva, expected
array.
但是我在測(cè)試的時(shí)候沒(méi)有達(dá)到想要的效果泰鸡,可能是我的IDE WS的問(wèn)題吧
PropTypes約束支持:
- 基本類型, array, bool, func, number, object, string, symbol
- any, 任意不為空對(duì)象
- arrayOf, 指定數(shù)組中項(xiàng)的類型
- element, React 元素
常用指定子級(jí)只傳入一個(gè)級(jí)限制
{
children: React.PropTypes.element.isRequired,
}
- instanceOf, 指定類實(shí)例
- node, 每一個(gè)值的類型都是基本類型,
- objectOf, 指定類型組成的對(duì)象
- oneOf, 參數(shù)是數(shù)組, 指定傳的數(shù)據(jù)為數(shù)組中的值
比如定義一個(gè)action, 他有指定的常量值, 'web', 'app', 'browser',所以接收到 prop 也應(yīng)該是對(duì)應(yīng)的指定值.
{
action: React.PropsTypes.oneOf(['web', 'app', 'browser']),
}
- oneOfType, 參數(shù)是數(shù)組, 指定傳的數(shù)據(jù)為數(shù)組中的類型
- shape, 指定對(duì)象類型內(nèi)部的結(jié)構(gòu)定義
比如需要接收一個(gè) member 參數(shù), member 里面有兩個(gè)值,一個(gè) id,一個(gè) name,現(xiàn)在要設(shè)置id,name的類型
{
member: React.PropTypes.shape({
id: React.PropTypes.number.isRequired,
name:React.PropTypes.string,
}),
}
- 在指定類型后使用isRequired在聲明 prop 是必傳的
自定義校驗(yàn)器 (props, propName, componentName) => {return true}
特別說(shuō)明:我在測(cè)試的時(shí)候,在Text中顯示了中文壳鹤,但是出現(xiàn)了亂碼盛龄,通過(guò)網(wǎng)上說(shuō)的將WS的FileEncondings全部設(shè)置為utf-8,但是并沒(méi)有用芳誓,暫時(shí)沒(méi)找到解決方法余舶,如果有知道的請(qǐng)留言