gpt4 book ai didi

web-component - 如何在 lit-element 中声明一个必需的属性

转载 作者:行者123 更新时间:2023-12-05 09:04:53 25 4
gpt4 key购买 nike

在 React 中,我们可以使用 PropTypes 将特定的 prop 标记为必需的。

requiredFunc: PropTypes.func.isRequired,

Vue 还支持必需的 Prop :

    propC: {
type: String,
required: true
},

如何在 lit-element 中做到这一点?一个框架声称它非常好,但不支持诸如必需属性之类的简单事物,这真是太有趣了。

最佳答案

React 和 Vue 组件使用各自的运行时在受控环境中执行。 Web 组件不能具有相同级别的净化环境。渲染周期是为 React/Vue/Angular/等完美定义的。 Web 组件可以通过多种方式初始化:

    // Using custom registered tag
const myComp = document.createElement('my-custom');

// Using constructor
const myComp = new MyCustom();

// Initialization using plain html
<div>
<my-comp>
</div>

所以,生命周期不是那么容易不可控的。假设您有一个带有 Prop 的 Web 组件 - myRequiredProp。并且,它被初始化为:

    // Pass prop at the time of initialization
const myComp1 = new MyCustom({ myRequiredProp: 10 });

// Pass prop at a later time.
const myComp2 = new MyCustom();

// ... after some time
myComp2.myRequiredProp = 10;

// And how to pass props if component is being used directly in HTML.
// Is this right way? What if `my-required-prop` should be object and not a primitive like number or string?
<div>
<my-comp my-required-prop="10" />
</div>

此外,每个使用您的组件的框架都可以有自己的初始化 props 的方式。应该在什么时候触发 prop 的验证。如果组件刚刚初始化但从未呈现怎么办。在 Web 组件的情况下,要解决每个场景都不容易做出这些决定。因此,最好将这种担忧留在核心之外。 lit-element 有意避免此类开放式决策。

话虽如此,您可以为 Prop 构建自己的验证系统。您可以控制何时进行 Prop 验证。例如,您可以在 render 时验证 prop。

    export class MyElement extends LitElement {

@property({})
count = 0;

@property()
name = 'World';

validateAllProps() {
// Your validation logic.
// Use joi or zod to validation `this`.
return true;
}

render() {

// Trigger validation here
if (!this.validateAllProps) {
console.warn('Invalid props');
}


return html`
<h1>Hello, ${this.name}!</h1>
<button @click=${this._onClick}>
Click Count: ${this.count}
</button>
`;
}
}

或者您也可以使用自定义 setter 或使用转换器函数来验证 prop。

    export class MyElement extends LitElement {

#name = 'World';

set name(name) {
if (typeof name !== 'string') {
console.warn('Invalid prop name for MyElement');
}

this.#name = name;
}


render() {
return html`
<h1>Hello, ${this.name}!</h1>
`;
}
}

您应该能够使用扩展 LitElement 的公共(public)基类或使用自定义装饰器来管理属性验证来概括验证行为

我同意 LitElement 与 React 和 Vue 相比可能会让人感到尴尬,但总的来说,它有太多需要处理的问题,而 React 根本不需要处理这些问题。它很容易变得复杂。

关于web-component - 如何在 lit-element 中声明一个必需的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68008726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com