Stencil Web组件不会对Vite/Vue 3中提供的自定义属性做出React

aurhwmvo  于 2023-02-09  发布在  Vue.js
关注(0)|答案(1)|浏览(89)

短背景

我有一个vue-cli环境,使用Vue 2,使用options-api,我已经开始转换到create-vue,一个基于Vite的环境,使用Vue 3和Typescript。我已经使用Stencil做了一个npm包,在我的项目中导入它的web组件。它在我早期的技术堆栈中工作得很顺利,但现在我似乎不能理解哪里出了问题。
我现在的状态
当我开始在新环境中导入npm包时,我遇到了一系列错误,我不得不将Stencil从v2.7.0升级到v2.16.1,并添加experimentalImportInjection以确保Stencil为Vite正确编译组件。

// stencil.config.ts

...
extras: {
  experimentalImportInjection: true
}

我现在的主要问题是,组件加载,他们看起来正确,但我有问题发送 prop 给他们。
在模板中,我声明了 prop :

@Prop() state: 'none' | 'focus' | 'active' = 'none';

  @Prop() label: string;

  @Prop() meta: string;

  @Prop() disabled = false;

  @Prop() valid?: true | false | null = null;

在我的Vue代码中,我这样声明自定义组件:

<fds-input id="loginEmail" label="Email" meta="meta text" :valid="false" :disabled="isDisabled">
  <input type="email" v-model="email" @blur="checkEmail" data-cy="input-text-email"/>
</fds-input>

我在这里的主要目标是改变valid的值,以触发我的web组件有效或无效的状态,它有不同的css风格。
∮我至今所发现的∮
1.改变:valid的值不会改变任何东西,我已经尝试过将值作为字符串和布尔值发送。
1.更改metalabel可以很好地工作,无论是作为绑定值(: meta="”)还是作为常规属性(meta="”)。
1.当我在浏览器(Chrome)中检查元素时,我只能看到元素上的id和class。
1.当我添加一个setTimeout并在其中添加vanilla javascript来设置属性valid="false"时,它会触发我想要的组件的状态。
1.将Stencil升级到v2的最新版本不会更改任何内容。

x4shl7ld

x4shl7ld1#

现在解决了!

我仍然不确定实际的问题来自哪里,但主要的区别是Vite/Rollup处理从Stencil生成的自定义元素不同于vue-cli/Webpack。
我使用vue-cli/Webpack定制的元素在DOM树中显示如下:

<fds-input id="loginEmail" label="Email" valid="false">
...
</fds-input>

使用Vite/Rollup时,它显示如下:

<fds-input id="loginEmail">
...
</fds-input>

为我想在Stencil中更改的属性添加prop选项reflect: true,可以使属性显示在DOM中,然后CSS可以将其作为样式的目标。
我也修改了prop以期望字符串而不是布尔值。这使得它向后兼容,并且typescript看起来更好。使用可选的布尔值并将默认值设置为null并不是一个最佳的方法。

@Prop({ reflect: true }) valid?: 'true' | 'false';

**注意:**发送到自定义元素的所有数据都能正确接收,但只是CSS不工作,因为它没有任何目标。

相关问题