如何将一个属性映射到 litElement 中的两个属性?

How to map one attribute to two properties in litElement?

我在一个 litElement 项目中工作,在一个组件中,我有一个属性需要映射到一个 属性,并用一个函数计算到另一个,像这样:


const calculateTwo(val) {
 return `${val} ${val}`
}

class MyElement extends LitElement {
  
  static get properties() {
    return {
      one: {
        type: String,
        attribute: 'foo',
      },
      two: {
        type: String,
        attribute: 'foo',
        reflect: false,
        converter: value => calculateTwo(value),
      },
    };
  }
}
<my-component foo="bar"></my-component>

如果我这样做,one 不会设置为 'bar',但 two 是正确的

如果我删除 属性 twoone 可以正常工作。

实现此目标的更好方法是什么?

我可以使用 update 函数,但我想知道是否有更好的方法。

我不想对其中一个属性使用 getter 函数,因为转换器的功能非常繁重,我不希望每次我想访问时都调用它道具

如果您不想申请 getter,那么 updated 是您最好的选择

const calculateTwo(val) {
 return `${val} ${val}`
}

class MyElement extends LitElement {
  static get properties() {
    return {
      one: {
        type: String,
        attribute: 'foo',
      },
      two: {
        attribute: false
      }
    };
  }

  updated(changed) {
    if (changed.has('one')
      this.oneChanged()
  }

  oneChanged() {
    this.two = calculateTwo(this.one);
  }
}

我认为使用 属性 访问器可以避免调用渲染两次。

const calculateTwo(val) {
 return `${val} ${val}`
}

class MyElement extends LitElement {
  static get properties() {
    return {
      one: {
        type: String,
        attribute: 'foo',
      },
      two: {
        attribute: false
      }
    };
  }

  set one(value) {
    const oldValue = this._one;

    this.two = value;
    this._one = value;

    this.requestUpdate('one', oldValue);
  }

  get one() {
    return this._one;
  }

  set two(value) {
    const oldValue = this._two;

    this._two = calculateTwo(value);

    this.requestUpdate('two', oldValue);
  }

  get two() {
    return this._two;
  }
}