React當中復合組件通信方式都有那些?

第一種:屬性傳遞方法(單向數(shù)據(jù)流的)

父親把屬性傳遞給兒子,或者是后代.(兒子是傳不了父親的),但是父親組件把自身的方法通過屬性傳遞給子組件,子組件不僅能接受這個方法,還能執(zhí)行這個方法.這樣就能達到子組件執(zhí)行方法的時候把一些屬性傳遞給父組件,并修改父組件中的一些信息.在react中屬性傳遞方法類似于Jsonp,類似于hybride H5和原生App 的交互方式中的場景,能實現(xiàn)子改父.但是這僅僅局限于父子關(guān)系.如果是爺孫關(guān)系,還得把屬性傳遞給兒子,再傳遞給孫子(如果關(guān)系層級更多,還得一層層的去傳遞,這樣寫起來比較麻煩).

第二種:發(fā)布訂閱的方式

應用第三方庫,或者是自己寫一個發(fā)布訂閱模式的代碼

第三種:執(zhí)行上下文

在組件元素當中,為了快速,方便的寫可以用react中context這個API,在祖先元素當中,我們首先用react.Createcontext創(chuàng)建一個context,在他的祖先元素當中通過執(zhí)行上下文中那個對象中的Provider組件,把后代元素要使用的上下文通過value的方式注冊下來,那么后代可以用Consumer或contextType來進行消費.

好處:執(zhí)行上下文有一個好處,只要他們有一個共同的祖先,都可以調(diào)用祖先上的信息),屬性的特點:只要是父子的,哪怕是兄弟,他倆只要有一個共同的爹,都是可以用屬性的方式.
缺點;執(zhí)行上下文雖然解決了兄弟組件之間的傳遞但是他的缺點是要把所有的信息都寫在祖先組件上,而且,我們想要信息改變的時候,要把祖先中某個方法放到上下文當中,由后代去執(zhí)行這個方法,執(zhí)行的方法還是祖先的方法,而祖先方法里邊通過修改狀態(tài)讓祖先重新渲染,才能保證后代元素重新渲染,所以祖先的業(yè)務(wù)邏輯隨著項目的不斷增大會越來越多,這樣也不是特別好.

import React from "react";
import PropTypes from "prop-types";
import "./Vote.css";

export default class Vote extends React.Component {
    //設(shè)置屬性的規(guī)則
    static defaultProps = {
        supNum: 0,
        oppNum: 0
    }
    static propTypes = {
        title: PropTypes.string.isRequired,
        supNum: PropTypes.number,
        oppNum: PropTypes.number
    }
    //設(shè)置初始值
    constructor(props) {
        super(props)
        this.state = {
            //把傳進來的屬性復制給了狀態(tài),好處是 狀態(tài)可以在組件中修改沼瘫,屬性不能
            supNum: this.props.supNum,
            oppNum: this.props.oppNum
        }
    }

    render() {

        let { supNum, oppNum } = this.state;

        return <div className="voteBox">
            <header className="headerBox">
                <h3>{this.props.title}</h3>
                <span>N:{supNum + oppNum}</span>
            </header>
            <main>
                <p>支持人數(shù):{supNum}</p>
                <p>反對人數(shù):{oppNum}</p>
                <p>支持率:{this.getRatio()}</p>
            </main>
            <footer className="footerBox">
                <button onClick={this.handle.bind(this,"A")}>支持</button>
                <button  onClick={this.handle.bind(this,"B")}> 反對</button>
                <button onClick={this.text}>測試ev</button>
            </footer>
        </div>
    }
    //=>定義一些需要使用的方法(vote.prototype) :vue中的寫法抬纸,方法中的this都是vue的實例,不管怎么調(diào)用都是這樣耿戚,但是react中不是湿故,他就是我們原生js中的特性,this是不固定的膜蛔,看你怎么調(diào)用來決定 
    //=>為了保證this是實例坛猪,我們寫的方法一般基于箭頭來構(gòu)建
    getRatio=()=> {
        // this是實例了
        let {supNum,oppNum} = this.state,
        ratio=null,
        total =supNum+oppNum;
        ratio =total===0? 0:supNum/total*100; 
        return ratio.toFixed(2)+"%";
    }
    handle=(type,ev)=>{
        console.log(ev)
        console.log(type)
        let {supNum,oppNum} = this.state
        if(type==="A"){
            this.setState({
                supNum:supNum+1
            })
            return ;
        }else if(type==="B"){
            this.setState({
                oppNum:oppNum+1
            })
            return 
        }else{
            return 
        }
    }
    // text(){
    //     console.log(this) //這么寫 this不是當前類的實例
    // }
    //一般用箭頭函數(shù)讓 this指向?qū)嵗?    text=ev=>{
        //=>ev不是我們原生js的事件對象(經(jīng)過react處理的,把每一個屬性都getter和setter了),但是用的時候和原生用法一致即可
        // console.log(ev.currentTarget)
        ev.persist();
        console.log(ev)
        //ev.currentTarget能知道當前元素 輸出 <button>測試ev</button>
        console.log(ev.currentTarget)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皂股,一起剝皮案震驚了整個濱河市墅茉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呜呐,老刑警劉巖就斤,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蘑辑,居然都是意外死亡洋机,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門洋魂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绷旗,“玉大人,你說我怎么就攤上這事副砍∠沃” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵址晕,是天一觀的道長膀懈。 經(jīng)常有香客問我,道長谨垃,這世上最難降的妖魔是什么启搂? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任硼控,我火速辦了婚禮,結(jié)果婚禮上胳赌,老公的妹妹穿的比我還像新娘牢撼。我一直安慰自己,他們只是感情好疑苫,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布熏版。 她就那樣靜靜地躺著,像睡著了一般捍掺。 火紅的嫁衣襯著肌膚如雪撼短。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天挺勿,我揣著相機與錄音曲横,去河邊找鬼。 笑死不瓶,一個胖子當著我的面吹牛禾嫉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚊丐,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熙参,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了麦备?” 一聲冷哼從身側(cè)響起孽椰,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凛篙,沒想到半個月后弄屡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鞋诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年膀捷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片削彬。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡全庸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出融痛,到底是詐尸還是另有隱情壶笼,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布雁刷,位于F島的核電站覆劈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜责语,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一炮障、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坤候,春花似錦胁赢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徒河,卻和暖如春系馆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顽照。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工它呀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棒厘。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像下隧,于是被迫代替她去往敵國和親奢人。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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

  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,064評論 2 35
  • [toc] REACT react :1.用來構(gòu)建用戶界面的 JAVASCRIPT 庫2.react 專注于視圖層...
    撥開云霧0521閱讀 1,444評論 0 1
  • 3. JSX JSX是對JavaScript語言的一個擴展語法淆院, 用于生產(chǎn)React“元素”何乎,建議在描述UI的時候...
    pixels閱讀 2,824評論 0 24
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級和職位的變化,入門級到專家級土辩,廣度和深度都會有所增加支救。 題目類型: 理論知...
    怡寶丶閱讀 2,582評論 0 7
  • 以下內(nèi)容是我在學習和研究React時读串,對React的特性渣淳、重點和注意事項的提取、精練和總結(jié)瘩绒,可以做為React特性...
    科研者閱讀 8,232評論 2 21