返回博客

用于管理数据和状态的 Storybook 插件

独立构建连接的 UI

loading
Varun Vachhar
@winkerVSbecks
最后更新

组件封装了 UI 的外观和功能,以帮助您构建应用程序。组件的类型多种多样,从纯粹的展示型组件到连接到页面的组件应有尽有。每种类型的组件构建起来都可能很棘手。

我们调研了 BBCShopifyAuth0 和 Storybook 社区的团队,学习了独立构建每个 UI 的秘密。

本文将展示有助于您独立构建组件的 **Storybook 用于数据和状态的插件**。

为何要独立构建 UI

在我们开始之前,有必要回顾一下为什么首先要独立构建 UI。难道您不能在应用程序中工作时同时开发 UI 吗?

领先的团队通过独立构建 UI 来管理 UI 复杂性。他们采用“自下而上”的方式构建界面,从原子组件开始,然后逐步将它们组合成页面,这个过程称为 组件驱动开发

例如,BBC 支持无数种语言、设备、浏览器和 UI 状态的排列组合。他们依赖组件驱动开发流程来构建边缘案例并自动测试回归问题

从组件到页面

但并非人人都像 BBC 那样,那么这对您有什么好处呢?

  • **便利性:**使用模拟数据来模拟难以触达的状态(空状态、加载中等)。这节省了时间,并帮助您验证 UI 在不同场景下是否正常工作。
  • **测试:**在组件级别进行测试更容易找出错误。无需再深入研究堆栈跟踪信息。
  • **复用:**通过复用现有组件并将它们组合成新的配置,更快地组装 UI。
  • **速度:**将页面分解为独立的组件并分散工作负载,从而并行开发。

Storybook 及其插件生态系统使得独立构建整个 UI 变得容易。让我们看看如何实现。

原子组件

每个 UI 的核心是一组原子组件。这些组件没有状态,也不指定如何加载数据。它们完全通过 props 接收数据和回调。例如:Avatar、Button、Input 和 Tooltip。

这里的主要挑战是确保组件看起来符合预期。在大多数情况下,您可以通过 props 重现它们的状态并将它们保存为 stories。

然而,一些组件也依赖 CSS 伪类状态,例如 hover 和 focus,以正确显示。手动通过开发者工具切换这些状态非常繁琐。**Pseudo States 插件** 允许您在各种状态之间快速切换,或将它们并排渲染。

**Actions 插件** 简化了事件处理程序的测试。使用它来创建出现在 Storybook UI 的 actions 面板中的回调函数,并验证处理程序是否接收到了正确的参数。

另外,Next.js 是一个领先的 React 元框架。它用于构建支持混合静态和服务器渲染的应用程序。因此,它要求您使用自定义的 Link 组件在应用程序内导航。**Next router 插件** 模拟导航事件并将其记录到 actions 面板。

组合组件

您可以通过组合组件来独立开发更复杂的功能。这些组合组件通常也跟踪应用程序状态并将行为向下传递。例如:表单、头部、列表和卡片。

状态有许多不同的形式。一些应用程序将部分状态作为 URL 中的查询参数进行跟踪,然后由组件解析这些参数。**Query params 插件** 允许您按 story 模拟查询参数,以便您可以轻松重现组件的不同状态。

Formik 是一个流行的表单库。它管理表单值、验证和提交。**Formik 插件** 提供 Formik 上下文并在面板中可视化表单状态。

React 应用程序使用 context 来在组件树中传递数据,而无需手动向下传递 props。它通常用于管理“全局”状态。无论是使用 hooks 和原生 context 还是通过 ReduxMobX 等库。在所有情况下,传递数据的机制仍然是 React context。**React Context 插件** 允许您在 Storybook 中提供和操作 context。使用它来模拟更复杂场景下的数据和行为。

import { withReactContext } from 'storybook-react-context';

export const myStory = (_, { context: [state, dispatch] }) => (
  <button onClick={() => dispatch({ text: 'Changed' })}>{state.text}</button>
);

myStory.decorators = [withReactContext({
  initialState: {
    title: 'Initial #1'
  }
})];

myStory.parameters.initialState = {
  initialState: {
    text: 'Initial #2',
  },
};

页面

当您继续将组件组合到页面级别时,您还需要将它们连接到数据。这是您的 UI 与后端 API 和服务交互的地方。

过去,让您的应用程序进入特定状态需要大量精力。您必须初始化数据库,在本地启动后端和前端,然后导航到相关页面。

有了 Storybook,您可以独立开发整个页面。以下插件帮助您模拟数据,快速进入任何特定的排列组合状态。

模拟 API 服务

Mock Service Worker (MSW) 是一个 API 模拟库。它使用 Service Worker 在网络层面拦截请求并返回模拟数据。**MSW 插件** 将此功能带到 Storybook。使用它可以简化在 stories 中模拟 API 请求。它支持 RESTful 和 GraphQL 后端。

Apollo GraphQL 是一个广泛使用的 GraphQL 库。**Apollo Client 插件** 在页面级别模拟 GraphQL 数据。这使得在页面级别运行视觉或集成测试更加容易。

**URQL** 和 **GraphQL Kit** 为其他 GraphQL 实现提供了类似的功能。

Axios 是一个无处不在的 HTTP 客户端。**该插件** 可视化组件与后端或模拟 API 之间交换的数据。

结论

将界面分解为组件使其更容易构建,并解锁了更多自动化形式。然而,隔离它们可能具有挑战性。您需要考虑状态、交互、模拟数据,甚至模拟 API 响应。Storybook 插件减少了隔离连接的 UI 所需的时间和精力。它们使您能够独立构建和测试各种类型的组件。

查看插件目录了解更多关于数据和状态的插件。通过我们的教程文档学习如何构建一个插件。并在下方加入 Twitter 上的讨论。

加入 Storybook 邮件列表

获取最新新闻、更新和版本发布信息

7,180开发者(数量持续增长中)

我们正在招聘!

加入 Storybook 和 Chromatic 背后的团队。构建被数十万开发者用于生产环境的工具。远程优先。

查看职位

热门文章

我们如何为 Storybook 构建资料卡生成器

结合 React 和 Netlify Functions 构建社交图片生成器
loading
Varun Vachhar

适用于 Vue 3 的 Storybook

支持下一代渐进式 JS 框架
loading
Michael Shilman

插件生态系统 2.0

全新的插件目录、教程和文档
loading
Dominic Nguyen
加入社区
7,180开发者(数量持续增长中)
为什么为什么选择 Storybook组件驱动型 UI
文档指南教程更新日志遥测数据
社区插件参与贡献博客
案例展示探索项目组件词汇表
开源软件
Storybook - Storybook 中文

特别感谢 Netlify CircleCI