• angular5 组件通信(一)


      用了两年angular1,对1的组件通信比较熟练,最直接的就是直接使用scope的父子节点scope就可以实现,且基本都是基于作用域实现的通信;还有就是emit,broadcast,on这几个东西了。但是到了angular2,就不再有作用域这个概念了,那么,angular2以后,组件的通信是什么样的呢?

      主要是父子组件的通信,angular5使用的是@Input来实现父传子,通过@Output和EventEmitter来实现子传父。由此可见其单向数据绑定思想,对于提升效率有很大作用。而父子互传,则又相当于1的双向数据绑定。

      上代码解析:

    // child-component.ts
    import { OnInit, Component, Input } from '@angular/core';
    
    @Component({
        selector: 'child-component',
        ...
    })
    export class ChildComponent implements OnInit {
        @Input
        count: number = 0;
    
        ngOnInit() {
            console.log(this.count);    // 父组件内传入的值或者我们自己设置的初始值0
        }
    
        increaseNumber() {
            this.count ++;
        }
    
        descreaseNumber() {
            this.count --;
        }
    }
    

      

    // father-component.ts
    import { Component } from '@angular/core';
    import { ChildComponent } from '../child-component/child-component';
    
    @Component({
        template: `
            <child-component [count]='initialCount'></child-component>
        `,
        ...
    })
    export class FatherComponent {
        initialCount: number = 5;
    }
    

      至此则实现了父传[count]='initialCount'到子的通信。

      我们给父组件增加一个事件接收子组件发来的消息,并且在子组件需要发送的地方进行发送。

    // father-component.ts
    import { Component } from '@angular/core';
    import { ChildComponent } from '../child-component/child-component';
    
    @Component({
        template: `
            <child-component [count]='initialCount' (change)="countChange($event)"></child-component>
        `,
        ...
    })
    export class FatherComponent {
        initialCount: number = 5;
    
        countChange($event) {
    
        }
    }
    

      

    // child-component.ts
    import { Component, Input, Output, EventEmitter } from '@angular/core';
    
    @Component({
        selector: 'child-component',
        ...
    })
    export class ChildComponent {
        @Input
        count: number = 0;
    
        @Output
        change = new EventEmitter();
    
        increaseNumber() {
            this.count ++;
            this.change.emit(this.count);
        }
    
        descreaseNumber() {
            this.count --;
            this.change.emit(this.count);
        }
    }
    

      至此实现父子双向通信。

      而在angular中,双向绑定有独特的写法,即[()],如上边的child-component就可以写作

    <child-component [(count)]='initialCount'></child-component>
    

      即:双向数据绑定 = 单向数据绑定 + 事件  的思想。

    <input type='text' name='userName' [(ngModel)]="userName">

    等价于

    <input type='text' name='userName' [ngModel]="userName" (ngModelChange)="userName=$event">


    除此之外,还有通过service,消息定义subscribe,父子互相获取实例这几种方法来实现。见
    https://www.cnblogs.com/huangenai/p/7246651.html
    https://blog.csdn.net/qq_15096707/article/details/52859110
    FIGHTING
  • 相关阅读:
    匿名变量
    Vue父子组件传值与非父子传值
    TCP三次握手分析
    @media screen 响应式布局
    H5新增多媒体标签
    npm+node+vue配置一套带走
    vue+echarts全国疫情地图
    js本地时间格式化
    vue iview分页
    Vue打包后访问静态资源路径问题
  • 原文地址:https://www.cnblogs.com/ljwsyt/p/9056922.html
Copyright © 2020-2023  润新知