亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

React 組件間的通信示例

2019-11-19 13:39:14
字體:
來源:轉載
供稿:網友

前言

從官網上也有介紹組件間如何通信,但不夠詳細,這里做個小結,方便對比和回顧

本文內容

處理組件之間的通信, 主要取決于組件之間的關系,因此我們劃分為以下三種:

  1. 【父組件】向【子組件】傳值;
  2. 【子組件】向【父組件】傳值;
  3. 【組件A】向無關系【組件B】傳值,一般為兄弟組件;

一、「父組件」向「子組件」傳值

這是最普遍的用法,實現上也非常簡單,主要是利用props來實現

// 父組件import React from 'react';import Son from './components/son';class Father extends React.Component {  constructor(props) {    // 這里要加super,否則會報錯    super(props);    this.state = {      checked: true    }  }  render() {    return (      <Son text="Toggle me" checked={this.state.checked} />    )  }}
// 子組件class Son extends React.Component {  render() {    // 接收來自父組件的參數    let checked = this.props.checked,      text = this.props.text;    return (      <label>{text}: <input type="checkbox" checked={checked} /></label>    )  }}

多想一點:

如果組件的嵌套層次太多,那么從外到內的交流成本就會加深,通過 props 傳值的優勢就不明顯,因此,我們還是要盡可能的編寫結構清晰簡單的組件關系, 既也要遵循組件獨立原則,又要適當控制頁面,不可能或極少可能會被單用的代碼片,可不編寫成一個子組件

二、「子組件」向「父組件」傳值

我們知道,react的數據控制分為兩種,為 props 和 state;其中,props 如上剛介紹過,它是父組件向子組件傳值時作為保存參數的數據對象;而 state 是組件存放自身數據的數據對象。這兩者最主要的區別就是,props屬于父組件傳給子組件的只讀數據,在子組件中不能被修改,而state在自身組件中使用時,可以通過setState來修改更新。

子組件向父組件傳值,需要控制自己的state,并發起父組件的事件回調來通知父組件

// 父組件import Son from './components/son';class Father extends React.Component {  constructor(props) {    super(props)    this.state = {      checked: false    }  }  onChildChanged() {    this.setState({      checked: newState    })  }  render() {    let isChecked = this.state.checked ? 'yes' : 'no';    return (      <div>        <span>Are you checked: {isChecked }</span>        <Son text="Toggle me"            initialChecked={this.state.checked}           callbackParent={this.onChildChanged.bind(this)}         ></Son>      </div>    )  }}
// 子組件class Son extends React.Component {  constructor(props) {    super(props);    this.state = {      checked: this.props.initialChecked    }  }  onTextChange() {    let newState = !this.state.check.checked;    this.setState({      checked: newState    });    // 注意,setState 是一個異步方法,state值不會立即改變,回調時要傳緩存的當前值,       // 也可以利用傳遞一個函數(以上傳的是對象),并傳遞prevState參數來實現數據的同步更新    this.props.callbackParent(newState);  }  render() {    let text= this.props.text;    let checked = this.state.checked;    return (      <label>{text}: <input type="checkbox" checked={checked} onChange={this.onTextChange.bind(this)}></label>    )  }}

多想一點:

  1. 同樣應當避免深層次的組件嵌套
  2. 這里其實是依賴了props來傳遞事件的引用,并通過回調的方式來實現,在沒有使用工具情況下,可以使用該辦法

拓展一點:

在onChange 事件或者其他React事件中,你能獲取以下信息:

  1. 「this」 指向你的組件
  2. 「一個參數」 一個react合成事件, SyntheticEvent

我們知道,React對所有事件的管理都是自己封裝實現的,html中的 onclick 被封裝成了 onClick, onchange 被封裝成了 onChange。從根本上來說,他們都是被綁定在body上的。

多個子組件回調同一個回調函數情況

父組件中大概率包含多個子組件,為節省和簡潔代碼,遵循 don't repeat yourself 原則,我們會讓一個回調函數實現多個子組件的功能,或多個組件協作完成指定功能

import React from 'react';import Son from './components/son';class Father extends React.Componnet {  constructor(props) {    super(props);    this.state = {      totalChecked: 0    }  }  onChildChangeed() {    let newTotal = this.state.totalChecked + (new State ? 1 : -1 );    this.setState({       totalChecked = this.state.totalChecked;    });  }  render() {    return (      <div>        <div>Checked numbers: {this.state.totalChecked}</div>        <Son text="Toggle me" initialChecked={this.state.checked} callbackParent={this.onChildChanged} />        <Son text="Toggle me too" initialChecked={this.state.checked} callbackParent={this.onChildChanged} />         <Son text="Add me" initialChecked={this.state.checked} callbackParent={this.onChildChanged} />      </div>    )  }}
// 子組件class Son extends React.Component {  constructor(props) {    super(props);    this.state = {      checked: this.props.initialChecked    }  }   onTextChange() {    let newState = !this.state.checked;    this.setState({      checked: newState    })    // setState異步方法問題,注意傳值    this.props.callbackParent(newState);  }  render() {    let text = this.props.checked;    let checked = this.state.checked;    return {      <label>{text}: <input type="checkbox" checked={checked} onChange={this.onTextChange.bind(this)} /></label>    }  }}

多想一點:

在本案例中,我們引用了三個 Son 子組件, 每個 Son 組件都獨立工作互不干擾,該例中,增加了一個 totalChecked 來替代之前的 checked, 當組件觸發onTextChange 后,觸發父組件的回調函數使得父組件的值得以改變。

三、組件A和無關系組件B之間的通信

如果組件之間沒有任何關系,或者組件嵌套的層次比較深,或者,你為了一些組件能夠訂閱,寫入一些信號,不想讓兩個組件之間插入一個組件,而是讓兩個組件出于獨立的關系。對于時間系統,有兩個基本操作:

  1. 訂閱: subscribe
  2. 監聽: listen

并發送 send / 觸發 trigger / 發布 publish / 發送 dispatch 通知那些想要的組件

1. Event Emitter/Target/Dispatcher

特點: 需要一個指定的訂閱源

// to subscribeotherObiect.addEventListener('clickEvent', function() {  alert('click!');})// to dispatchthis.dispatchEvent('clickEvent');

2. Publish / Subscribe

特點: 觸發的時候,不需要指定一個特定的源,使用全局對象廣播的方式來處理事件

// to subscribeglobalBroadcaster.subcribe('clickEvent', function() {  alert('cilck!');  })// to publishglobalBroadcaster.publish('clickEvent');

這種方案還有一個插件可用, 即 PubSubJs;用法如下:

import Pubsub from 'pubsub-js';...// to subscribePubsub.subscribe('EVENT', (msg, param) => {  console.log(msg, param);});// to publishPubsub.publish('EVENT', param);

3. Single

特點: 與 Event Emitter/Target/Dispatcher 類似,但是不要使用隨機字符串作為事件觸發的引用。觸發事件的每一個對象都需要一個確切的名字,并且在觸發的時候,也必須要指定確切的事件

// to subscribeotherObject.clicked.add(function() {  alert('click');})// to dispatchthis.clicked.dispatch();

React 團隊使用的是:js-signals 它基于 Signals 模式,用起來相當不錯。

事件訂閱與取消

使用React事件的時候,必須關注以下兩個方法:

  1. componentDidMount
  2. componentWillUnmount

在 componentDidMount 事件中,等待組件掛載 mounted 完成,再訂閱事件;訂閱的事件需要在組件卸載 componentWillUnmount 的時候取消事件的訂閱。

因為組件的渲染和銷毀是有 React 來控制的,我們不知道怎么引用他們,所以EventEmitter 模式在處理事件的時候用處不大,Pub/Sub 模式就好用些,因為我們不需要知道引用在哪。

ES6策略: yield and js-csp

ES6中有一種傳遞信息的方式,使用生成函數 generators 和 yield 關鍵字,用法參考以下例子

import csp from 'js-csp';function* list() {  for(var i = 0; i< arguments.length; i++) {    yield arguments[i];  }  return "done";}var o = list(1, 2, 3);var cur = o.next;while (!cur.done) {  cur = o.next();  console.log(cur);}

結束語

數據在組件中應該以什么樣的方式進行傳遞取決于組件之間存在什么樣的關系和當時的業務場景需求,大家應該根據項目合理選擇數據處理的方案,這很可能減少你大量的代碼量和代碼邏輯。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久超碰| 亚洲第一综合天堂另类专| 国产一区二区三区久久精品| 国产精品黄视频| 亚洲欧美视频在线| 少妇久久久久久| 国产大片精品免费永久看nba| 国产精品美女久久| 91午夜在线播放| 久久视频在线观看免费| 国产91免费看片| 91精品久久久久久久久久久| 成人国产精品一区二区| 亚洲一区二区三区在线视频| 欧美一区二区三区精品电影| 国产精品久久久久免费a∨| 日韩视频永久免费观看| 欧美综合一区第一页| 日韩精品免费综合视频在线播放| 亚洲国产中文字幕在线观看| 欧美亚洲另类激情另类| 国产在线不卡精品| 亚洲97在线观看| 日韩电影大全免费观看2023年上| 日韩欧美成人区| 亚洲精品视频久久| 亚洲乱码国产乱码精品精天堂| 日韩电影大片中文字幕| 亚洲国产精品va在线看黑人动漫| 国产精品久久网| 欧美交受高潮1| 日韩欧美在线视频观看| 国产精品老女人精品视频| 久久最新资源网| 欧美国产极速在线| 久久久免费观看视频| 中文字幕日韩电影| 国产成人自拍视频在线观看| 欧美性xxxxx极品娇小| 韩国19禁主播vip福利视频| 欧美激情第1页| 久久精品免费播放| 97精品国产97久久久久久| 欧美乱妇40p| 日本国产欧美一区二区三区| 亚洲成人av在线播放| 亚洲成人精品久久| 色综合五月天导航| 欧美精品videos性欧美| 精品福利在线看| 日韩精品中文字幕在线播放| 成人免费直播live| 欧美激情在线有限公司| 国产精品亚洲片夜色在线| 欧美激情在线视频二区| 久久久久国产精品免费| 亚洲天堂男人天堂| 亚洲免费电影一区| 欧美性xxxxx极品| 亚洲久久久久久久久久久| 欧美激情一区二区三级高清视频| 最近2019中文字幕一页二页| 亚洲图片欧美日产| 91伊人影院在线播放| 一本大道香蕉久在线播放29| 日韩成人网免费视频| 精品久久香蕉国产线看观看gif| 欧美xxxx18性欧美| 亚洲成人性视频| 国产成人一区二区| 国产精品啪视频| 久久精品久久久久| 91网站免费观看| 精品久久久久久中文字幕一区奶水| 中文字幕日韩专区| 日韩欧美亚洲成人| 久久躁日日躁aaaaxxxx| 亚洲欧美精品一区二区| 国产精品你懂得| 久久久精品2019中文字幕神马| 久久国产精品偷| 亚洲第一在线视频| 91久久久久久久久久| 国产视频自拍一区| 午夜精品一区二区三区在线播放| 77777亚洲午夜久久多人| 亚洲国产精品久久久| 中文字幕精品在线| 欧美亚洲另类视频| 国内精品久久久久影院 日本资源| 精品少妇一区二区30p| 欧美贵妇videos办公室| 久久久午夜视频| 国产91在线播放精品91| 欧美激情在线观看| 全色精品综合影院| 国产精品视频1区| yellow中文字幕久久| 国产精品毛片a∨一区二区三区|国| 91精品国产综合久久香蕉922| 日韩av在线最新| 成年无码av片在线| 97视频人免费观看| 清纯唯美亚洲综合| 久久久久www| wwwwwwww亚洲| 福利一区福利二区微拍刺激| 成人性生交大片免费观看嘿嘿视频| 日本精品视频网站| 欧美日韩亚洲91| 欧美激情精品久久久久久黑人| 精品久久久久久中文字幕| 91精品视频播放| 91亚洲精品一区| 国产精品欧美日韩| 国产盗摄xxxx视频xxx69| 日本国产高清不卡| 日韩天堂在线视频| 久久久精品中文字幕| 超碰91人人草人人干| 亚洲欧美国内爽妇网| 国产午夜精品麻豆| 亚洲第一免费网站| 日韩在线视频观看正片免费网站| 精品久久久中文| 久久久在线观看| 精品久久久久久国产91| 中文字幕欧美精品在线| 国产精品久久久久久一区二区| 91大神福利视频在线| 在线激情影院一区| 日韩欧美在线视频免费观看| 欧美视频中文字幕在线| 亚洲成人久久久| 国产精品福利在线观看网址| 亚洲大尺度美女在线| 欧美专区福利在线| 久久久亚洲精选| 国产一区二区三区久久精品| 成人国内精品久久久久一区| 亚洲欧美中文另类| 亚洲精品免费网站| 日韩av影院在线观看| 欧美日韩一区免费| 久久久亚洲天堂| 91国偷自产一区二区三区的观看方式| 92看片淫黄大片看国产片| 欧亚精品中文字幕| 久久久久久国产精品三级玉女聊斋| 在线观看日韩www视频免费| 久久精品国产一区二区电影| 亚洲丁香婷深爱综合| 91精品在线影院| 欧美激情精品久久久久久免费印度| 亚洲欧美在线免费观看| 97在线视频免费观看| 欧美日韩中文字幕综合视频| 国产精品永久免费观看| 亚洲精品免费一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 69久久夜色精品国产69乱青草| 日韩精品免费在线视频| 怡红院精品视频| 欧美性生活大片免费观看网址|