三大前端框架(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: {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>
2、子—>父
//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
}
}
3、补充以下用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> //子组件进行页面渲染
2、子—>父
子组件使用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、vue、angular2+)父子组件通信总结的更多相关文章
- Vue 非父子组件通信方案
Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...
- Vue的父子组件通信(转载)
Vue是一个轻量级的渐进式框架,对于它的一些特性和优点在此就不做赘述,本篇文章主要来探讨一下Vue子父组件通信的问题 首先我们先搭好开发环境,我们首先得装好git和npm这两个工具(如果有不清楚的同学 ...
- Vue 非父子组件通信
组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...
- vue(三)-父子组件通信
原因 : Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. props 父组件给子组件传递数据 props:作用是父组件给 ...
- vue.js父子组件通信动态绑定
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Vue.js-----轻量高效的MVVM框架(十、父子组件通信)
#1.父链 html: <h3>#父链</h3> <div> <div>子组件可以用 this.$parent 访问它的父组件.根实例的后代可以用 th ...
- 详解Vue 非父子组件通信方法(非Vuex)
假设 bb 组件里面有个按钮,点击按钮,把 123 传递给 aa 组件 // 根组件(this.$root) new Vue({ el: '#app', router, render: h => ...
- 用Vue的父子组件通信实现todolist的功能
先上代码 <body> <div id="root"> <div> <input v-model="inputValue&quo ...
- vue之父子组件通信
一. 父-子组件间通信 let children={ template:`<div><h1>{{send}}</h1></div>`, # 将传 ...
随机推荐
- Android 音视频深入 十八 FFmpeg播放视频,有声音(附源码下载)
项目地址https://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpegv%E6%92%AD%E6%94%BE%E8%A7% ...
- TCP/IP OPTION字段
0x01 简介 TCP头部和IPV4头部除了固定的20字节外,都设置了 OPTION 字段用于存储自定义的数据,因为TCP头部和IPV4的报文长度字段均为4字节,所表示的最大值为15, 乘4,报文头部 ...
- R语言最优化(多维)
线性搜索的最速上升法 #### max.search <- function(f, x, y, tol=1e-9, a.max = 2^5){ if(sum(abs(y)) == 0) retu ...
- 201671010142 2017-2 《java第十一章学习感悟》
事件处理基础 事件源,事件监听器,事件监听器 监听器接口的实现,监听器对象所属类必须实现与事件源相对应的接口,即必须提供接口中方法的实现. 适配器类 当程序用户试图关闭一个框架窗口时,Jframe对 ...
- optimal-account-balancing
一群朋友去度假,有时互相借钱. 例如,爱丽丝为比尔的午餐支付了 10 美元.后来克里斯给爱丽丝 5 美元搭出租车.我们可以假设每笔交易为一个三元组(X,Y,Z),这意味着第 X 个人借给第 Y 个人 ...
- datatable 添加列之前判断是否存在该列
if (!dt.Columns.Contains("BDate")) { DataColumn dc1 = new DataColumn("BDate", ty ...
- Vultr新用户充值优惠 – 最多充值100美元送100美元
Vultr商家向来是搅局的,当初海外VPS商家被Linode一家独大的时候,由于VULTR商家进入市场进行相似产品的营销,使得目前我们看到海外主机商各种低价.当然这些说法也有些武断,但是肯定是有一定的 ...
- 从0到1用eclipse用maven搭建web项目
1,默认已经搭建了JDK1.5以上,以及eclipseEE版本,和maven. 2,修改maven的本地仓库和镜像,修改本地仓库是为了方便我们管理,maven的默认仓库是在C盘的USER文件夹下,我一 ...
- webStorm activeCode
https://blog.csdn.net/qq_33183172/article/details/81491183
- CKEditor的使用,并实现图片上传
ckeditor是一款富文本编辑器,类似于论坛帖子下边的回复输入框. 1.先要下载相应js文件,点我下载.根据自己的需求选择插件的丰富程度,下载后解压得到一个文件夹,放到webRoot目录下. 2.在 ...