React爬坑之路——子組件更新父組件state值

????本文代碼基于React垢粮,Antd的Radio以及Radio.Group它呀,模擬的需求是:
????當有三個RadioGroup的時候坟桅,第一個RadioGroup的選擇值將改變后面兩個RadioGroup的狀態(tài)渣叛,當?shù)谝粋€RadioGroup選擇為1時班眯,其他兩個RadioGroup將不能使用(通過disabled來控制)希停。我們可以通過使用回調(diào)函數(shù)來完成這一需求:

  1. 首先是父組件有一個相對于三個子組件的全局的值isEnabled,這個值表示第二署隘、第三個子組件是否可以使用宠能,因此需要將isEnabled傳給這兩個子組件;
  2. 父組件提供一個changeEnabled方法接受一個value參數(shù)磁餐,根據(jù)這個參數(shù)违崇,來更改isEnabled值(value為1,則為false诊霹,否則為true)羞延。這個方法就是給子組件調(diào)用的,回調(diào)函數(shù)畅哑,將由父組件傳給第一個子組件肴楷;
  3. 第一個子組件通過調(diào)用與RadioGroup的onClick綁定的方法handleChange,來更新它本身的value值荠呐,同時回調(diào)方法changeEnabled赛蔫,并傳入更新的value值;
  4. 父組件的changeEnabled被調(diào)用后泥张,根據(jù)value值呵恢,及時更新自己的isEnabled值,以更改第二媚创、第三個子組件狀態(tài)渗钉。
  5. 在子組件中請注意render()方法中的這一行代碼:const {isEnabled} = this.props,而不是將isEnabled放到子組件的constructor(props)。
總結:核心思想鳄橘,即父組件擁有某個狀態(tài)變量声离,也擁有更新這個狀態(tài)變量的函數(shù),父組件把這個函數(shù)傳遞給子組件瘫怜,然后通過子組件的調(diào)用來更新這個狀態(tài)變量术徊。

????本人是剛剛入門React不久的新手拒炎,語言組織也可能有些混亂邑狸。如有問題馒铃,請大神多多指教砾肺。

完整代碼如下:
其中,

  1. Radios是存放一個RadioGroup的子組件膛薛,RadioGroups是父組件寂屏,存放三個Radios词顾。
  2. 子組件中render()方法的這一行代碼 const {isEnabled} = this.props; 尤其重要炸裆,它能夠及時接收父組件的isEnabled值的變化而更新自己的RadioGroup狀態(tài)垃它。但此處筆者有個問題是,為何不能將isEnabled放到constructor里面晒衩,作為子組件本身的state值嗤瞎,希望有高手能夠指點一下。
//RadioGroups
import React, {Component} from 'react';
import {Radio} from 'antd';
const RadioGroup = Radio.Group;

class Radios extends Component{
    constructor(props){
        super(props);
        this.handleChange = this.handleChange.bind(this);
        this.state = {
            value : 1,      //RadioGroup初始化值為1听系,表示選擇第一個選項
        };
    }

    handleChange(e){
        this.setState({
            value : e.target.value,
        });
        console.log('value: ' + e.target.value + ' ' + this.props.changeEnabled);

        // 子組件更新RadioGroup值的同時,回調(diào)父組件的changeEnabled方法以更新其isEnabled值虹菲,
        // 如果方法為undefined靠胜,說明不是第一個RadioGroup
        if(this.props.changeEnabled !== undefined){
            this.props.changeEnabled(e.target.value);
            console.log('changed');
        }
    }

    render(){
        //接收父組件傳進來的isEnabled值,以更新子組件的狀態(tài)(對應下面RadioGroup的disabled狀態(tài))
        const {isEnabled} = this.props;    
        return (
            <div>
                {/*disabled值根據(jù)父組件的isEnabled改變而改變毕源,如果為undefined浪漠,說明是第一個Radio組,不會隨著父組件的isEnabled改變霎褐。*/}
            <RadioGroup disabled={!isEnabled} value={this.state.value} onChange={this.handleChange}>
                <Radio value={1}>1</Radio>
                <Radio value={2}>2</Radio>
                <Radio value={3}>3</Radio>
            </RadioGroup>
            </div>
        );
    }
}

class RadioGroups extends Component{
    constructor(props){
        super(props);
        this.changeEnabled = this.changeEnabled.bind(this);
        this.state = {
            isEnabled: false,
        };
    }

    //父組件中的回調(diào)函數(shù)(給子組件調(diào)用)
    changeEnabled(value){
        this.setState({
           isEnabled : value !== 1
        });
        console.log(this.state.isEnabled)
    }

    render(){
        return (
            <div>
                {/*只將回調(diào)方法傳給第一個組件址愿,這樣其他兩個組件的值將不影響父組件的state*/}
                {/*而isEnabled第一個組件保持為true,以保證其一直可以使用*/}
                <Radios isEnabled={true} changeEnabled={this.changeEnabled}/>
                <Radios isEnabled={this.state.isEnabled}/>
                <Radios isEnabled={this.state.isEnabled}/>
            </div>
        );
    }
}

export default RadioGroups;
本文須知的坑:

????1. 一定要學習好React的生命周期冻璃,其中每個組件的constructor只會調(diào)用一次响谓,因此必須將要更新的值放到render方法里面而不是constructor里面,如Radios組件中render()方法里的const {isEnabled} = this.props;

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末省艳,一起剝皮案震驚了整個濱河市娘纷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跋炕,老刑警劉巖赖晶,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辐烂,居然都是意外死亡遏插,警方通過查閱死者的電腦和手機捂贿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胳嘲,“玉大人眷蜓,你說我怎么就攤上這事√ノВ” “怎么了吁系?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長白魂。 經(jīng)常有香客問我汽纤,道長,這世上最難降的妖魔是什么福荸? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任蕴坪,我火速辦了婚禮,結果婚禮上敬锐,老公的妹妹穿的比我還像新娘背传。我一直安慰自己,他們只是感情好台夺,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布径玖。 她就那樣靜靜地躺著,像睡著了一般颤介。 火紅的嫁衣襯著肌膚如雪梳星。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天滚朵,我揣著相機與錄音冤灾,去河邊找鬼。 笑死辕近,一個胖子當著我的面吹牛韵吨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播移宅,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼归粉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吞杭?” 一聲冷哼從身側響起盏浇,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芽狗,沒想到半個月后绢掰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年滴劲,在試婚紗的時候發(fā)現(xiàn)自己被綠了攻晒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡班挖,死狀恐怖鲁捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萧芙,我是刑警寧澤给梅,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站双揪,受9級特大地震影響动羽,放射性物質發(fā)生泄漏。R本人自食惡果不足惜渔期,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一运吓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疯趟,春花似錦拘哨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至站欺,卻和暖如春姨夹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾策。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峭沦,地道東北人贾虽。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像吼鱼,于是被迫代替她去往敵國和親蓬豁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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