javascript - Web 组件 - attributeChangedCallback 未触发

标签 javascript web-component

我刚开始使用 Web 组件,我似乎无法弄清楚为什么我的 attributeChangedCallback 没有触发;

我一直在将它与我创建的组件进行比较,在组件中一切正常。

我检查过的东西:

  1. 正在改变的 attr 的拼写(“isOpen”)
  2. attributeChangedCallback 的拼写(从字面上从它正在工作的另一个组件复制它只是为了确定),
  3. 确保它的 observedAttributes(复数)和正确的属性设置在那里,
  4. 检查了 setter 和 getter 工作正常,在 toggleStatus 函数中我可以记录 isOpen 属性,并看到它按预期变化。

但是如果我尝试在 attributeChangedCallback 中做任何事情(示例只是记录名称)它不会触发。

我确定我错过了一些非常简单的东西??

class HamburgerMenu extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: "open" });

    this.shadowRoot.innerHTML = `
    <svg xmlns="http://www.w3.org/2000/svg" width="164" height="102" fill="none">
      <g stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="20">
        <path id="top" d="M10 92L154 92"/>
        <path id="middle" d="M10 50.8L154 50.8"/>
        <path id="bottom" d="M10 10L154 10"/>
      </g>
    </svg>
    `;
    this.svg = this.shadowRoot.querySelector("svg");

    this.svg.addEventListener("click", this.toggleStatus.bind(this));
  }

  static get observedAttributes() {
    return ["isOpen"];
  }

  attributeChangedCallback(name, oldValue, newValue) {
    console.log(name, oldValue, newValue);
  }

  get isOpen() {
    return this.getAttribute("isOpen");
  }

  set isOpen(val) {
    if (val) {
      this.setAttribute("isOpen", val);
    } else {
      this.removeAttribute("isOpen");
    }
  }

  toggleStatus() {
    this.setAttribute("isOpen", String(!eval(this.getAttribute("isOpen"))));
  }
}

if (!window.customElements.get("hamburger-menu")) {
  window.customElements.define("hamburger-menu", HamburgerMenu);
}


最佳答案

关于javascript - Web 组件 - attributeChangedCallback 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60566257/

相关文章:

javascript - 我可以取消 Firestore 写入吗? (使用离线持久化)

javascript - 使用 React hooks 反转数组

javascript - HTML Web 组件不使用 Shadow DOM 样式

html - 自动完成/恢复在导航时动态创建的输入表单字段

javascript - polymer 过滤器表达式的上下文

javascript - Web 组件模板错误

javascript - 将 swfupload.js 动态注入(inject) GWT 项目。 JS 代码在 <span> 存在于 DOM 之前被无意调用

JavaScript/jQuery 节点

javascript - Vue.js 2.0 多步向导

javascript - 为什么它不循环遍历循环(JavaScript、Class、ShadowDOM、HTML Template 标签)