标签: stenciljs

stenciljs 条件渲染返回 tsx

我的 stenciljs 渲染函数目前是用打字稿这样编写的:

render() {
  if( this._isInline ) {
    return (
      <span>
        <slot />
      </span>
    );
  } else {
    return (
      <div>
        <slot />
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

但我更喜欢如果我能写成这样:

render() {
  const tag = this._isInline ? 'span' : 'div';
  return (
    <{tag}>
      <slot />
    </{tag}>
  );
}
Run Code Online (Sandbox Code Playgroud)

但这给了我一堆错误消息。

有没有办法编写 jsx 代码,以便我有条件打开和关闭标记?

javascript render jsx tsx stenciljs

4
推荐指数
1
解决办法
4187
查看次数

使用什么框架来构建 Web 组件:lit-element vs stencil vs SkateJS?

我想开始利用现在所有主要 Web 浏览器都支持的http://webcomponents.me W3C 标准。

我研究了互联网,到目前为止我发现了以下框架:

  1. 模板 - 由离子创建。所有离子组件都使用这个框架/编译器来构建原生支持的 Web 组件。

  2. lit-element - 由 Google 创建,是 Polymer 框架的一部分。

  3. SkateJS - 不知道这背后的原因,但它位于前 3 名流行的 Web 组件框架中。

有人可以给我建议或意见哪个框架最好吗?

javascript web-component stenciljs native-web-component lit-element

4
推荐指数
2
解决办法
5192
查看次数

如何在 React JSX 中使用 Stencil 的 `EventEmitter`?

我使用 Stencil 创建了一个输入 Web 组件:

...
export class Input {
    @Prop({ mutable: true }) value: string;
    @Event() changed: EventEmitter<KeyboardEvent>;

    private handleChange (e) {
        this.value = e.target?.value;
        this.changed.emit(e);
    }

    render() {
        return (
            <div class="inputContainer">
                <input  
                    type="text"
                    value={this.value}
                    onInput={this.handleChange}
                />
            </div>
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

然后尝试在 React jsx 文件中使用它后,onChanged 不会调用 console.log

...

function App() {
  return (
    <div className="App">
      // does not call console.log
      <ui-input onChanged={(e) => console.log(e)}/>
    </div>
  );
}


Run Code Online (Sandbox Code Playgroud)

正如我到目前为止所读到的,这是因为 React 使用合成事件而不是 Dom 事件。

有没有办法在 JSX 元素中使用 Dom 事件?

web-component eventemitter reactjs stenciljs

4
推荐指数
1
解决办法
2640
查看次数

从另一个 Stencil JS 库导入 Stencil JS 库

我有两个 Stencil JS Web 组件库:library-a 和library-b。这些不是应用程序,只是单独的 npm 组件包。

我想使用库 b 中库 a 中的一些组件。如何将组件从 A 导入到 B 中?

StencilJS 文档提供了一些导入说明,但不涵盖这个特定的用例。

javascript web-component npm stenciljs

4
推荐指数
1
解决办法
2135
查看次数

在 Stencil with Jest 中,如何使用模板测试组件上的对象属性?

我有一个看起来像这样的模板组件:

\n
    export class MyBadge {\n      @Prop() skin: string = \'primary\';\n      render(){\n        return (\n        <span class={`skin-${this.skin}`} />\n      )\n
Run Code Online (Sandbox Code Playgroud)\n

我想编写一个单元测试来检查渲染的组件是否应用给定的skin属性。\n我有一个测试将渲染的组件与我预期的 html 进行比较,使用expect(page.root).toEqualHtml(\xc2\xb4< span class=primary >\xc2\xb4).此测试有效!但是,当我尝试使用模板修改道具时,它无法运行测试。

\n
    import { newSpecPage } from \'@stencil/core/testing\';\n    import { MyBadge } from \'./my-badge\'\n    it(\'should have "secondary" skin\', async () => {\n     const page = newSpecPage({\n            components: [MyBadge],\n            template: () => (`\n              <my-badge skin=secondary></my-badge>\n              `), \n          });\n          expect(page.root).toEqualHtml(`\n          <span class="skin-secondary">\n          ...\n          `);\n        });\n
Run Code Online (Sandbox Code Playgroud)\n

这给出了错误expect toEqualHtml() value is "null"并且测试失败

\n …

unit-testing jsx jestjs stenciljs

4
推荐指数
1
解决办法
4093
查看次数

Jest 预期和接收相同

当两者看起来完全相同时,Jest 会认为这不完全相同吗?

所以这是我用来进行测试的代码,它基本上只是一个调用事件发射器的函数,在事件发射器中,如果日期无效,我会按原样设置:

  const datepickerComponent: Datepicker = new Datepicker();

  const mockEvent = {
    target: {
      classList: {
        remove: jest.fn(),
        add: jest.fn(),
      },
      value: '01-01-197',
    },
  } as unknown as InputEvent;

  datepickerComponent.onInput(mockEvent);

  const emitMock: jest.Mock = jest.fn();
  datepickerComponent.dsdDatepickerInputChange = { emit: emitMock } as unknown as EventEmitter<dsdDatepickerInputChangeEvent>;

  // when
  datepickerComponent.onInput(mockEvent);

  const dateValue = new Date('197-01-01T00:00:00');

  // then
  expect(emitMock).toHaveBeenCalledWith({ value: '197-01-01', valueAsDate: dateValue });
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

jestjs stenciljs

4
推荐指数
1
解决办法
4737
查看次数

StencilJS:编译scss并复制到dist文件夹

我的目标是在分发包中提供一个 css 文件,如果需要的话,消费者可以使用它。

为此,我想创建一种全局 scss 文件,但我想避免这种样式附加到每个组件+它也不会被组件直接使用。因此,我想my-style.scss在文件夹中的某个位置创建文件/src

my-style.css编译此文件并将其复制到文件夹的最佳方法是什么dist

stenciljs

3
推荐指数
1
解决办法
2874
查看次数

对象数组 Prop 装饰器 StencilJS

我想传递一个对象数组,然后迭代该数组并渲染每个对象。

我的 html 文件如下:

<stencil-component 
   cards = '[{"cardTitle"="placeholder", "copy"="copy1"},{"cardTitle"="placeholder2", "copy"="copy3"}]'>
</stencil-component>
Run Code Online (Sandbox Code Playgroud)

在我的 tsx 文件中,我有以下内容:

@Prop() cards: Array<object> = [];

render(){
    return  (
      {this.cards.map(card) => {

        return (
          <div>
            <h1>{card.cardTitle}</h1>
            <p>{card.copy}</p>
          </div>
        );
      })}    
    )
}
Run Code Online (Sandbox Code Playgroud)

我什至无法显示数组。我尝试使用 JSON.parse 函数来解析数据,但这也不起作用。如果有人可以帮忙,我将非常感激!

typescript stenciljs

3
推荐指数
1
解决办法
7323
查看次数

StencilJS JSX 使用 ref 作为 Prop

我目前正在编写一个带有ref元素的 StencilJS 组件,我需要将其作为 @Prop 传递给另一个元素。就像这样:

<canvas ref={el => this.canvas = el}></canvas>
<color-picker canvas={this.canvas}></color-picker>
Run Code Online (Sandbox Code Playgroud)

当创建颜色选择器时,this.canvas仍然未定义,导致 中出现错误color-picker

我怎样才能在 JSX 中做到这一点?

ref jsx stenciljs

3
推荐指数
1
解决办法
2774
查看次数

StencilJS - 在主体而不是组件中插入元素

我正在 StencilJS 中构建一个具有工具提示的组件。

我想在 document.body 中附加此工具提示的标记,而不是在我的组件中,因为当组件包含在带有 Overflow:hidden 的元素中时,它会遇到问题(工具提示被截断)

有什么办法可以实现这一点吗?

我在 React 中有完全相同的组件,我设法通过使用修复它,ReactDOM.createPortal(tooltip, document.body)但我似乎无法在 Stencil 中找到类似的解决方案(另外,文档非常基础)。

我还尝试手动生成元素,document.createElement但这很痛苦而且太冗长,而且我有几个图标作为我想包含的组件。

另一种解决方案是将 JSX 转换为实际标记,然后我可以通过执行document.body.append(tooltip).

javascript jsx stenciljs

3
推荐指数
1
解决办法
2066
查看次数