React当中复合组件通信方式都有那些?

第一种:属性传递方法(单向数据流的)

父亲把属性传递给儿子,或者是后代.(儿子是传不了父亲的),但是父亲组件把自身的方法通过属性传递给子组件,子组件不仅能接受这个方法,还能执行这个方法.这样就能达到子组件执行方法的时候把一些属性传递给父组件,并修改父组件中的一些信息.在react中属性传递方法类似于Jsonp,类似于hybride H5和原生App 的交互方式中的场景,能实现子改父.但是这仅仅局限于父子关系.如果是爷孙关系,还得把属性传递给儿子,再传递给孙子(如果关系层级更多,还得一层层的去传递,这样写起来比较麻烦).

第二种:发布订阅的方式

应用第三方库,或者是自己写一个发布订阅模式的代码

第三种:执行上下文

在组件元素当中,为了快速,方便的写可以用react中context这个API,在祖先元素当中,我们首先用react.Createcontext创建一个context,在他的祖先元素当中通过执行上下文中那个对象中的Provider组件,把后代元素要使用的上下文通过value的方式注册下来,那么后代可以用Consumer或contextType来进行消费.

好处:执行上下文有一个好处,只要他们有一个共同的祖先,都可以调用祖先上的信息),属性的特点:只要是父子的,哪怕是兄弟,他俩只要有一个共同的爹,都是可以用属性的方式.
缺点;执行上下文虽然解决了兄弟组件之间的传递但是他的缺点是要把所有的信息都写在祖先组件上,而且,我们想要信息改变的时候,要把祖先中某个方法放到上下文当中,由后代去执行这个方法,执行的方法还是祖先的方法,而祖先方法里边通过修改状态让祖先重新渲染,才能保证后代元素重新渲染,所以祖先的业务逻辑随着项目的不断增大会越来越多,这样也不是特别好.

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

export default class Vote extends React.Component {
    //设置属性的规则
    static defaultProps = {
        supNum: 0,
        oppNum: 0
    }
    static propTypes = {
        title: PropTypes.string.isRequired,
        supNum: PropTypes.number,
        oppNum: PropTypes.number
    }
    //设置初始值
    constructor(props) {
        super(props)
        this.state = {
            //把传进来的属性复制给了状态,好处是 状态可以在组件中修改,属性不能
            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>支持人数:{supNum}</p>
                <p>反对人数:{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的实例,不管怎么调用都是这样,但是react中不是,他就是我们原生js中的特性,this是不固定的,看你怎么调用来决定 
    //=>为了保证this是实例,我们写的方法一般基于箭头来构建
    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不是当前类的实例
    // }
    //一般用箭头函数让 this指向实例
    text=ev=>{
        //=>ev不是我们原生js的事件对象(经过react处理的,把每一个属性都getter和setter了),但是用的时候和原生用法一致即可
        // console.log(ev.currentTarget)
        ev.persist();
        console.log(ev)
        //ev.currentTarget能知道当前元素 输出 <button>测试ev</button>
        console.log(ev.currentTarget)
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,026评论 2 35
  • [toc] REACT react :1.用来构建用户界面的 JAVASCRIPT 库2.react 专注于视图层...
    拨开云雾0521阅读 1,426评论 0 1
  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,794评论 0 24
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,566评论 0 7
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,195评论 2 21