React-組件之間的通信

在開發(fā)過程中徐紧,經常會遇到父組件和子組件之間相互通信,React子組件和父組件通信包括以下幾個方面:

1,子組件調用父組件的方法
(1)子組件要拿到父組件的屬性并级,需要通過 this.props 方法巴柿。
(2)同樣地,如果子組件想要調用父組件的方法死遭,只需父組件把要被調用的方法以屬性的方式放在子組件上,子組件內部便可以通過“this.props.被調用的方法”這樣的方式來獲取父組件傳過來的方法凯旋。

2呀潭,父組件調用子組件的方法
在 ReactJS 中有個叫 ref 的屬性。這個屬性就像給組件起個引用名字一樣至非,子組件被設置為 ref 之后(比如 ref="xxx")钠署。父組件便可以通過 this.refs.xxx 來獲取到子組件了。

子組件向父組件傳值
例子1:這里如下圖荒椭,用戶郵箱為父谐鼎,綠色框為子。 父組件為用戶輸入的郵箱設好state趣惠,即“{email: ''}”狸棍,同時寫好處理state的函數,即“handleEmail”味悄,這兩個名稱隨
意起草戈;再將函數以props的形式傳到子組件,子組件只需在事件發(fā)生時侍瑟,調用父組件傳過來的函數即可唐片。

效果圖

image.png

//  子類 - Child
import React from 'react';

export default class Child extends React.Component {

  render() {
    return (
      <div>
        請輸入郵箱:<input onChange={this.props.handleEmail}/>
      </div>
    );
  }
}

// 父類 - Parent
import React from 'react';
import Child from './Child';

class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      email: ' '
    }
  }

  handleEmail = (event) => {
    this.setState({
      email: event.target.value
    });
  }

  render() {
    return (
      <div>
        <div>用戶郵箱:{this.state.email}</div>
        <Child name="email" handleEmail={this.handleEmail}/>
      </div>
    );
  }
}

例子2:有時候往往需要對數據做處理,再傳給父組件涨颜,比如過濾或者自動補全等等费韭,下面的例子對用戶輸入的郵箱做簡單驗證,自動過濾非數字庭瑰、字母和"@."以外的字符星持。
效果圖

image.png

//  子類 - Child
import React from 'react';

export default class Child extends React.Component {

  handleVal = () => {
    var val = this.refs.emailDom.value;
    val = val.replace(/[^0-9|a-z|\@|\.]/ig,"");
    this.props.handleEmail(val);
  }

  render() {
    return (
      <div>
        請輸入郵箱:<input ref="emailDom" onChange={this.handleVal}/>
      </div>
    );
  }
}
// 父類 - Parent
import React from 'react';
import Child from './Child';

export default class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      email: 'ddd'
    }
  }

  handleEmail = (value) => {
    this.setState({
      email: value
    });
  }

  render() {
    return (
      <div>
        <div>用戶郵箱:{this.state.email}</div>
        <Child name="email" handleEmail={this.handleEmail}/>
      </div>
    );
  }
}

例子3:如果還存在孫子組件的情況呢?如下圖弹灭,黑框為父钉汗,綠框為子,紅框為孫鲤屡,要求子孫的數據都傳給爺爺损痰。原理一樣的,只是父要將爺爺對孫子的處理函數直接傳下去酒来。
效果圖

image.png
import React from 'react';
class Grandson extends React.Component {
  render() {
    return (
      <div>性別:
        <select onChange={this.props.handleSelect}>
          <option value="男">男</option>
          <option value="女">女</option>
        </select>
      </div>
    );
  }
}

export default class Child extends React.Component {

  render() {
    return (
      <div>
        姓名:<input onChange={this.props.handleVal}/>
        <Grandson handleSelect={this.props.handleSelect}/>
      </div>
    );
  }
}

import React from 'react';
import Child from './Child';

export default class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      username: '',
      sex: ''
    }
  }

  handleVal = (event) => {
    this.setState({
      username: event.target.value
    });
  }

  handleSelect = (event) => {
    this.setState({
      sex: event.target.value
    });
  }

  render() {

    return (
      <div>
        <div>用戶姓名:{this.state.username}</div>
        <div>用戶性別:{this.state.sex}</div>
        <Child handleVal={this.handleVal} handleSelect={this.handleSelect}/>
      </div>
    );
  }
}

父類調用子類的函數和屬性

// 子類
import React from 'react';

export default class ButtonComment extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    }
  }

  sendSword = () => {
    var newCount = this.state.count + 1;
    this.setState({
      count: this.state.count + 1
    });
    this.props.getSwordCount();
  }

  render() {
    return (
      <button onClick={this.sendSword}>{this.props.buttonName}</button>
    );
  }
}
// 父類
import ButtonComment from './ButtonComment';
import React from 'react';

export default class ImDaddyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      sendCount: 0
    }
  }


  getSwordCount = () => {
    this.setState({sendCount:this.refs.getSwordButton.state.count + 1});
  }

  sendSword = () => {
    this.refs.getSwordButton.sendSword();
  }

  render() {
    return (
      <div>
        <ButtonComment ref="getSwordButton" getSwordCount={this.getSwordCount} buttonName="兒子送寶刀"/>
        <button onClick={this.sendSword}>通過老爸送寶刀</button>
        <p>
          父子倆共送{this.state.sendCount}把寶刀B础!!
        </p>
      </div>
    );
  }
}

效果圖

Snip20171012_1.png
Snip20171012_2.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末辽社,一起剝皮案震驚了整個濱河市伟墙,隨后出現的幾起案子,更是在濱河造成了極大的恐慌滴铅,老刑警劉巖戳葵,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異汉匙,居然都是意外死亡拱烁,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門噩翠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戏自,“玉大人,你說我怎么就攤上這事伤锚∩帽剩” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵屯援,是天一觀的道長猛们。 經常有香客問我,道長狞洋,這世上最難降的妖魔是什么阅懦? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮徘铝,結果婚禮上耳胎,老公的妹妹穿的比我還像新娘。我一直安慰自己惕它,他們只是感情好怕午,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淹魄,像睡著了一般郁惜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甲锡,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天兆蕉,我揣著相機與錄音,去河邊找鬼缤沦。 笑死虎韵,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缸废。 我是一名探鬼主播包蓝,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驶社,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了测萎?” 一聲冷哼從身側響起亡电,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硅瞧,沒想到半個月后份乒,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡腕唧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年或辖,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片四苇。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖方咆,靈堂內的尸體忽然破棺而出月腋,到底是詐尸還是另有隱情,我是刑警寧澤瓣赂,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布榆骚,位于F島的核電站,受9級特大地震影響煌集,放射性物質發(fā)生泄漏妓肢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一苫纤、第九天 我趴在偏房一處隱蔽的房頂上張望碉钠。 院中可真熱鬧,春花似錦卷拘、人聲如沸喊废。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽污筷。三九已至,卻和暖如春乍赫,著一層夾襖步出監(jiān)牢的瞬間瓣蛀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工雷厂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惋增,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓改鲫,卻偏偏與公主長得像器腋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容

  • 今天來看一下react組件之間是怎么進行通訊的纫塌。react推崇的是單向數據流诊县,自上而下進行數據的傳遞,但是由下而上...
    親親qin閱讀 6,010評論 2 12
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 記得幾個月前的王寶強嗎?因為馬蓉的出軌而變得婦孺皆知怎披,遠遠超過了作為演員的他在國民心中的名聲胸嘁;超級丹賽場上英姿颯爽...
    清淺光陰閱讀 680評論 0 2
  • Python中如何獲取程序運行的文件夾目錄的絕對路徑
    AlexZhao閱讀 514評論 0 6
  • 那應該是這么多年 第一次真正意義上被夢驚醒 流淚 抽泣 無法喘息 生生把自己拉回了現實 醒來 枕頭已經濕透 看一眼...
    Madejorce閱讀 196評論 0 0