<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        React 組件間的通信示例

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:13:09
        文檔

        React 組件間的通信示例

        React 組件間的通信示例:前言 從官網(wǎng)上也有介紹組件間如何通信,但不夠詳細(xì),這里做個(gè)小結(jié),方便對(duì)比和回顧 本文內(nèi)容 處理組件之間的通信, 主要取決于組件之間的關(guān)系,因此我們劃分為以下三種: 【父組件】向【子組件】傳值; 【子組件】向【父組件】傳值; 【組件A】向無關(guān)系【
        推薦度:
        導(dǎo)讀React 組件間的通信示例:前言 從官網(wǎng)上也有介紹組件間如何通信,但不夠詳細(xì),這里做個(gè)小結(jié),方便對(duì)比和回顧 本文內(nèi)容 處理組件之間的通信, 主要取決于組件之間的關(guān)系,因此我們劃分為以下三種: 【父組件】向【子組件】傳值; 【子組件】向【父組件】傳值; 【組件A】向無關(guān)系【

        前言

        從官網(wǎng)上也有介紹組件間如何通信,但不夠詳細(xì),這里做個(gè)小結(jié),方便對(duì)比和回顧

        本文內(nèi)容

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

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

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

        這是最普遍的用法,實(shí)現(xiàn)上也非常簡(jiǎn)單,主要是利用props來實(shí)現(xiàn)

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

        多想一點(diǎn):

        如果組件的嵌套層次太多,那么從外到內(nèi)的交流成本就會(huì)加深,通過 props 傳值的優(yōu)勢(shì)就不明顯,因此,我們還是要盡可能的編寫結(jié)構(gòu)清晰簡(jiǎn)單的組件關(guān)系, 既也要遵循組件獨(dú)立原則,又要適當(dāng)控制頁面,不可能或極少可能會(huì)被單用的代碼片,可不編寫成一個(gè)子組件

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

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

        子組件向父組件傳值,需要控制自己的state,并發(fā)起父組件的事件回調(diào)來通知父組件

        // 父組件
        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 是一個(gè)異步方法,state值不會(huì)立即改變,回調(diào)時(shí)要傳緩存的當(dāng)前值, 
         // 也可以利用傳遞一個(gè)函數(shù)(以上傳的是對(duì)象),并傳遞prevState參數(shù)來實(shí)現(xiàn)數(shù)據(jù)的同步更新
         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>
         )
         }
        }
        

        多想一點(diǎn):

        1. 同樣應(yīng)當(dāng)避免深層次的組件嵌套
        2. 這里其實(shí)是依賴了props來傳遞事件的引用,并通過回調(diào)的方式來實(shí)現(xiàn),在沒有使用工具情況下,可以使用該辦法

        拓展一點(diǎn):

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

        1. 「this」 指向你的組件
        2. 「一個(gè)參數(shù)」 一個(gè)react合成事件, SyntheticEvent

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

        多個(gè)子組件回調(diào)同一個(gè)回調(diào)函數(shù)情況

        父組件中大概率包含多個(gè)子組件,為節(jié)省和簡(jiǎn)潔代碼,遵循 don't repeat yourself 原則,我們會(huì)讓一個(gè)回調(diào)函數(shù)實(shí)現(xiàn)多個(gè)子組件的功能,或多個(gè)組件協(xié)作完成指定功能

        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>
         }
         }
        }
        

        多想一點(diǎn):

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

        三、組件A和無關(guān)系組件B之間的通信

        如果組件之間沒有任何關(guān)系,或者組件嵌套的層次比較深,或者,你為了一些組件能夠訂閱,寫入一些信號(hào),不想讓兩個(gè)組件之間插入一個(gè)組件,而是讓兩個(gè)組件出于獨(dú)立的關(guān)系。對(duì)于時(shí)間系統(tǒng),有兩個(gè)基本操作:

        1. 訂閱: subscribe
        2. 監(jiān)聽: listen

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

        1. Event Emitter/Target/Dispatcher

        特點(diǎn): 需要一個(gè)指定的訂閱源

        // to subscribe
        otherObiect.addEventListener('clickEvent', function() {
         alert('click!');
        })
        // to dispatch
        this.dispatchEvent('clickEvent');
        

        2. Publish / Subscribe

        特點(diǎn): 觸發(fā)的時(shí)候,不需要指定一個(gè)特定的源,使用全局對(duì)象廣播的方式來處理事件

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

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

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

        3. Single

        特點(diǎn): 與 Event Emitter/Target/Dispatcher 類似,但是不要使用隨機(jī)字符串作為事件觸發(fā)的引用。觸發(fā)事件的每一個(gè)對(duì)象都需要一個(gè)確切的名字,并且在觸發(fā)的時(shí)候,也必須要指定確切的事件

        // to subscribe
        otherObject.clicked.add(function() {
         alert('click');
        })
        // to dispatch
        this.clicked.dispatch();
        

        React 團(tuán)隊(duì)使用的是:js-signals 它基于 Signals 模式,用起來相當(dāng)不錯(cuò)。

        事件訂閱與取消

        使用React事件的時(shí)候,必須關(guān)注以下兩個(gè)方法:

        1. componentDidMount
        2. componentWillUnmount

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

        因?yàn)榻M件的渲染和銷毀是有 React 來控制的,我們不知道怎么引用他們,所以EventEmitter 模式在處理事件的時(shí)候用處不大,Pub/Sub 模式就好用些,因?yàn)槲覀儾恍枰酪迷谀摹?/p>

        ES6策略: yield and js-csp

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

        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);
        }

        結(jié)束語

        數(shù)據(jù)在組件中應(yīng)該以什么樣的方式進(jìn)行傳遞取決于組件之間存在什么樣的關(guān)系和當(dāng)時(shí)的業(yè)務(wù)場(chǎng)景需求,大家應(yīng)該根據(jù)項(xiàng)目合理選擇數(shù)據(jù)處理的方案,這很可能減少你大量的代碼量和代碼邏輯。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        React 組件間的通信示例

        React 組件間的通信示例:前言 從官網(wǎng)上也有介紹組件間如何通信,但不夠詳細(xì),這里做個(gè)小結(jié),方便對(duì)比和回顧 本文內(nèi)容 處理組件之間的通信, 主要取決于組件之間的關(guān)系,因此我們劃分為以下三種: 【父組件】向【子組件】傳值; 【子組件】向【父組件】傳值; 【組件A】向無關(guān)系【
        推薦度:
        標(biāo)簽: 通訊 例子 通信
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 天堂亚洲国产中文在线| 亚洲AV日韩AV永久无码久久| 亚洲人成色4444在线观看| 在线免费观看国产| 一级毛片不卡片免费观看| 亚洲gv白嫩小受在线观看| 男人j进入女人j内部免费网站| 久久久久国色AV免费观看性色| 亚洲黄色三级视频| 精品免费久久久久国产一区| 2020久久精品国产免费| 波多野结衣中文一区二区免费| 久久久久亚洲av无码专区蜜芽| 亚洲AV性色在线观看| 在线观看免费国产视频| 亚洲一级二级三级不卡| 精品免费久久久久久久| 亚洲国产成人精品激情| 成人午夜大片免费7777| 色婷婷综合缴情综免费观看| 国产aⅴ无码专区亚洲av麻豆| 亚洲成人激情小说| 国产在线观看免费不卡| 国产精品免费在线播放| 亚洲AV无码一区二区三区DV| 最近2019免费中文字幕视频三| 在线精品亚洲一区二区三区| 在线aⅴ亚洲中文字幕| 亚洲一区免费观看| 亚洲人成人网毛片在线播放| 国产不卡免费视频| 中文字幕视频在线免费观看| 亚洲精品在线免费看| 日韩高清免费观看| 久久精品国产影库免费看| 亚洲色图激情文学| 国产成人亚洲精品狼色在线| 一个人免费观看www视频在线| 亚洲日本中文字幕区| a级毛片免费全部播放| 波多野结衣一区二区免费视频|