ELM自定义元素

Mur*_*ock 4 elm custom-element

我有以下ELM视图元素:

Html.node "test-elem" 
 [ Attributes.attribute "data-count" (model.count |> String.fromInt) ]
 []
Run Code Online (Sandbox Code Playgroud)

test-elem是一个自定义html元素:

 constructor() {
        super();
        this.me = this;
    }
    connectedCallback() {
        console.info(this.dataset.count);
        this.div = document.createElement("div");
        this.appendChild(this.div);
        this.div.innerText = "" + this.dataset.count;
    }

   attributeChangedCallback() {
        console.info(this.dataset.count);

        this.div.innerText = "" + this.dataset.count;
    }
Run Code Online (Sandbox Code Playgroud)

如果model.count更改,则不会重新生成自定义元素。我该如何强制?

https://ellie-app.com/6SRrZjCzwfra1

编辑来自@Robin的建议,但没有运气。

Rob*_*ond 6

我没有看到您的Elm代码有任何问题,我认为这与JavaScript中的自定义元素定义有关。

我不熟悉自定义元素API,但查看了您的代码(如下所示):

customElements.define('test-elem', class TestElem extends HTMLElement {

        constructor() {
            super();
            this.me = this;
        }
        connectedCallback() {
            console.info(this.dataset.count);
            var div = document.createElement("div");
            this.appendChild(div);
            div.innerText = "" + this.dataset.count;
        }
    });
Run Code Online (Sandbox Code Playgroud)

以及自定义元素MDN文档,很明显,您应该将connectedCallback方法更改为attributeChangedCallback。原因是Elm使用虚拟DOM并在模型更改时使最少的实际DOM更新成为可能。特别是,当计数更改时,它不会从DOM中删除自定义元素并添加新元素,它只会更改适当的属性。因此,似乎connecedCallback不会呼叫您,但attributeChangedCallback应该呼叫您。

另外,正如正确观察到@Murdock一样(通过阅读MDN文章,特别是“使用生命周期回调”这一节比我更好),data-count必须使用observedAttributesgetter 将属性显式设置为要观察,如下所示:

static get observedAttributes() {
    return ['data-count'];
}     
Run Code Online (Sandbox Code Playgroud)

  • 添加observedAttributes 解决了我的问题。静态获取observedAttributes() { return ['数据计数']; } (2认同)