Lit-Element 不允许我在 html 中设置 属性 值

Lit-Element doesn't let me set property value in html

我对正在处理的特定元素有疑问。出于某种原因,这个不允许我在 html 标签上指定任何 属性 值。

如果我在构造函数中指定默认值,那么该元素可以使用这些默认值正常工作,但我无法通过声明覆盖默认值 html。

这是元素:

class OstinatoFetchTriggers extends LitElement {
  static get properties() {
    return {
      /**
        * The query selector for the `ostinato-fetch` element to use when
        * making the request.
        */
      xhrSelector: { type: String },

      /**
      * Elements with the trigger selector will have their click event
      * intercepted and will make the request via ostinato-fetch
      */
      triggerSelector: { type: String },
    };
  }


  constructor() {
    super();
    this.xhrSelector = '#xhrContent';
    this.triggerSelector = '[xhr-link]';
  }

  connectedCallback() {
    super.connectedCallback();

    // The output for console log below is null or whatever the default was in the contructor.
    console.log(this.triggerSelector);

    var triggerList = document.querySelectorAll(this.triggerSelector);
    triggerList.forEach((trigger) => {
      trigger.addEventListener('click', this._handleXhrClick.bind(this));
    });
  }

  disconnectedCallback() {
    super.disconnectedCallback();
    var triggerList = document.querySelectorAll(this.triggerSelector);
    triggerList.forEach((trigger) => {
      trigger.removeEventListener('click', this._handleXhrClick.bind(this));
    });
  }

  _handleXhrClick(ev) {
    ev.preventDefault();
    this.triggerRequest(ev.currentTarget.href);
  }

  triggerRequest(href) {
    document.querySelector(this.xhrSelector).fetch(href);
  }
}

customElements.define('ostinato-fetch-triggers', OstinatoFetchTriggers);

我尝试像这样使用上面的元素:<ostinato-fetch-triggers xhr-selector="#somethingElse"></ostinato-fetch-triggers>.

我期望的是元素中的xhrTriggers属性应该是#somethingElse,但事实并非如此。它基本上只使用构造函数的默认值。

首先:由于 lit-element 没有像 Polymer 2 那样通过将驼峰式大小写转换为破折号式来将 属性 名称映射到属性名称的概念。因此,如果您声明 xhrSelector, 你必须使用:

<ostinato-fetch-triggers xhrSelector="#somethingElse"></ostinato-fetch-triggers>

其次:connectedCallback 是原生的 lifecycle callback 而不是来自 lit-element,这意味着当它调用 lit-element 时无法保证已经设置了属性。如果您想在每次更改 属性 时做出反应,您可以使用 firstUpdated(changedProperties)update(changedProperties)

详细了解 lit-element lifecycle


第三:在disconnectedCallback中,你似乎想删除监听器,但这不会起作用,因为每次你执行bind函数时,它都会return新函数,这意味着您尝试删除以前从未添加的功能。

你应该让监听器保持在某个变量中

let listener = this._handleXhrClick.bind(this)
trigger.addEventListener('click', listener)
this.listeners.push({ trigger, listener })

然后在 disconnectedCallback

this.listeners.forEach(({ trigger, listener }) => {
  listener.removeEventListener('click', listener)
})