相当于Storybook中的Meteor.startup

时间:2019-04-23 14:45:47

标签: reactjs meteor webpack storybook storybook-addon-specifications

我一直试图将Meteor框架Vulcan.js与Storybook集成在一起。困难来自构建系统的差异。目前,我们可以使用Webpack在Storybook中加载一些特定的Meteor软件包。

因此,现在我们需要在Storybook中模仿一些其他的Meteor功能。我们依靠Meteor.startup()回调来初始化特定的React组件,该组件是其他组件的注册表。但是我在Storybook中找不到任何等效的模式。

Meteor.startup()中注册的回调的特征如下:

  • 它已运行after,该应用已构建。因此,不可能只编写一个“启动”文件并将其导入,因为它将运行得太早,因此注册表仍然为空
  • 运行before故事实际上是渲染或加载的。基本上保证Meteor.startup回调是要运行的第一个函数。因此,在装饰器中调用相关功能可能为时已晚。
  • 仅被调用一次。这不是一个很强的要求,因为我们可以通过将回调编写为纯函数来绕过它,但是最好避免多次调用。

我尝试编写插件,但是由于插件具有自己的构建系统,因此无法正常工作。因此,他们无法访问我们的Meteor软件包,但他们需要它们才能正常工作。

我试图写一个装饰器。那是一个好的解决方案,但是我有一个奇怪的行为,因为它在每个组件安装上都运行启动功能(这是在导入之后但在渲染之前运行它们的唯一方法)。目前,这是我最好的选择,但似乎不尽人意。

最后一个解决方案是在相关故事的顶部运行代码。它可以工作,但是容易出错,并且会影响开发人员的体验

因此,这是一个问题:如何在Storybook中定义一个回调,以便在启动期间像Meteor.startup回调那样运行该回调?

2 个答案:

答案 0 :(得分:2)

如果您深入研究它,则客户端Meteor.startup只是document.addEventListener('DOMContentLoaded', func)的包装器

因此,通过监听事件可以很容易地复制

答案 1 :(得分:0)

理想情况下,您正在编写故事的任何React组件都应该是纯渲染组件,并且不应引用流星特定的任何内容,例如Meteor...

通常的方法是编写一个容器组件,该组件执行诸如加载数据(例如,使用withTracker())和调用所需的任何Meteor函数的操作。它应该将实用程序功能作为道具传递给组件。

Storybook仅需要提供以下功能作为道具-您可以使用附加动作:https://www.npmjs.com/package/@storybook/addon-actions

  

Storybook附加操作

     

Storybook Addon Actions可用于显示事件处理程序在Storybook中接收到的数据。

乍一看,这似乎很困难,但实际上,在任何环境中保持组件纯净都是一种好习惯。他们的工作是提供渲染,并将事件传递给逻辑和api(位于其他位置)。这也意味着这些组件可以重复使用(即使在非流星项目中),并且易于测试,因为您不需要模拟流星环境)