单页应用程序组件通信有以下几种类型。本文主要讲Angular通信父组件=>子组件子组件=>父组件A组件=>组件B父组件=>子组件子组件=>父组件sibling=>sibling@input@outputsetters(本质上是@input)注入父组件ngOnChanges()(不推荐)局部变量@ViewChild()serviceserviceserviceRxjsObservalbeRxjsObservalbeRxjsObservalbelocalStorage,sessionStoragelocalStorage,sessionStoragelocalStorage,sessionStorage上图总结了可以使用的通信方案,最后三种是通用的,可以在两者之间使用angular组件,其中Rxjs是最强大的用法,redux,promise,这些也是基于函数状态管理的。,说说父组件=>子组件@input,最常用的方法@Component({selector:'app-parent',template:'
',styleUrls:['./parent.component.css']})exportclassParentComponentimplementsOnInit{varString:string;constructor(){}ngOnInit(){this.varString='从父组件传递';}}import{Component,OnInit,Input}from'@angular/core';@Component({selector:'app-child',template:'
{{textContent}}
',styleUrls:['./child.component.css']})exportclassChildComponentimplementsOnInit{@Input()publictextContent:string;constructor(){}ngOnInit(){}}settersetter是拦截@input属性,因为我们在组件通信的时候,经常需要对输入的属性进行处理,就需要一个setter。Setter和getter经常一起使用。将上面的child.component.tschild.component.tsimport{Component,OnInit,Input}from'@angular/core';@Component({selector:'app-child',template:'
{{textContent}}
',styleUrls:['./child.component.css']})导出类ChildComponent实现OnInit{_textContent:string;@Input()settextContent(text:string){this._textContent=!text:"Nothingwasgiventome"?文本;};获取textContent(){返回this._textContent;}constructor(){}ngOnInit(){}}onChange这是由角度生命周期钩子检测到的。私有方法import{Component,OnInit,ViewChild}from'@angular/core';从"../view-child-child/view-child-child.import{ViewChildChildComponent}导入。component";@Component({selector:'app-parent',templateUrl:'./parent.component.html',styleUrls:['./parent.component.css']})exportclassParentComponentimplementsOnInit{varString:string;@ViewChild(ViewChildChildComponent)viewChildChildComponent:ViewChildChildComponent;constructor(){}ngOnInit(){this.varString='从父组件传过来的';}clickEvent(clickEvent:any){console.log(clickEvent);this.viewChildChildComponent.myName(clickEvent.value);}}import{Component,OnInit}from'@angular/core';@Component({选择器:'app-view-child-child',templateUrl:'./view-child-child.component.html',styleUrls:['./view-child-child.component.css']})exportclassViewChildChildComponentimplementsOnInit{constructor(){}name:string;myName(name:string){控制台。日志(名称);this.name=名称;}ngOnInit(){}}局部变量局部变量类似于viewChild,只能在html模板中使用,修改parent.component.html,使用变量#viewChild表示子组件,然后子组件的方法即可
局部变量值 子组件如下@Component({selector:'app-view-child-child',templateUrl:'./view-child-child.component.html',styleUrls:['./view-child-child.component.css']})exportclassViewChildChildComponentimplementsOnInit{构造函数(){}名称:字符串;myName(name:string){console.log(name);this.name=名称;}ngOnInit(){}}子组件=>父组件@output()output这种普通通信本质上是为子组件传入一个函数,在子组件中执行完某些方法后,执行传入的回调函数,并将值传递给父组件parent.component.ts@Component({selector:'app-child-to-parent',templateUrl:'./parent.component.html',styleUrls:['./parent.component.css']})exportclassChildToParentComponentimplementsOnInit{childName:string;childNameForInject:字符串;constructor(){}ngOnInit(){}showChildName(name:string){this.childName=name;}}parent.component.html