美文网首页
组件之@Input & @Output

组件之@Input & @Output

作者: 忘尘无憾 | 来源:发表于2017-05-10 20:04 被阅读81次

    Angular提供了输入(@Input)和输出(@Output)语法来处理组件数据的流出流出。


    Angular官网

    被@Input修饰的变量属于输入属性,输入属性接收数据值,被@Output修饰的变量属于输出属性,输出属性暴露事件产生者,如EventEmitter对象。通常输出属性一般是以事件的形式,将数据通过EventEmitter抛出。

    声明输入和输出属性的方式有两种

    首先,需要在组件中引入Input、Output

    import { Component, OnInit, Input, Output } from '@angular/core';
    
    • 在组件内部,被装饰器标记成输入和输出属性
    //test.ts
    export class TestComponent {
        @Input() data: string;
        @Output() onChange = new EventEmitter<string>();
    }
    //home.html
    <test-page [data]="data" (onChange)="onChange($event)" ></test-page>```
    - 还可以在组件元数据中使用inputs、outputs来设置输入输出属性
    

    //test.ts
    @Component({
    // ...
    inputs: ['data'],
    outputs: ['onChange']
    })
    export class TestComponent {
    data: string;
    onChange = new EventEmitter<string>();
    // ...
    }

    如果需要给输入/输出属性取别名
    - 在组件内
    

    //test.ts
    export class TestComponent {
    @Input('myData') data: string;
    @Output() onChange = new EventEmitter<string>();
    // ...
    }

    或
    - 在inputs和outputs数组中,可以写一个:分隔的字符串,左侧是指令中的属性名,右侧是公开的别名
    

    outputs:['onChange:myOnChange']

    
    #### 父组件向子组件传递数据
    父组件的数据通过子组件的输入属性流入子组件,在子组件完成接收或拦截,以此实现数据由上而下的传递。
    

    //test.ts
    @Component({
    selector: 'test-page',
    template: <h1>{{data}}</h1>
    })
    export class TestComponent {
    @Input() data: string;
    @Output() onChange = new EventEmitter<string>();
    // ...
    }

    //home.html
    <test-page [data]="data" (onChange) = "onChange($event)" > </test-page>

    在home父组件中,定义data变量,通过home.html,模板输入绑定[data]将父组件的data传入到子组件中,子组件通过@Input()完成数据的接收
    ####子组件向父组件传递数据
    使用事件传递是子组件向父组件传递数据最常用的方式。子组件需要实例化一个用来订阅和触发自定义事件的EventEmitter类,这个实例对象是一个由装饰器@Output修饰的输出属性,当有用户操作行为发生时,该事件会触发,父组件则通过事件绑定的方式来订阅来自子组件触发的事件。
    

    //home.html
    <test-page [data]="data" (onChange)="onChange($event)" ></test-page>

    //home.ts
    data: number = 123456789;
    onChange(s: number) {
    console.log("传回的数据:"+s);
    }

    //test.html
    <a (click)="onChangeFn(data)" >点击{{data}}</a>

    //test.ts
    @Input() data: number;//接收父组件传入的数据
    @Output() onChange = new EventEmitter<number>();
    onChangeFn(s: number) {
    console.log("点击按钮的数据:"+s);
    this.onChange.emit(s);
    }

    home父组件定义data数据以及onChange方法,将其传入子组件test中,test通过装饰器@Input接收data数据,并在模板中使用,test实例化该事件,并在点击元素后传入一个数据到onChangeFn方法中,最后通过this.onChange.emit(s)让父组件home中的自定义事件onChange执行,打印日志。
    ####@Input的setter拦截输入属性
    getter和setter通常配套使用,用来对属性进行相关约束。
    

    //home.ts
    @Component({
    // ...
    template: <test-page *ngFor="let name of names" [name]="name"></test-page>
    })
    export class HomeComponent {
    names = ['Mr. IQ', ' ', ' Bombasto '];
    }

    //test.ts
    @Component({
    selector: 'test-page',
    template: '<h3>"{{name}}"</h3>'
    })
    export class TestComponent {
    private _name = '';
    @Input()
    set name(name: string) {
    this._name = (name && name.trim()) || '<no name set>';
    }
    get name(): string { return this._name; }
    }
    log输出:
    Mr. IQ
    <no name set>
    Bombasto

    
    后来再看官网,发现官网文档上写的非常清楚,简直尴尬了,-。-。
    [官网组件通讯地址](https://angular.cn/docs/ts/latest/cookbook/component-communication.html)

    相关文章

      网友评论

          本文标题:组件之@Input & @Output

          本文链接:https://www.haomeiwen.com/subject/gbygtxtx.html