2016-10-15 14 views
5

高次コンポーネント(HOC)は、Reactコミュニティで共通のパターンです。 HOCの内容が分からない場合はthis articleを参照角2で高次コンポーネントを作成する方法

Angular 2で意味がありますか? HOCを作成するには? 例はありますか?

+0

おそらく、これらは役立ちます。https://angular.io/docs/ts/latest/cookbook/dynamic-form.html、http://mean.expert/2016/05/14/angular-2 -container-component/ – Sasxa

+0

現状の問題は、ReactとAngularの両方をよく理解している必要があります。2. HOC用語を使わずに正確に何をしたいのかを説明すると、質の高い回答を得る機会が増えます。 – estus

答えて

1

私はHOC(Angular 2のRecomposeのようなもの)にも非常に興味があります。私は最近、角度構造ディレクティブを使用して、mapToProps HOC 'Recompose for Angular - mapToInputsにアナログを作成しようとしていました。私はより良いアプローチを探しています。

@Component({ 
    selector: 'user-list', 
    template: ` 
     <h2>{{status}} users</h2> 
     <div *ngFor="let item of data">{{item}}</div> 
    ` 
    }) 
    export class UserList { 
    @Input() data: Array<any>; 
    @Input() status: string; 
    } 

    @Directive({selector: '[mapInputs]'}) 
    export class MapInputs { 
    component; 

    @Input() set mapInputsComponent(component) { 
    this.component = component; 
    } 

    @Input() set mapInputs(fn) { 
     this.vc.clear(); 
     let factory = this.componentFactoryResolver.resolveComponentFactory(this.component); 
     let componetRef = this.vc.createComponent(factory); 

     let inputs = fn(); 
     console.log(inputs); 
     Object.entries(inputs).forEach(([key, value]) => { 
     componetRef.instance[key] = value; 
     }); 
    } 

    constructor(private vc: ViewContainerRef, 
      private componentFactoryResolver: ComponentFactoryResolver) { 
    } 
    } 

    @Component({ 
    selector: 'my-app', 
    template: ` 
     <div> 
     <button (click)="doubledata()">Doubel Data</button> 
     <div *mapInputs="filterBy.bind(null, {data:data, status:'active'}); component: component"></div> 
     <div *mapInputs="filterBy.bind(null, {data:data, status:'passive'}); component: component"></div> 
     <div *mapInputs="filterBy.bind(null, {data:data, status:'blocked'}); component: component"></div> 
     </div> 
    `, 
    }) 
    export class App { 
    name: string; 
    component = UserList; 
    data = ['active', 'active', 'passive', 'blocked', 'blocked']; 
    filterBy = (context) => { 
     return { 
      status: context.status, 
      data: context.data.filter(el => el === context.status); 
     }; 
    } 

    doubledata(){ 
     this.data = this.data.concat(this.data); 
    } 

    constructor() { 
     this.name = `Angular! v${VERSION.full}` 
    } 
    } 
+0

これはまともなアプローチのようです。 Angularはあなたに「自然に」それを許さないようです...あなたはこのアプローチをあなた自身のために使っていますか? –

+1

ここに2種類のHOCがあります。プロキシの小道具HOCは、角度で作成することは可能ですが、継承反転 - 私はどのようにAOTと角度でそれを行うか分からない。私はちょうど反応のHOCのアイデアが気に入っていて、それを見逃しています。 –

関連する問題