10、React系列之--props屬性

版權(quán)聲明:本文為博主原創(chuàng)文章迟杂,未經(jīng)博主允許不得轉(zhuǎn)載刽沾。

PS:轉(zhuǎn)載請(qǐng)注明出處
作者:TigerChain
地址:http://www.reibang.com/p/fa81cebac3ef
本文出自TigerChain簡(jiǎn)書

React系列教程

1、React之props屬性

我們想要在組件之間進(jìn)行傳值排拷,那么props屬性就起到了這個(gè)作用,在React中props和state是兩個(gè)非常非常非常重要的屬性一定要掌握這兩個(gè)侧漓。(以下都是使用ES5的寫法,沒有特殊說(shuō)明的都是使用ES5寫法)

Note:屬性是用于設(shè)置默念值攻泼,不改變的值使用props,而改變的值我們要使用state火架,我們后面章節(jié)再說(shuō)

2鉴象、React之props屬性基本用法

1、基本用法

<Component data="測(cè)試props"/>

在Component組件中使用this.props.data就可以取得data中的值(其中data這個(gè)字段可以任意指定但是組件中的和獲取props要對(duì)應(yīng)就好了)

2何鸡、廢話不多說(shuō)纺弊,直接上例子

在這一節(jié)中我們使用browserify來(lái)管理js代碼,如果不知道browserify可以查看此節(jié)

這里假設(shè)你把browserify環(huán)境都搭建起來(lái)了

PS:本文最后的Demo是使用webpack+yarn來(lái)完成骡男,這也是主流的方式淆游,但是你掌握了browserify也算是多掌握一門技術(shù)。

(1)隔盛、我們新建props文件夾犹菱,并且搭建browserify環(huán)境

具體看browserify這一節(jié):http://www.reibang.com/p/93a112dc62b9

(2)、新建index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>props用法</title>
  </head>
  <body>
    <div id="example"></div>
    <script src="bundle.js"></script>
  </body>
</html>

(3)吮炕、新建component文件夾(在這里我們體驗(yàn)一下組件化的思想)腊脱,在component文件夾中新建一個(gè)Props.js(這就是一個(gè)組件)

//引入所需要的類
var React = require('react');
var Propos = React.createClass({
    render: function() {
        return (
            <div>
                {this.props.data}
            </div>
        );
    }
});
//將此類暴漏出去 供個(gè)部使用
module.exports = Propos;

(4)在props目錄下新建index.js文件,并且使用require引入Props組件

// index.js
var React = require('react');
var ReactDOM = require('react-dom');
var Props = require('./component/Props.js') ;

ReactDOM.render(
 <Props data="我是props屬性"/>,
  document.getElementById('example')
);

5龙亲、我們使用browserify來(lái)將index.js轉(zhuǎn)化成bundle.js

browserify -t [ babelify ] index.js -o bundle.js

當(dāng)然我們也可以使用watchify

6陕凹、最后我們?cè)跒g覽器中查看結(jié)果

props_single.png

Note:props屬性不僅可以從爸爸傳遞給兒子組件,也可以從兒子傳遞給孫子鳄炉,可以一直這樣傳遞下去杜耙,按需傳遞

3、多個(gè)值的傳遞

在上面我們把父組件屬性傳遞到子組件了拂盯,這是一個(gè)屬性的傳遞佑女,那么如何傳遞多個(gè)屬性值呢,大家可能想到了谈竿,那就定義多個(gè)屬性值就好了么团驱。步驟如下:

1、普通方法

  • 1空凸、修改index.js
props_mutil.png

從圖可以看出我們只是修改了紅色框中的Props組件中的屬性值

<Props data={"我是props屬性1"} data2={"我是屬性值2"} />
  • 2店茶、修改Props.js來(lái)接收傳遞過(guò)來(lái)的值
props_propsmodify.png

同樣我們看只是修改了紅色框聽部分,就是接收了props屬性值并且顯示

render: function() {
        return (
            <div>
                {this.props.data}
                //新增加的代碼
                <br/>
                {this.props.data2}
            </div>
        );
    }
  • 3劫恒、刷新瀏覽器看效果
props_mutl_result.png

從以上的結(jié)果我們確實(shí)收到了多個(gè)參數(shù)值,但是有一個(gè)問(wèn)題轿腺,如果有十個(gè)參數(shù)两嘴,我就得寫十個(gè)字段屬性,20個(gè)呢族壳,這有點(diǎn)扯淡吧憔辫, 有沒有什么好的辦法呢?我能這樣問(wèn)仿荆,答案是肯定的贰您,下面我們來(lái)改造一下上面的代碼

2坏平、推薦方法

我們使用JSX的擴(kuò)展語(yǔ)法來(lái)傳遞屬性值,也就是...語(yǔ)法

return <Commponent{...this.props}more="values" />;

我們廢話不多說(shuō),我們直接來(lái)上代碼看效果,還是在上面代碼的基礎(chǔ)上修改

  • 1锦亦、修改index.js
props_jsx_extend.png

從圖中我們可以看到舶替,我添加了圖中紅色框中的部分,在這里我偷偷也添加了一個(gè)test()方法杠园,也就是說(shuō)明了props不僅僅可以傳遞參數(shù)顾瞪,對(duì)象也可以是一個(gè)方法,以下是修改的代碼

//定義一個(gè)屬性的對(duì)象
var propsData = {
    name:"JunJun",
    address:"china",
    height:"175cm"
}
//添加一個(gè)測(cè)試方法
function test(param){
    //把傳遞過(guò)來(lái)的參數(shù)重新拼接臧一個(gè)新的字符串
    let newParsm = param.concat("junjun") ;
    console.log(newParsm);
}

ReactDOM.render(
 <Props data={{...propsData}} data2={"我是屬性值2"}  data3={test}/>,
  document.getElementById('example')
);

  • 2抛蚁、修改Props.js
modify_props.png

這里也沒有什么好說(shuō)的陈醒,我們就是把傳遞過(guò)來(lái)的屬性調(diào)用了一下,讓其工作而已瞧甩,以下是修改過(guò)的代碼

    //測(cè)試方法點(diǎn)擊事件
    handlerClick:function(){
        {this.props.data3("我是測(cè)試方法:")}
    },
    render: function() {
        return (
            <div>
                名字:{this.props.data.name}
                <br/>
                地址:{this.props.data.address}
                <br />
                身高:{this.props.data.height}
                <br />
                {this.props.data2}

                
                <br />
                <button onClick={this.handlerClick}>測(cè)試方法</button>
            </div>
        );
    }
  • 3钉跷、刷新瀏覽器,看結(jié)果
props_jsx_extends_result.png

在這里我打開了chrome的調(diào)試工具肚逸,我們可以看到,當(dāng)我們點(diǎn)擊測(cè)試方法按鈕的時(shí)候就會(huì)調(diào)用index.js中的test()方法爷辙,打印出了我是測(cè)試的信息,并且從瀏覽器的結(jié)果中我們也可以看出吼虎,使用JSX擴(kuò)展語(yǔ)法...傳遞過(guò)來(lái)的屬性都被接收到了犬钢。這樣是不是比前面一個(gè)一個(gè)屬性參數(shù)的傳遞方便多了,代碼也規(guī)整了思灰。

test()方法的啟示

很好了說(shuō)明了玷犹,兒子組件如何調(diào)用父親的方法,也是一種將父親方法暴漏的方式

3洒疚、默認(rèn)屬性

細(xì)心的朋友可能早都發(fā)現(xiàn)了歹颓,在多個(gè)值的傳遞中我們發(fā)現(xiàn)Props.js對(duì)應(yīng)的圖片中有這么一段代碼

//設(shè)置默認(rèn)屬性,返回一個(gè)json對(duì)象
getDefaultProps(){
        return {
            data:"默認(rèn)"
        }
    },

這段代碼是什么意思呢油湖?這段代碼其實(shí)是為屬性設(shè)置默認(rèn)值巍扛,也就是說(shuō)一個(gè)組件沒有傳遞任何屬性的時(shí)候,我們調(diào)用了this.props.data就會(huì)使用默認(rèn)的屬性值乏德。注意這個(gè)方式是在ES5寫法中使用的撤奸,ES6寫法會(huì)有所不同

4、屬性校驗(yàn)

在React中屬性是可以校驗(yàn)的喊括,比如胧瓜,我們要記錄一個(gè)人的信息,名字是必須的并且是一個(gè)字符串郑什,年齡是一個(gè)數(shù)字府喳,愛好是一個(gè)數(shù)組等等這些要求和規(guī)范在React中使用propTypes

1、使用方法

  • 1蘑拯、在ES5中使用方法
propTypes:{
  // 可以聲明 prop 為指定的 JS 基本類型钝满。默認(rèn)
  // 情況下兜粘,這些 prop 都是可傳可不傳的。
  optionalArray: React.PropTypes.array,
  optionalBool: React.PropTypes.bool,
  optionalFunc: React.PropTypes.func,
  optionalNumber: React.PropTypes.number,
  optionalObject: React.PropTypes.object,
  optionalString: React.PropTypes.string,
  optionalSymbol: React.PropTypes.symbol,
  ....
}
  • 2弯蚜、在ES6中使用方法
MyComponent.propTypes = {
  // You can declare that a prop is a specific JS    primitive. By default, these
  // are all optional.
  optionalArray: React.PropTypes.array,
  optionalBool: React.PropTypes.bool,
  optionalFunc: React.PropTypes.func,
  optionalNumber: React.PropTypes.number,
  optionalObject: React.PropTypes.object,
  optionalString: React.PropTypes.string,
  optionalSymbol: React.PropTypes.symbol,
  ....
  }

2孔轴、實(shí)例代碼

  • 1、我們?cè)赑rops.js中添加以下代碼
//規(guī)范傳遞過(guò)來(lái)的屬性范圍
propTypes:{
    //年齡必須為數(shù)字 
    age: React.PropTypes.number,
},

以上規(guī)范了age屬性必須是數(shù)字類型

  • 2熟吏、修改index.js中的ReactDOM.render()方法
ReactDOM.render(
 <Props data={{...propsData}} age={"10"}  data3={test()}/>,
  document.getElementById('example')
);

這們這里估計(jì)給age屬性傳了一個(gè)字符串"10"距糖,我們來(lái)看看結(jié)果

propstype.png

我們看到了瀏覽器報(bào)了一個(gè)警告,意思就是說(shuō)age屬性需要一個(gè)數(shù)字牵寺,你傳了一個(gè)字符串悍引,這就校驗(yàn)了props屬性,對(duì)于這個(gè)例子我們只需要把a(bǔ)ge屬性傳遞成數(shù)字即可解決掉警告問(wèn)題

5帽氓、關(guān)于this.props.children

1趣斤、this.props.children屬性

this.props屬性和組件的屬性值是一一對(duì)應(yīng)的,但是有一個(gè)例外就是this.props.children黎休,它表示的是所有子節(jié)點(diǎn)的屬性

2浓领、不多說(shuō),直接上代碼

我們?cè)谏厦娴幕A(chǔ)上改代碼

  • 1势腮、在component中新建PropsChildrenjs
var React = require('react');

var PropsChildren = React.createClass({

    /**
     * 渲染每個(gè)元素
     * @return {[type]} [description]
     */
     renderList(){
        return(
            React.Children.map(this.props.children, function (child) {
                return <li>{child}</li>;
            }));
     },
     render: function() {
        return (
            <div>
                <br />
                遍歷取提t(yī)his.props.children的值   
                <ul>
                {this.renderList()}
                </ul>
            </div>
            );
        }
    });


module.exports = ProposChildren; 


  • 2联贩、修改Props.js
//引入所需要的類
var React = require('react');
var ProposChildren = require('./ProposChildren.js') ;

var Propos = React.createClass({
    /**
     * 用來(lái)設(shè)置默認(rèn)值
     * @return {[type]} [description]
     */
    getDefaultProps(){
        return {
            data:"默認(rèn)"
        }
    },
    //規(guī)范傳遞過(guò)來(lái)的屬性范圍
    propTypes:{
      //年齡必須為數(shù)字 
      age: React.PropTypes.number,
    },

    handlerClick:function(){
        {this.props.data3("我是測(cè)試方法:")}
    },

    render: function() {
        return (
            <div>

                名字:{this.props.data.name}
                <br/>
                地址:{this.props.data.address}
                <br />
                身高:{this.props.data.height}
                <br />
                年齡:{this.props.age}
                
                <br />
                <button onClick={this.handlerClick}>測(cè)試方法</button>
                //新添加的部分
                <PropsChildren>
                    <p>我是p標(biāo)簽</p>
                    <h4>我是h4</h4>
                    <button>我是button</button>
                    <label>我是label</label>
                    <text>我是文本組件text</text>
                </PropsChildren>
            </div>
        );
    }

});

module.exports = Props;

修改的部分是

propos_children.png
  • 3、查看結(jié)果
props_child_result.png

從圖中我們可以知道我們就遍歷(使用this.props.children)取得了標(biāo)簽的屬性值

到此這止我們就介紹完了props屬性

本章demo的地址

https://github.com/tigerchain/react-lesson/tree/master/lesson02/08-props 如果大家喜歡捎拯,可以給個(gè) star 鼓勵(lì)一下

ps:此demo使用的是yarn+webpack寫的泪幌,以后的demo沒有特別說(shuō)明都是基于yarn+webpack去編寫了,并且使用的ES6語(yǔ)法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市署照,隨后出現(xiàn)的幾起案子祸泪,更是在濱河造成了極大的恐慌,老刑警劉巖建芙,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件没隘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡禁荸,警方通過(guò)查閱死者的電腦和手機(jī)右蒲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赶熟,“玉大人品嚣,你說(shuō)我怎么就攤上這事【螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵罩旋,是天一觀的道長(zhǎng)啊央。 經(jīng)常有香客問(wèn)我眶诈,道長(zhǎng),這世上最難降的妖魔是什么瓜饥? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任逝撬,我火速辦了婚禮,結(jié)果婚禮上乓土,老公的妹妹穿的比我還像新娘宪潮。我一直安慰自己,他們只是感情好趣苏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布狡相。 她就那樣靜靜地躺著,像睡著了一般食磕。 火紅的嫁衣襯著肌膚如雪尽棕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天彬伦,我揣著相機(jī)與錄音滔悉,去河邊找鬼。 笑死单绑,一個(gè)胖子當(dāng)著我的面吹牛回官,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搂橙,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼歉提,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了份氧?” 一聲冷哼從身側(cè)響起唯袄,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜗帜,沒想到半個(gè)月后恋拷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厅缺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蔬顾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湘捎。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诀豁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窥妇,到底是詐尸還是另有隱情舷胜,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布活翩,位于F島的核電站烹骨,受9級(jí)特大地震影響翻伺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沮焕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一吨岭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峦树,春花似錦辣辫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至歪赢,卻和暖如春化戳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埋凯。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工点楼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人白对。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓掠廓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親甩恼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蟀瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 最近看了一本關(guān)于學(xué)習(xí)方法論的書,強(qiáng)調(diào)了記筆記和堅(jiān)持的重要性条摸。這幾天也剛好在學(xué)習(xí)React悦污,所以我打算每天堅(jiān)持一篇R...
    gaoer1938閱讀 1,670評(píng)論 0 5
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,048評(píng)論 2 35
  • 本筆記基于React官方文檔,當(dāng)前React版本號(hào)為15.4.0钉蒲。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,649評(píng)論 14 128
  • 自己最近的項(xiàng)目是基于react的切端,于是讀了一遍react的文檔,做了一些記錄(除了REFERENCE部分還沒開始讀...
    潘逸飛閱讀 3,339評(píng)論 1 10
  • 文/公羽依娜 1茵瀑、 最近,我去參加了5場(chǎng)面試躬厌,拿到了3個(gè)offer马昨,最終,將目標(biāo)鎖定在一家跟自己職業(yè)規(guī)劃相匹配的培...
    公羽依娜閱讀 1,505評(píng)論 1 13