React Native(React)componentWillReceiveProps函數(shù)

BG:

componentWillReceiveProps是組件的一個很重要的生命周期函數(shù)赠制。

componentWillReceiveProps:

props的使用和componentWillReceiveProps息息相關僚碎,
props發(fā)生變化時執(zhí)行componentWillReceiveProps。

componentWillReceiveProps(nextProps,nextContext){
        console.log(`this.props-->${JSON.stringify(this.props)}`);
        console.log(`nextProps-->${JSON.stringify(nextProps)}`);
        console.log(`nextContext-->${JSON.stringify(nextContext)}`);
    }

總結:

1.組件初次渲染時不會執(zhí)行componentWillReceiveProps砸烦;

2.當props發(fā)生變化時執(zhí)行componentWillReceiveProps弃鸦;

3.在這個函數(shù)里面,舊的屬性仍可以通過this.props來獲却倍弧唬格;

4.此函數(shù)可以作為 react 在 prop 傳入之后, render() 渲染之前更新 state 的機會颜说。即可以根據(jù)屬性的變化购岗,通過調(diào)用this.setState()來更新你的組件狀態(tài),在該函數(shù)中調(diào)用 this.setState() 將不會引起第二次渲染门粪。

5.也可在此函數(shù)內(nèi)根據(jù)需要調(diào)用自己的自定義函數(shù)喊积,來對prop的改變做出一些響應。

注意:
當父組件向子組件傳遞引用類型(或復合類型玄妈,比如對象乾吻、數(shù)組等)的屬性時,要注意打印的this.props和nextProps的內(nèi)容是一致的拟蜻,因為引用類型在內(nèi)存中只有一份绎签,傳值時是淺拷貝,示例如下:

1酝锅、基本類型的屬性
//子組件TestReceivePropsComponent:
export class TestReceivePropsComponent extends Component { 
    constructor(props) {
        super(props);
    };
    componentWillReceiveProps(nextProps,nextContext){
        console.log(`this.props-->${JSON.stringify(this.props)}`);
        console.log(`nextProps-->${JSON.stringify(nextProps)}`);
        console.log(`nextContext-->${JSON.stringify(nextContext)}`);
    }

    render(){
        return (
            <View style={styles.container}>
                <Text>子組件顯示--姓名:{this.props.name}</Text>
            </View>
        );
    }
}

//父組件:
render() {
        console.log(`ComponentWillReceivePropsPage--render`);
        return (
            <ScrollView style={styles.container}>
                 <TextInput
                    ref="inputLoginName"
                    autoFocus={this.props.autoFocus}
                    blurOnSubmit={true}
                    contextMenuHidden={false}
                    placeholder='請輸入姓名'
                    style={[styles.input]}
                    secureTextEntry={this.props.secureTextEntry}
                    onChangeText={(text) => {
                               this.setState({name:text});
                 </TextInput>

                  <Text style={[styles.listTitle,styles.subTitle]}>場景一:</Text> 
                <TestReceivePropsComponent name={this.state.name}></TestReceivePropsComponent>
            </ScrollView>
        );
    }

當在輸入框依次輸入Qwer時诡必,打印結果是:


image.png

2.對象類型的屬性:

//子組件:
export class TestReceivePropsComponent2 extends Component {
    //約束的關鍵就是這里在定義屬性的時候指定屬性的類型,
    static defaultProps={
        person:{name:'person對象名'}
       }
    static propTypes={
        //指定類型的對象
        person:PropTypes.any,
    }
    constructor(props) {
        super(props);
    };
    componentWillReceiveProps(nextProps,nextContext){
        console.log(`TestReceivePropsComponent2--this.props-->${JSON.stringify(this.props)}`);
        console.log(`TestReceivePropsComponent2--nextProps-->${JSON.stringify(nextProps)}`);
        console.log(`TestReceivePropsComponent2--nextContext-->${JSON.stringify(nextContext)}`);
    }

    render(){
        return (
            <View style={styles.container}>
                <Text>修改對象中的屬性--姓名:{this.props.person.name}</Text>
            </View>
        );
    }
}
//父組件引用:
//聲明一個對象
const temPerson = {
    name:'張三',
};
...
render() {
        console.log(`ComponentWillReceivePropsPage--render`);
        return (
            <ScrollView style={styles.container}>
                 <TextInput
                    ref="inputLoginName"
                    autoFocus={this.props.autoFocus}
                    blurOnSubmit={true}
                    contextMenuHidden={false}
                    placeholder='請輸入姓名'
                    style={[styles.input]}
                    secureTextEntry={this.props.secureTextEntry}
                    onChangeText={(text) => {
                               this.setState({name:text});
                               temPerson.name = text;//更改temPerson對象的name屬性值
                 </TextInput>
            <Text style={[styles.listTitle,styles.subTitle]}>場景二:改變對象中的內(nèi)容</Text>
            <TestReceivePropsComponent2 person={temPerson}></TestReceivePropsComponent2>

  </ScrollView>
        );
    }

當在輸入框依次輸入Qwer時搔扁,打印結果是:


image.png

3.數(shù)組類型的屬性:

//子組件TestReceivePropsComponent3:
export class TestReceivePropsComponent3 extends Component {
    static defaultProps={
        arr:[],
       }
    static propTypes={
        arr:PropTypes.array,
    }
    
    constructor(props) {
        super(props);
    };
   
    componentWillReceiveProps(nextProps,nextContext){
        console.log(`this.props-->${JSON.stringify(this.props)}`);
        console.log(`nextProps-->${JSON.stringify(nextProps)}`);
        console.log(`nextContext-->${JSON.stringify(nextContext)}`);
    }

    render(){
        console.log(`TestReceivePropsComponent3-->render`);
        return (
            <View style={styles.container}>
                <Text>修改數(shù)組的內(nèi)容--數(shù)組:{JSON.stringify(this.props.arr)}</Text>
            </View>
        );
    }
}

//父組件引用:
//聲明一個數(shù)組
const temArr=['初始化數(shù)組內(nèi)容'];

 render() {
        console.log(`ComponentWillReceivePropsPage--render`);
        return (
            <ScrollView style={styles.container}>
                 <TextInput
                    ref="inputLoginName"
                    autoFocus={this.props.autoFocus}
                    blurOnSubmit={true}
                    contextMenuHidden={false}
                    placeholder='請輸入姓名'
                    style={[styles.input]}
                    secureTextEntry={this.props.secureTextEntry}
                    onChangeText={(text) => {
                               this.setState({name:text});
                               temArr.push(text);
                              }}>
                 </TextInput>
            <Text style={[styles.listTitle,styles.subTitle]}>場景三:改變數(shù)組中的內(nèi)容</Text>
            <TestReceivePropsComponent3 arr={temArr}></TestReceivePropsComponent3>
        
            </ScrollView>
        );
    }

當在輸入框依次輸入Qwer時爸舒,打印結果是:


image.png

綜上:
當你想要在componentWillReceiveProps函數(shù)中根據(jù)屬性的變化,通過調(diào)用this.setState()來更新你的組件狀態(tài)或者調(diào)用自己的方法來響應Props的改變時稿蹲,就要注意對引用類型的數(shù)據(jù)判斷了扭勉!

以上是Props的使用注意點的介紹,當然Props使用還有其它的知識點苛聘,本文會持續(xù)更新剖效,歡迎大家留言交流~~~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫉入,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子璧尸,更是在濱河造成了極大的恐慌咒林,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爷光,死亡現(xiàn)場離奇詭異垫竞,居然都是意外死亡,警方通過查閱死者的電腦和手機蛀序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門欢瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徐裸,你說我怎么就攤上這事遣鼓。” “怎么了重贺?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵骑祟,是天一觀的道長。 經(jīng)常有香客問我气笙,道長次企,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任潜圃,我火速辦了婚禮缸棵,結果婚禮上,老公的妹妹穿的比我還像新娘谭期。我一直安慰自己堵第,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布隧出。 她就那樣靜靜地躺著型诚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸳劳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天也搓,我揣著相機與錄音赏廓,去河邊找鬼。 笑死傍妒,一個胖子當著我的面吹牛幔摸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颤练,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼既忆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起患雇,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤跃脊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苛吱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酪术,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年翠储,在試婚紗的時候發(fā)現(xiàn)自己被綠了绘雁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡援所,死狀恐怖庐舟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情住拭,我是刑警寧澤挪略,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站废酷,受9級特大地震影響瘟檩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜澈蟆,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一墨辛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趴俘,春花似錦睹簇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疲憋,卻和暖如春凿渊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缚柳。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工埃脏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秋忙。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓彩掐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灰追。 傳聞我的和親對象是個殘疾皇子堵幽,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

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

  • 作為一個合格的開發(fā)者狗超,不要只滿足于編寫了可以運行的代碼。而要了解代碼背后的工作原理朴下;不要只滿足于自己的程序...
    六個周閱讀 8,441評論 1 33
  • 40努咐、React 什么是React?React 是一個用于構建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,014評論 0 1
  • 說在前面 關于 react 的總結過去半年就一直碎碎念著要搞起來桐猬,各(wo)種(tai)原(lan)因(le)麦撵。心...
    陳嘻嘻啊閱讀 6,864評論 7 41
  • 原教程內(nèi)容詳見精益 React 學習指南,這只是我在學習過程中的一些閱讀筆記溃肪,個人覺得該教程講解深入淺出免胃,比目前大...
    leonaxiong閱讀 2,833評論 1 18
  • 2017.12.10 我必須研究政治和戰(zhàn)爭,那么我的兒子們也許才會擁有研究數(shù)學和哲學惫撰、地理學羔沙、自然史、軍艦建造厨钻、航...
    永遠的浩子閱讀 410評論 0 1