Я лично переопределяю метод requestUpdate, чтобы быть в курсе изменений перед рендерингом.
Мой пример использования - перехватить изменение атрибута label для запуска асинхронного запроса данных.
Фрагмент ниже (в TypeScript):
@customElement('my-element')
export default class MyElement extends LitElement {
@property({type: String})
label: string | null = null;
@property({attribute: false})
private isLoading: boolean = false;
@property({attribute: false, noAccessor: true})
private data: MyData | null = null;
protected render() {/*some code*/}
requestUpdate(name?: PropertyKey, oldValue?: unknown) {
if(name && name == "label" && this.label !== oldValue) {
this.isLoading = true;
requestData(this.label, this._callbackData);
}
return super.requestUpdate(name, oldValue);
}
private _callbackData(data: MyData}) {
this.data = data;
this.isLoading = false;
}
}
Таким образом, мой элемент отображается только дважды: один с новой меткой и загружается как true, а другой - когда данные доступны.