網(wǎng)上也看了很多關(guān)于 props和state放在一塊兒對(duì)比的文章。
state感覺(jué)沒(méi)什么特別需要說(shuō)明的,就是一個(gè)狀態(tài)機(jī)的變量,主要是跟用戶交互相關(guān)。
而props更多的是一個(gè)頁(yè)面間傳遞屬性變量來(lái)使用的東西。
參考鏈接 阮一峰 關(guān)于React入門(mén)
由于這篇參考問(wèn)是大神在15年寫(xiě)的。里面大部分的內(nèi)容都是ES5的.
下面是我整理的一些個(gè)人的理解。
RN的props理解
props是用來(lái)組見(jiàn)之間單項(xiàng)傳值用的。類似于我們OC中的 @property.區(qū)別在于以下三點(diǎn)
一、this.props不需要像OC中一樣,需要提前聲明。聲明的情況是非必要的。
(這里先不去考慮復(fù)雜情況下的 this.props.children)
不同于C或者OC,我們的屬性值分為私有和共有,而且需要聲明。
在JS中,直接輸入一個(gè)this.props.屬性名就可以定義了。通常都是在組件的調(diào)用時(shí)賦值,而在運(yùn)行時(shí)生效。
例如
A組件中聲明了調(diào)用我A組件的時(shí)候,有一個(gè)屬性變量name, 那么你在跨組件調(diào)用A的時(shí)候,可以對(duì)這個(gè)name作賦值(也可以不賦值,非必要)
class A extends Component {
render() {
return (<Text>Hello {this.props.name}!</Text>);
}
}
在B組件中調(diào)用A組件,并給name賦值,這樣輸出的時(shí)候就會(huì)顯示Hello了。
如果上面的this.props.name不是寫(xiě)在這種必須顯示的地方,那么這個(gè)name在A組件賦值的時(shí)候,也不一定要賦值。
class B extends Component {
render() {
return (
<View style={{alignItems: 'center'}}>
<A name='Hello' />
</View>
);
}
}
簡(jiǎn)而言之,通過(guò)
this.props.屬性名相當(dāng)于一種懶加載的屬性聲明,只在調(diào)用到的時(shí)候被替換。
二、如果我們需要聲明某個(gè)組件中必須包含某種變量類型的某變量,就要用到PropTypes做聲明了。
例如以下代碼段。
Mytitle組件有一個(gè)title屬性。PropTypes 告訴 React,這個(gè) title 屬性是必須的,而且它的值必須是字符串
var MyTitle = React.createClass({
static propTypes: {
title: React.PropTypes.string.isRequired,
},
render: function() {
return (
<View>
<Text> Hello {this.props.title} </Text>
</View>
);
}
});
三、如果某屬性變量需要賦初始的默認(rèn)值,則也需要用靜態(tài)去作賦值。
設(shè)置默認(rèn)屬性。訪問(wèn)還是通過(guò)this.props.duration
- ES5的寫(xiě)法:
getDefaultProps(){ return {duration:1000} } - ES6
static defaultProps = { duration:1000, }