React組件之間的通信

父?jìng)髯?/h1>

就是父組件傳遞值給子組件牌柄,這個(gè)一般用props就可以完成
例如:

 render() {
        return(
            <div>
                <h1>Simple TODO List</h1>
                <AppendList appendList={ this.state.list }/>
            </div>
        )
    }
console.log(this.props.appendList)

通過(guò)以上方法即可訪問(wèn)。

子傳父

問(wèn)題引入
現(xiàn)在我們需要實(shí)現(xiàn)一個(gè)功能歧蕉,添加一個(gè)輸入框的內(nèi)容到一個(gè)list列表中灾部,效果如下:

功能圖片

我們把功能劃分為三個(gè)組件,一個(gè)是添加功能append惯退,也就是輸入框和按鈕赌髓,另一個(gè)是顯示組件appendList,顯示list的內(nèi)容,還有一個(gè)是包含兩種組件的父組件暫且取名為appendFather锁蠕。

  • 首先我們編輯添加功能append:
import React from "react"
export default class Append extends React.Component{
   constructor(props){
       super(props);    
   }
   render() {
       return(
           <div>
               <input type="text" />
               <button value="添加" >添加</button>
           </div>
       )
   }
}

  • 隨后我們?cè)倬庉嬃斜斫M件appendList:
import React from "react"
export default class AppendList extends React.Component{

    render() {
        return(
                <ul>
                  <li></li>
                </ul>
        )
    }
}

  • 最后夷野,我們需要在父組件存儲(chǔ)list中的一些數(shù)據(jù),以及將這兩個(gè)子組件包含起來(lái)匿沛。
import React from "react"
import AppendList from "./appendList"
import Append from "./append"
export default class AppendFather extends React.Component{
    constructor(props){
        super(props);
        // 存儲(chǔ)所需要的初始數(shù)據(jù)
        this.state={
            list:["蘋(píng)果","梨子","香蕉"]
        }
    }
    render() {
        return(
            <div>
                <h1>Simple TODO List</h1>
                <Append />
                <AppendList }/>
            </div>
        )
    }
}

現(xiàn)在我們的頁(yè)面中還只是有一個(gè)輸入框和按鈕扫责,數(shù)據(jù)并沒(méi)有被渲染出來(lái),我們需要將數(shù)據(jù)傳遞給AppendList這個(gè)組件(父?jìng)髯?逃呼,這里我們可以用到props鳖孤。

  • 在父組件中添加(或者說(shuō)是修改)這樣的代碼:
<AppendList appendList={ this.state.list }/>
  • 將我們的list數(shù)據(jù)傳遞給AppendList,然后在AppendList中,我們需要接收數(shù)據(jù)抡笼。
this.props.appendList
  • 但是我們的數(shù)據(jù)需要渲染成一個(gè)列表苏揣,所以用map來(lái)渲染。
import React from "react"
export default class AppendList extends React.Component{

    render() {
        return(
                <ul>
                    {
                        this.props.appendList.map((data,index) => <li key={ index }>{ data }</li>)
                    }
                </ul>
        )
    }
}

處理完了顯示的組件推姻,我們來(lái)接著處理添加的功能平匈。
基于狀態(tài)在哪個(gè)組件,更新?tīng)顟B(tài)的行為就在那個(gè)組件的原則藏古,我們需要先在appendFather中定義一個(gè)方法來(lái)添加數(shù)據(jù):

addList(todo){
        const {list} = this.state;
        list.unshift(todo);
        // 更新?tīng)顟B(tài)
        this.setState({list});
    }

這里的todo參數(shù)是我們一會(huì)兒要在append組件中傳入的數(shù)據(jù)
注意我們需要在constructor中對(duì)這個(gè)方法的this進(jìn)行綁定以免出錯(cuò)增炭。

    constructor(props){
        super(props);

        this.state={
            list:["蘋(píng)果","梨子","香蕉"]
        }
        this.addList=this.addList.bind(this);
    }

現(xiàn)在,我們的父組件已經(jīng)定義好了一個(gè)添加數(shù)據(jù)的方法拧晕,下面我們需要交給子組件來(lái)操作隙姿。
既然普通數(shù)據(jù)可以通過(guò)props傳遞,那么我們的函數(shù)也可以通過(guò)props傳遞,而且函數(shù)傳遞的值只是一個(gè)對(duì)內(nèi)存的引用厂捞。
現(xiàn)在我們?cè)诟附M件傳遞這個(gè)函數(shù):

    render() {
        return(
            <div>
                <h1>Simple TODO List</h1>
                <Append addList={this.addList}/>
                <AppendList appendList={ this.state.list }/>
            </div>
        )
    }

現(xiàn)在输玷,我們可以在append中接收這個(gè)函數(shù)了,但是首先我同樣需要給append中的添加按鈕加上一個(gè)處理事件:

import React from "react"
export default class Append extends React.Component{
    constructor(props){
        super(props);

        this.handleAdd = this.handleAdd.bind(this);    
    }

    handleAdd(){
        const todo= this.todoInput.value.trim();
        this.props.addList(todo);
        this.todoInput.value="";
    }
    render() {
        return(
            <div>
                <input type="text" ref={input => this.todoInput=input}/>
                <button value="添加" onClick={this.handleAdd}>添加</button>
            </div>
        )
    }
}

在上面的代碼中靡馁,主要有以下幾點(diǎn):

  • 添加一個(gè)handleAdd的處理事件
  • 在處理事件中欲鹏,通過(guò)ref={input => this.todoInput=input}對(duì) input的值進(jìn)行綁定
  • 通過(guò)this.handleAdd = this.handleAdd.bind(this);綁定自定義事件的this
  • 通過(guò)this.props.addList(todo);調(diào)用父組件傳來(lái)的函數(shù)

以上就是整個(gè)小功能的全部過(guò)程

消息的訂閱、發(fā)布(組件通信)

相當(dāng)于綁定監(jiān)聽(tīng)臭墨、觸發(fā)事件赔嚎。

使用PubSubJs庫(kù)

npm install pubsub-js

總結(jié)

以上代碼,子傳父最關(guān)鍵的就是父組件通過(guò)props傳了一個(gè)函數(shù)給子組件胧弛,并在子組件中調(diào)用這個(gè)函數(shù)尤误。

全部代碼

appendFather.js

import React from "react"
import AppendList from "./appendList"
import Append from "./append"
export default class AppendFather extends React.Component{
    constructor(props){
        super(props);

        this.state={
            list:["蘋(píng)果","梨子","香蕉"]
        }
        this.addList=this.addList.bind(this);
    }

    addList(todo){
        const {list} = this.state;
        list.unshift(todo);
        // 更新?tīng)顟B(tài)
        this.setState({list});
    }
    render() {
        return(
            <div>
                <h1>Simple TODO List</h1>
                <Append addList={this.addList}/>
                <AppendList appendList={ this.state.list }/>
            </div>
        )
    }
}

append.js

import React from "react"
export default class Append extends React.Component{
    constructor(props){
        super(props);

        this.handleAdd = this.handleAdd.bind(this);    
    }

    handleAdd(){
        const todo= this.todoInput.value.trim();
        this.props.addList(todo);
        this.todoInput.value="";
    }
    render() {
        return(
            <div>
                <input type="text" ref={input => this.todoInput=input}/>
                <button value="添加" onClick={this.handleAdd}>添加</button>
            </div>
        )
    }
}

appendList.js

import React from "react"
export default class AppendList extends React.Component{

    render() {
        return(
                <ul>
                    {
                        this.props.appendList.map((data,index) => <li key={ index }>{ data }</li>)
                    }
                </ul>
        )
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叶圃,隨后出現(xiàn)的幾起案子袄膏,更是在濱河造成了極大的恐慌践图,老刑警劉巖掺冠,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡德崭,警方通過(guò)查閱死者的電腦和手機(jī)斥黑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)眉厨,“玉大人锌奴,你說(shuō)我怎么就攤上這事『豆桑” “怎么了鹿蜀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)服球。 經(jīng)常有香客問(wèn)我茴恰,道長(zhǎng),這世上最難降的妖魔是什么斩熊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任往枣,我火速辦了婚禮,結(jié)果婚禮上粉渠,老公的妹妹穿的比我還像新娘分冈。我一直安慰自己,他們只是感情好霸株,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布雕沉。 她就那樣靜靜地躺著,像睡著了一般淳衙。 火紅的嫁衣襯著肌膚如雪蘑秽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天箫攀,我揣著相機(jī)與錄音肠牲,去河邊找鬼。 笑死靴跛,一個(gè)胖子當(dāng)著我的面吹牛缀雳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梢睛,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肥印,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绝葡?” 一聲冷哼從身側(cè)響起深碱,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎藏畅,沒(méi)想到半個(gè)月后敷硅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年绞蹦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了力奋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幽七,死狀恐怖景殷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澡屡,我是刑警寧澤猿挚,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站驶鹉,受9級(jí)特大地震影響亭饵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梁厉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一辜羊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧词顾,春花似錦八秃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至上忍,卻和暖如春骤肛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窍蓝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工腋颠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吓笙。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓淑玫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親面睛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子絮蒿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 今天來(lái)看一下react組件之間是怎么進(jìn)行通訊的。react推崇的是單向數(shù)據(jù)流叁鉴,自上而下進(jìn)行數(shù)據(jù)的傳遞土涝,但是由下而上...
    親親qin閱讀 6,005評(píng)論 2 12
  • 在開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到父組件和子組件之間相互通信幌墓,React子組件和父組件通信包括以下幾個(gè)方面: 子組件向父組件...
    YHWXQ簡(jiǎn)簡(jiǎn)單單的生活閱讀 930評(píng)論 0 0
  • 確認(rèn)過(guò)眼神,我遇上對(duì)的人——分手——在這之間有127天的時(shí)間茵肃,有過(guò)歡笑,有過(guò)不安袭祟,有過(guò)焦慮验残,有過(guò)煩躁,最后變成了痛...
    一片葉子落下閱讀 345評(píng)論 0 3
  • 別害怕巾乳,別怨恨 你現(xiàn)在還很微小您没,注定要在夾縫里生存 你必須要把自己看得很低很低 等你長(zhǎng)成一顆大樹(shù) 你才有資格看到陽(yáng)...
    晴晴老師閱讀 125評(píng)論 0 0