gpt4 book ai didi

javascript - 自定义 litelement 选择未正确重新呈现

转载 作者:行者123 更新时间:2023-11-29 15:58:26 25 4
gpt4 key购买 nike

我用 LitElement 创建了一个自定义选择组件:

import { LitElement, html } from 'lit-element';

class CustomSelect extends LitElement {
static get properties() {
return {
options: { type: Array },
selected: { type: String },
onChange: { type: Function }
};
}
constructor() {
super();
this.options = [];
}
render() {
return html`
<select @change="${this.onChange}">
${this.options.map(option => html`
<option value="${option.value}" ?selected=${this.selected === option.value}>${option.text}</option>
`)}
</select>
`;
}
createRenderRoot() {
return this;
}
}

customElements.define('custom-select', CustomSelect);

我在创建元素时将 optionsselectedonChange 作为属性传入。在第一次渲染时,一切正常。呈现所有选项并且选择的值反射(reflect)在选择中。但是,如果我更改 selected 它似乎不会更新所选选项。如果我使用开发工具检查元素,则 selected 属性设置正确,但如果我开始查询元素的值,它会返回错误的值。

我尝试的一件事是在呈现选择后通过开发工具向元素添加一个 id 属性。如果我随后更改 CustomSelect 上的 selected 属性,id 属性会保留在 DOM 中,这告诉我选择不会重新-渲染,这是导致问题的原因,以及它在第一次渲染时起作用的原因。

我已经尝试在选择元素上设置 valueselectedIndex 属性,但它似乎没有以有意义的方式影响任何东西。

我已经记录了所有地方(从 render() 和选项映射开始)并且所有输入值都是正确的。

最佳答案

我认为,onChange函数上的渲染时间和selected属性定义时序冲突。因此,最好在 onChange 中分配一个 setTimeout 然后它才能正常工作。在我下面链接的例子中。当我删除 setTimeout 时,我遇到了同样的问题此外,您不需要将 onChange 声明为属性中的函数。

Demo

static get properties()  {
return {
options: { type: Array },
selected: { type: String }
};
}
constructor() {
super();
this.options = [{value:1, text:"ben"},{value:2, text:"sen"},{value:3, text:"oo"},{value:4, text:"biz"},{value:5, text:"siz"},{value:6, text:"onlar"}];
this.selected = 3
}
render() {
return html`

<select id="sel" @change="${this.onChange}">
${this.options.map(option => html`
<option value="${option.value}" ?selected=${this.selected === option.value}>${option.text}</option>
`)}
</select>
<button @click="${this.changeSelected}">Random chage selected option</button>
`;
}

onChange(x){
setTimeout(()=>{
this.selected = this.shadowRoot.querySelector('#sel').value
console.log('Selected -->', this.selected );
},300)
}
changeSelected(){
this.selected = (this.options[Math.floor(Math.random() * 6)].value)
console.log(this.selected)
}

关于javascript - 自定义 litelement 选择未正确重新呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55858077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com