Вопрос: Есть ли способ распространить изменение свойства на дочерний элемент, не вызывая его функцию render
? В настоящее время, когда я обновляю свойство в родительском switchViewModeHandler
, оно запускает повторную визуализацию дочернего элемента.
Вариант использования: переключение родителя в режим редактирования должно включать то же самое для всех его дочерних элементов.
Сомнение: Стоит ли использовать пользовательские события? Проблема состоит в том, что это будет сложная сеть вложенных элементов, с событиями, которые станут довольно громоздкими для отладки довольно быстро (уже столкнулся с этой проблемой с Polymer).
Настройка: Родительский элемент:
class ParentElement extends LitElement {
@property() viewMode;
constructor() {
this.viewMode = ViewMode.editable;
}
static get properties() {
return {
viewMode: { type: String, reflect: true },
};
}
private switchViewModeHandler(event: MouseEvent): void {
this.viewMode =
(this.viewMode === ViewMode.editing) ? ViewMode.editable : ViewMode.editing; // update my own edit mode
const options: HTMLElement[] = (Array.from(this.children) as HTMLElement[]);
options.forEach((item: HTMLElement) => {
item.viewMode = this.viewMode;
});
}
render() {
return html`
<p>parent</p><label class="switch-wrapper">toggle edit mode
<input type="checkbox"
?checked="${this.viewMode === ViewMode.editing}"
@click="${
(event: MouseEvent): void => this.switchViewModeHandler(event)
}"
/>
</label>
<slot></slot><!-- child comes from here -->
`;
}
}
Дочерний элемент:
class ChildElement extends LitElement {
@property() viewMode;
constructor() {
super();
this.viewMode = ViewMode.editable;
}
static get properties() {
return {
viewMode: { type: String, reflect: true },
};
}
render() {
console.log('child render() called');
return html`
<div class="viewer">child viewer</div>
<div class="editor mode-${this.viewMode}">child editor</div>
`;
}
}
Markup:
<parent-element>
<child-element data-type="special"></child-element
></parent-element>
Режим редактирования происходит из простого импортированного перечисления (здесь опущено):
export enum ViewMode {
readOnly = 'readOnly',
editable = 'editable',
editing = 'editing',
}
Вот код-песочница для игры: https://codesandbox.io/s/v1988qmn75