storybook 装饰器的文档有点落后,

vvppvyoh  于 3个月前  发布在  其他
关注(0)|答案(8)|浏览(33)

描述bug

我刚刚查看了https://storybook.js.org/docs/react/writing-stories/decorators#decorator-inheritance,并想知道“按定义顺序”是否有些误导。装饰器的工作方式有点倒序,从内部向外。你最后定义的装饰器将首先包裹故事。因此,如果你有装饰器= [A, B, C],结果是A(B(C(story)))。所以,B和A的结果是C,所以它们有点像“倒着运行”。

xvw2m8pv

xvw2m8pv1#

我对此也感到困惑。

krcsximq

krcsximq2#

这是一个关于问题的最小复现:
https://github.com/srmagura/storybook-decorator-order-repro

export default {
  title: "App",
  decorators: [
    (Story) => (
      <div>
        <p>Decorator 1</p>
        <Story />
      </div>
    ),
    (Story) => (
      <div>
        <p>Decorator 2</p>
        <Story />
      </div>
    ),
  ],
} satisfies Meta;

export const Basic: StoryObj = {
  render: () => <p>My story</p>,
};

它渲染出:

顺便说一下,我认为文档中描述的行为是我所期望的,而实际行为是令人惊讶的。

3npbholx

3npbholx3#

你的复现结果与@IanVS 的原始评论相反。
如果你稍微改写一下:

const A =  (Story) => (
      <div>
        <p>Decorator 1</p>
        <Story />
      </div>
    );
const B = (Story) => (
      <div>
        <p>Decorator 2</p>
        <Story />
      </div>
    );

export default {
  decorators: [A, B],
};

你看到的结果是 B(A(story))

woobm2wo

woobm2wo4#

感谢@shilman,你完全正确。我可能没有仔细阅读OP的评论。你觉得我应该为此创建一个新的GitHub问题吗?

我感到困惑的原因是,文档中说装饰器按照它们被定义的顺序运行。假设我们正在使用React,并且装饰器按照[A, B]的顺序定义,我期望的组件树是:

<A>
  <B>
    <Story />
  </B>
</A>

这是因为在React中,渲染从组件树的顶部开始,然后向下进行。我知道在其他框架中可能会有所不同。谢谢!

qzlgjiam

qzlgjiam5#

是的,这就是它们的呈现方式。我认为文档本可以更好地解释它,仅此而已。

dgsult0t

dgsult0t6#

如果你有兴趣帮助改进文档,我很乐意审阅你的贡献。请告诉我,我们会从那里开始。
期待收到你的回复。

3z6pesqy

3z6pesqy7#

嘿,@jonniebigodes,是的,这周末会提交一个PR。

vxf3dgd4

vxf3dgd48#

太棒了,很高兴听到@srmagura的消息。期待看到它。

相关问题