Мои компоненты часто начинаются с нескольких @Input
и @Output
. Когда я добавляю свойства, кажется более чистым переключиться на один объект конфигурации в качестве входных данных.
Например, здесь компонент с несколькими входами и выходами:
export class UsingEventEmitter implements OnInit {
@Input() prop1: number;
@Output() prop1Change = new EventEmitter<number>();
@Input() prop2: number;
@Output() prop2Change = new EventEmitter<number>();
ngOnInit() {
// Simulate something that changes prop1
setTimeout(() => this.prop1Change.emit(this.prop1 + 1));
}
}
И его использование:
export class AppComponent {
prop1 = 1;
onProp1Changed = () => {
// prop1 has already been reassigned by using the [(prop1)]='prop1' syntax
}
prop2 = 2;
onProp2Changed = () => {
// prop2 has already been reassigned by using the [(prop2)]='prop2' syntax
}
}
Шаблон:
<using-event-emitter
[(prop1)]='prop1'
(prop1Change)='onProp1Changed()'
[(prop2)]='prop2'
(prop2Change)='onProp2Changed()'>
</using-event-emitter>
По мере роста количества свойств кажется, что переход на один объект конфигурации может быть более чистым. Например, здесь компонент, который принимает один объект конфигурации:
export class UsingConfig implements OnInit {
@Input() config;
ngOnInit() {
// Simulate something that changes prop1
setTimeout(() => this.config.onProp1Changed(this.config.prop1 + 1));
}
}
И его использование:
export class AppComponent {
config = {
prop1: 1,
onProp1Changed(val: number) {
this.prop1 = val;
},
prop2: 2,
onProp2Changed(val: number) {
this.prop2 = val;
}
};
}
Шаблон:
<using-config [config]='config'></using-config>
Теперь я могу просто передать ссылку на объект конфигурации через несколько слоев вложенных компонентов. Компонент с использованием config будет вызывать обратные вызовы, такие как config.onProp1Changed(...)
, что заставляет объект конфигурации выполнять переназначение нового значения. Похоже, что мы все еще имеем односторонний поток данных. Плюс добавление и удаление свойств не требует изменений в промежуточных слоях.
Есть ли недостатки в наличии одного объекта конфигурации в качестве входа в компонент, вместо того, чтобы иметь несколько входов и выходов? Будет ли избежать @Output
и EventEmitter
как это вызывает проблемы, которые могут догнать мне позже?