ReactNative從零到完整項(xiàng)目-props使用詳解

項(xiàng)目連接: 93Laer/MyDemo

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 />
    }
默認(rèn)屬性

對(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 propoptionalArrayof typestringsupplied toPropsva, expectedarray.
但是我在測(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)留言

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锹淌,隨后出現(xiàn)的幾起案子匿值,更是在濱河造成了極大的恐慌,老刑警劉巖赂摆,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千扔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡库正,警方通過(guò)查閱死者的電腦和手機(jī)曲楚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褥符,“玉大人龙誊,你說(shuō)我怎么就攤上這事∨玳梗” “怎么了趟大?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)铣焊。 經(jīng)常有香客問(wèn)我逊朽,道長(zhǎng),這世上最難降的妖魔是什么曲伊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任叽讳,我火速辦了婚禮,結(jié)果婚禮上坟募,老公的妹妹穿的比我還像新娘岛蚤。我一直安慰自己,他們只是感情好懈糯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布涤妒。 她就那樣靜靜地躺著,像睡著了一般赚哗。 火紅的嫁衣襯著肌膚如雪她紫。 梳的紋絲不亂的頭發(fā)上硅堆,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音贿讹,去河邊找鬼渐逃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛围详,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祖屏,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼助赞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了袁勺?” 一聲冷哼從身側(cè)響起雹食,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎期丰,沒(méi)想到半個(gè)月后群叶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钝荡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年街立,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埠通。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赎离,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出端辱,到底是詐尸還是另有隱情梁剔,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布舞蔽,位于F島的核電站荣病,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏渗柿。R本人自食惡果不足惜个盆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朵栖。 院中可真熱鬧砾省,春花似錦、人聲如沸混槐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)声登。三九已至狠鸳,卻和暖如春揣苏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背件舵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工卸察, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铅祸。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓坑质,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親临梗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涡扼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)盟庞,斷路器吃沪,智...
    卡卡羅2017閱讀 134,699評(píng)論 18 139
  • 以下內(nèi)容是我在學(xué)習(xí)和研究React時(shí),對(duì)React的特性什猖、重點(diǎn)和注意事項(xiàng)的提取票彪、精練和總結(jié),可以做為React特性...
    科研者閱讀 8,242評(píng)論 2 21
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,073評(píng)論 2 35
  • 對(duì)于所謂尖子班的學(xué)生,我一直覺(jué)得他們一群是沒(méi)什么能力卻自以為是的家伙摇零,兩年來(lái)接手的尖子班都給了我一樣的感覺(jué)垮耳。 或許...
    荒唐的米兒閱讀 251評(píng)論 0 2
  • 文 | 大漠獨(dú)狼 圖 | 大漠獨(dú)狼 1 朵朵放寒假的次日,就去參加小瑩新組織的西葡冬令營(yíng)了遂黍。冬令營(yíng)回來(lái)的第二日终佛,時(shí)...
    大漠獨(dú)狼閱讀 501評(píng)論 0 1