storybook 交互式画布元素应该设置为iframe的body(交互测试)

k0pti3hp  于 9个月前  发布在  其他
关注(0)|答案(6)|浏览(108)

描述bug

传递给 play 函数的 canvasElement 指向了 iframe ( <div id="root"> )中的 root div元素。然而,如果你使用 createPortal(例如带有模态框),这些元素将被添加到根目录之外。这可能导致一些困惑,因为在门户中出现的元素不能以典型的方式进行查询。

重现

如果需要,可以提供。

系统

Storybook 6.4.4. React

附加上下文

作为解决方法,你可以引用 canvasElement 的父元素。也许只需要记录这一点就足够了。

  1. MyStory.play = async ({canvasElement}) => {
  2. //@ts-ignore
  3. const canvas = within(canvasElement.parentElement)
  4. ....
  5. }
zujrkrfu

zujrkrfu1#

我遇到了同样的问题。
感谢您的解决方法,但正如您在代码中展示的那样,由于parentElement被类型化为HTMLElement | null,TypeScript会引发错误,所以并不理想。但目前它可以正常工作。
我不确定修复的方法是什么,也许可以添加另一个参数属性来封装portal?不确定是否可行。

krcsximq

krcsximq2#

对我来说,它不起作用,即使使用屏幕或之前提到的解决方法。

g2ieeal7

g2ieeal73#

我解决这个问题的方法是获取当前文档的body元素。Typescript对此表示满意。

rpppsulh

rpppsulh4#

感谢@mattlong,你的解决方法有效!

qqrboqgw

qqrboqgw5#

解:$

  1. MyStory.play = async ({canvasElement}) => {
  2. const canvas = within(canvasElement.parentElement!);
  3. ....
  4. }

$

答:他要坐第11列第1行的座位。

093gszye

093gszye6#

实际上,你可以使用canvasElement.parentElement。只需在末尾添加感叹号即可。

  1. MyStory.play = async ({canvasElement}) => {
  2. const canvas = within(canvasElement.parentElement!);
  3. ....
  4. }

我更喜欢这种方法,谢谢你,它对我有效!

相关问题