Код не работает так, как вы ожидаете, из-за нескольких вещей:
- Почему
value
не работает, когда .value
работает?
lit- html использует точку здесь для различения guish между назначением атрибута значения или свойства (value
назначает атрибут и .value
свойство)
Самый простой способ думать о том, что это те атрибуты, которые установлены на самом HTML, а свойства установлены на объекте Javascript, который представляет этот узел.
Теперь, это важно в этом случае, потому что свойство value элемент input устанавливается только из атрибута при первом его рендеринге, если вы хотите изменить его позже, вы должны установить свойство, а не атрибут. Источник
Почему событие изменения не вызывается, когда свойство значения изменяется из кода?
Это происходит потому, что событие изменения запускается из входа, только когда значение входа изменилось из-за какого-то пользователя вход. Источник
Если вы хотите иметь какой-то побочный эффект, который запускается не только при взаимодействии пользователя при вводе, но также при изменении свойства в коде, вы, вероятно, захотите использовать сеттер. В вашем случае это будет выглядеть так:
export class ViTextfield extends LitElement {
static get properties() {
return {
value: {
type: String
},
}
}
set value(value) {
const oldValue = this.value;
// do some side effect here
// set a pseudo-private property that will contain the actual value
this._value = value;
// call LitElement's requestUpdate so that a rerender is done if needed
this.requestUpdate('value', oldValue);
}
get value() {
// return the pseudo-private so that when vitextfield.value is accessed the correct value is returned
return this._value;
}
onChange(e) {
// update the property so that it keeps up with the input's current value
this.value = e.target.value;
}
render() {
return html `
<div>
<div>
<input id="vi-input"
type="text"
value="${this.value}"
@change=${this.onChange} />
</div>
</div>
`
}
}
Для получения дополнительной информации проверьте эту часть руководства LitElement