三大前端框架(react、vue、angular2+)父子组件通信总结

前言

公司业务需要,react、vue、angular都有接触[\无奈脸]。虽然说可以拓展知识广度,但是在深度上很让人头疼。最近没事的时候回忆各框架父子组件通信,发现很模糊,于是乎稍微做了一下功课,记录于此,以便加深理解。

React

React是单向数据流,当有多个组件需要共享状态的时候,这就需要把状态放到这些组件共有的父组件中,相应地,这些组件就变成了子组件,从而涉及到父子组件之间的通信。
  父组件通过props 给子组件传递数据,子组件则是通过调用父组件传给它的函数给父组件传递数据。
父组件:

import React, { Component } from 'react';
import Child from './child'
 
class App extends Component {
    constructor(props){
        super(props);
        this.state={
            msg:'父类的消息',
            name:'John',
            age:50
        };
       this.callback = this.callback.bind(this);
    }
   // 通过子组件调用该方法接收从子组件传过来的消息
    callback(msg,name,age){
        this.setState({msg});
        this.setState({name});
        this.setState({age});
    }
 
  render() {
    return (
      <div className="App">
        <p> Message: &nbsp;&nbsp;{this.state.msg}</p>
        <Child callback={this.callback} age={this.state.age} name={this.state.name}>    
        </Child>
      </div>
    );
  }
}
 
export default App;

子组件:

import React from "react";
 
class Child extends React.Component{
    constructor(props){
        super(props);
        this.state={
            name:'Andy',
            age:20,
            msg:"来自子类的消息"
        };
        // 这里目的是为了改变this的指向。使得在函数单独调用的时候,函数内部的this依然指向child组件,亦可用箭头函数的方式
        this.change = this.change.bind(this);
    }
 
    change(){
        //调用父组件的方法修改父组件的内容,即子传父
     this.props.callback(this.state.msg,this.state.name,this.state.age);
    }
   // 通过this.props接收从父组件穿过来的消息
    render(){
        return(
            <div>    
                <div>{this.props.name}</div>
                <div>{this.props.age}</div>
                <button onClick={this.change}>点击</button>
            </div>
        )
    }
}
 
export default Child;

VUE

1.父—>子

<!-- 父组件 -->
// 父组件通过属性绑定给子组件传值
<parent>
    <child :parentToChild="content"></child> 
</parent>

data(){
    return {
        content:'sichaoyun'
    };
}

<!-- 子组件 -->
// 子组件通过props接收数据
export default {
    props: {
        parentToChild: String        // 指定字符串类型,这里还有其他方式,可参考下面链接
    } 
}

//子组件接收后就可以在template中使用
// 或者在方法中通过this.parentToChild使用
<template>
  <div>
    <p>{{parentToChild}}</p>
  </div>
</template>
  1. 子—>父
//vue2.0只允许单向数据传递,我们通过出发事件来改变组件的数据

<!-- 子组件代码 -->
<template>
    <div @click="open"></div>
</template>

methods: {
   open() {
        this.$emit('showbox','the msg'); //触发showbox方法,'the msg'为向父组件传递的数据
    }
}

<!-- 父组件代码 -->
<child @showbox="toshow"></child> //监听子组件触发的showbox事件,然后调用toshow方法

methods: {
    toshow(value) {
        console.log(value);   // the msg
    }
}
  1. 补充以下用emit和on来进行父子以及兄弟组件通信的知识,双手奉上链接
    兄弟组件通信问题:emit和on

Angular2+

  1. 父—>子
// -----------------------------父组件---------------------------
// js:在装饰器下面的类里写的数据。
export class Father{    
    msg="来自父组件的问候"
}
// html:  通过属性绑定传值
<app-child [msg]="msg"></app-child> //放在子组件的属性上


// ----------------------------------子组件---------------------------
// js:引入Input模块
    export class child{
        @Input() msg; //子组件得到数据
    }
// html:
<p>{{msg}}</p> //子组件进行页面渲染
  1. 子—>父
    子组件使用EventEmitter创建自定义事件,并且通过@Output()装饰器把它作为属性暴露出来,父组件通过绑定这个属性来监听事件从而获取子组件数据。
// 使用emit自定义事件
// ------------------- 子组件代码-----------------------------------------
   //  ts:导入Output和EventEmitter两个模块
        export class Child{
            @Output() constmEventToApp=new EventEmitter();//创建emit事件
            ngInit(){
                this.constmEventToApp.emit("数据") //在dom挂载时将数据放入自定义事件中
            }
        }

// -----------------------------父组件代码------------------------------
    // html:
    <Child (constmEventToApp)="handleData($event)"></Child>//将子组件中的自定义事件绑定到父组件下面的子组件标签上。
   //  ts:
    export class Father{
        handleDate(ev){
            console.log(ev);//ev就是子组件所传递过来的数据
        }
    }

总结至此!由于本人才疏学浅,各处借鉴得此文章,so,有不对的地方欢迎各路大神指正,非常感谢!

特别鸣谢下面各位大神的文章,附上链接于此
React 父子组件之间的通信
vue2.0 父子组件通信 兄弟组件通信
angular,vue,react的父子通信

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容