三大前端框架(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>`, # 将传 ...
随机推荐
- PHP语言学习之php-fpm 三种运行模式
本文主要向大家介绍了PHP语言学习之php-fpm 三种运行模式,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. php-fpm配置 配置文件:php-fpm.conf 开启慢日志功能的 ...
- centos6.8安装mysql5.5
在使用阿里云的时候发现centos6.8系统自带的源当中没有mysql5.5,在网易这些源里面也是5.1的版本.这里安装mysql5.5的话需要另外添加一个源. 1.查看是否已经安装了MySQL rp ...
- unity 中UGUI制作滚动条视图效果(按钮)
1.在unity中创建一个Image作为滚动条视图的背景: 2.在Image下创建一个空物体,在空物体下创建unity自带的Scroll View组件: 3.对滑动条视图的子物体进行调整: 4.添加滚 ...
- Get 请求 与 Post 请求的区别
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数.举例: 在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象.但是 ...
- SVN删除文件和恢复文件
SVN删除文件 一.本地删除SVN删除文件中的本地删除,指的是在客户端delete了一个文件,但还没有commit,使用revert来撤销删除. 二.服务器删除1.通过本地删除后提交服务器a)Upda ...
- websocket session共享
单机运行 用户a通过服务器进入房间room,用户b也通过房间进入room,用户之间是通过session来通话的,所以session直接存储在集合中就可以了. 因为session存储在一台服务器的集合中 ...
- JS获取伪元素的属性
window下的getComputedStyle属性.getPropertyValue属性 // 获取 .element:before 的 color 值 var color = window.get ...
- Nexus3.x安装及配置
若排版紊乱可查看我的个人博客原文地址 搭建maven私服主要是为了方便在一个团队中使用maven中央仓库没有的jar包,这些非中央仓库的jar包可能是自己团队开发的公共依赖jar包,可能是第三方私有的 ...
- Jsの练习-数组常用方法 -forEach()
forEach() : 对数组进行遍历循环,对数组中的每一项运行给定函数. 格式: arr.forEach(function(value,index){}) <!DOCTYPE html> ...
- Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...