【问题标题】:Custom Elements rendering multiple times多次渲染自定义元素
【发布时间】:2020-02-20 08:24:23
【问题描述】:

我目前在自定义元素方面遇到问题,我正在构建一些自定义内容以在电子商务网站上运行,而我的自定义元素之一正在多次重新呈现自身。

window.initDealBadge = function(customer) {
class DealBadgeCustomElement extends HTMLElement {

    constructor(){
      super();
    }

    connectedCallback(){
      console.log("ELEMENT ADDED TO PAGE")
      const mountPoint = document.createElement('span');

      this.appendChild(mountPoint);

      const attrs = [].reduce.call(this.attributes, (memo, attr) => {
            memo[attr.name] = attr.value;
            return memo;
        }, {});
        const data = Object.assign({}, attrs);

      ReactDOM.render(<DealBadge customer={customer} id={data.id}/>, mountPoint);
    }
  }
customElements.define('deal-badge', DealBadgeCustomElement);

}

这是我第一次使用自定义元素,以前有人遇到过这个问题吗?

谢谢

【问题讨论】:

    标签: reactjs web-component custom-element


    【解决方案1】:

    我设法让它工作,ConnectedCallback 被多次调用。我添加了一个计数以确保它只运行一次。

    window.initDealBadge = function(customer) {
    class DealBadgeCustomElement extends HTMLElement {
    
        constructor(){
          super();
          this.count = 0
        }
    
        connectedCallback(){
          if(this.count === 0){
            this.count += 1
            console.log("ELEMENT ADDED TO PAGE")
            const mountPoint = document.createElement('span');
    
            this.appendChild(mountPoint);
    
            const attrs = [].reduce.call(this.attributes, (memo, attr) => {
                  memo[attr.name] = attr.value;
                  return memo;
              }, {});
              const data = Object.assign({}, attrs);
    
            ReactDOM.render(<DealBadge customer={customer} id={data.id}/>, mountPoint);
          }
        }
      }
    customElements.define('deal-badge', DealBadgeCustomElement);};
    

    【讨论】:

    • 我很好奇为什么 connectedCallback 在页面加载时会运行多次。这也发生在我身上,令人沮丧。但是,我的问题是 connectedCallback 在解析 id 属性之前正在运行,这会导致问题。你知道为什么它被多次调用吗?
    猜你喜欢
    • 2021-10-01
    • 2013-07-03
    • 2022-07-05
    • 2015-06-30
    • 2021-05-22
    • 2023-03-13
    • 2021-10-21
    • 2022-11-01
    • 2022-11-08
    相关资源
    最近更新 更多