首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StencilJS JSX使用ref in作为属性

StencilJS JSX使用ref in作为属性
EN

Stack Overflow用户
提问于 2020-01-14 15:35:17
回答 2查看 1.2K关注 0票数 2

我目前正在为一个元素编写一个带有ref的StencilJS组件,我需要将它作为@Prop传递给另一个元素。如下所示:

代码语言:javascript
复制
<canvas ref={el => this.canvas = el}></canvas>
<color-picker canvas={this.canvas}></color-picker>

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

我如何在JSX中做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-16 17:26:04

正如在另一个答案中已经提到的,只有当引用可以指向的元素的实际实例变为可用时,才会在第一次呈现之后创建引用。

为您解决此问题的最简单方法是使用@State()装饰器将canvas成员标记为状态(如果其引用发生更改,将触发重新呈现),然后仅当有效引用可用时才有条件地呈现<color-picker />

代码语言:javascript
复制
import { h, Component, Host, State } from '@stencil/core';

@Component({ tag: 'my-component' })
export class MyComponent {
  @State() canvas?: HTMLCanvasElement;

  render() {
    return (
      <Host>
        <canvas ref={el => this.canvas = el} />
        {this.canvas && <color-picker canvas={this.canvas} />}
      </Host>
    );
  }
}
票数 4
EN

Stack Overflow用户

发布于 2020-01-15 22:20:31

this.canvas是对DOM元素的引用,因此它只能在初始呈现之后有一个值。

如果您将canvas设置为@State()属性,则组件将在定义(或更改)后重新呈现,这会将其传递给color-picker

或者,您可以在首次加载组件后手动重新呈现组件:

代码语言:javascript
复制
componentDidLoad() {
    this.forceUpdate();
}

效果将是相同的,只是如果canvas被重新定义,您的组件将不会重新呈现。

当然,color-picker组件需要使用null画布。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59729258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档