關(guān)于對react.js中狀態(tài)提升的理解

demo要求:
  在上面的input框內(nèi)輸入大寫單詞溯乒,下面的input框內(nèi)會自動展示出相應(yīng)的小寫單詞,
同理在下面的input框內(nèi)輸入小寫單詞确虱,上面的input框內(nèi)展示出相應(yīng)的大寫單詞。

圖片展示:


upperToLower.png

lowerToUpper.png

代碼展示:

import React from "react";
import ReactDOM from "react-dom";

const words={
    upperCase:"upper",
    lowerCase:"lower"
}

//將輸入的單詞轉(zhuǎn)化位大寫
function toUpper(input){
    return input.toUpperCase();
}
//將輸入的單詞轉(zhuǎn)化為小寫
function toLower(input){
    return input.toLowerCase();
}

// 定義子組件WordsInput
class WordsInput extends React.Component {
    constructor(props){
        super(props);
        this.handleWordsInput=this.handleWordsInput.bind(this);
    }
    handleWordsInput(e){
        this.props.onInputChange(e.target.value)  //利用props屬性調(diào)用父組件傳過來的方法
    }
    render(){
        const type=this.props.type;
        const value=this.props.value;
        return (
            <form action="#">
                <legend>請輸入{words[type]==="upper"?"大寫":"小寫"}字母</legend>
                <input
                    value={value}
                    onChange={this.handleWordsInput}
                />
            </form>
        )
    }
}
// 定義父組件InputChange
class InputChange extends React.Component {
    constructor(props){
        super(props);
        this.handleUpperCase=this.handleUpperCase.bind(this);
        this.handleLowerCase=this.handleLowerCase.bind(this);
        this.state={
            type:"upper",
            text:""
        }
    }
    handleUpperCase(value){
        const text=toUpper(value)
        this.setState({
            type:"upper",
            text  //es6語法:鍵與值相同時可省略值
        })
    }
    handleLowerCase(value){
        const text=toLower(value);
        this.setState({
            type:"lower",
            text  //es6語法:鍵與值相同時可省略值
        })
    }
    render(){
        const value=this.state.text;
        const type=this.state.type;
        const upperCase= type==="lower"?toUpper(value):value;  //保證upperCase變量永遠存儲大寫單詞
        const lowerCase= type==="upper"?toLower(value):value;  //保證lowerCase變量永遠存儲小寫單詞
        return (
            <div>
                <WordsInput
                    type="upperCase"
                    value={upperCase}   //保證該input框內(nèi)永遠展示出大寫單詞
                    onInputChange={this.handleLowerCase}
                />
                <WordsInput
                    type="lowerCase"
                    value={lowerCase}  //保證該input框內(nèi)永遠展示小寫單詞
                    onInputChange={this.handleUpperCase}
                />
            </div>
        )
    }
}

ReactDOM.render(
    <InputChange />,
    document.getElementById("example")

代碼解讀:
  首先定義了兩個函數(shù)toUpper,toLower,分別將輸入的單詞轉(zhuǎn)化為相應(yīng)的大小寫單詞
  其次定義了一個父組件InputChange及子組件WordsInput,在子組件內(nèi)利用props屬性接受來自父組件傳過來的type,value,onInputChange屬性
  在子組件WordsInput內(nèi),根據(jù)父組件內(nèi)傳入的屬性type值的不同渲染出不同的文本斯够,并在不同的input框內(nèi)綁定相應(yīng)的大小寫單詞,注冊onChange事件,當input框內(nèi)文本發(fā)生改變時读规,調(diào)用該事件所綁定的函數(shù)handleWordsInput抓督,在handleWordsInput函數(shù)內(nèi)部調(diào)用父組件傳入的函數(shù)(即this.props.onInputChange,該函數(shù)用來重新更新父組件內(nèi)部的狀態(tài))

實現(xiàn)原理:
  將父組件內(nèi)的屬性及方法(該方法是對父組件內(nèi)的狀態(tài)更新)傳給子組件,在子組件內(nèi)綁定相應(yīng)的事件束亏,在事件處理函數(shù)中調(diào)用父組件內(nèi)方法(以達到對父組件內(nèi)狀態(tài)更新的目的)铃在,當父組件內(nèi)狀態(tài)更新時會重新將相應(yīng)的屬性傳給子組件。

造成的原因:
  在react.js中數(shù)據(jù)是自上而下單向流動的碍遍,故在子組件內(nèi)只能利用props屬性來來自父組件的值定铜,而在該實例中的大寫input框和小寫input框是屬于同級組件,無法利用props屬性相互傳值怕敬,故只能在父組件內(nèi)共享數(shù)據(jù)揣炕,而在子組件內(nèi)利用事件處理函數(shù)來調(diào)用父組件內(nèi)對狀態(tài)的處理函數(shù)。

個人理解赖捌,僅供參考祝沸,如有錯誤,還望提出越庇!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罩锐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卤唉,更是在濱河造成了極大的恐慌涩惑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桑驱,死亡現(xiàn)場離奇詭異竭恬,居然都是意外死亡,警方通過查閱死者的電腦和手機熬的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門痊硕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人押框,你說我怎么就攤上這事岔绸。” “怎么了橡伞?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵盒揉,是天一觀的道長。 經(jīng)常有香客問我兑徘,道長刚盈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任挂脑,我火速辦了婚禮藕漱,結(jié)果婚禮上欲侮,老公的妹妹穿的比我還像新娘。我一直安慰自己谴分,他們只是感情好锈麸,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牺蹄,像睡著了一般忘伞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沙兰,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天氓奈,我揣著相機與錄音,去河邊找鬼鼎天。 笑死舀奶,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的斋射。 我是一名探鬼主播育勺,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罗岖!你這毒婦竟也來了涧至?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤桑包,失蹤者是張志新(化名)和其女友劉穎南蓬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哑了,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赘方,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弱左。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窄陡。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拆火,靈堂內(nèi)的尸體忽然破棺而出泳梆,到底是詐尸還是另有隱情,我是刑警寧澤榜掌,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乘综,受9級特大地震影響憎账,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卡辰,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一胞皱、第九天 我趴在偏房一處隱蔽的房頂上張望邪意。 院中可真熱鬧,春花似錦反砌、人聲如沸雾鬼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽策菜。三九已至,卻和暖如春酒贬,著一層夾襖步出監(jiān)牢的瞬間又憨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工锭吨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蠢莺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓零如,卻偏偏與公主長得像躏将,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子考蕾,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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

  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,065評論 2 35
  • 下載安裝搭建環(huán)境 可以選npm安裝祸憋,或者簡單下載一個開發(fā)版的vue.js文件 瀏覽器打開加載有vue的文檔時,控制...
    冥冥2017閱讀 6,039評論 0 42
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容辕翰,還有我對于 Vue 1.0 印象不深的內(nèi)容夺衍。關(guān)于...
    云之外閱讀 5,050評論 0 29
  • 最近看了一本關(guān)于學習方法論的書,強調(diào)了記筆記和堅持的重要性喜命。這幾天也剛好在學習React沟沙,所以我打算每天堅持一篇R...
    gaoer1938閱讀 1,684評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)壁榕,斷路器矛紫,智...
    卡卡羅2017閱讀 134,656評論 18 139