如何使用React和Storybook构建UI组件

来自菜鸟教程
跳转至:导航、​搜索

介绍

Storybook 是一个用户界面 (UI) 库,可用于记录组件。

注意: 本文建立在 Storybook 简介 的基础上,其中介绍了如何使用它来组织和构建 JavaScript 组件。


在本文中,您将使用 React 和 Storybook 构建一个交互式 UI 组件。

在本教程结束时,您将把故事书部署为一个独立的应用程序,作为风格指南。

先决条件

要完成本教程,您需要:

  • Node.js 安装在本地,您可以按照【X57X】如何安装Node.js 并创建本地开发环境【X126X】进行。

本教程已使用 Node v14.4.0、npm v6.14.5、react v16.13.1 和 @storybook/react v5.3.19 进行了验证。

第 1 步 — 设置项目

首先,我们需要创建一个新的 React 项目,为此,我们将使用 create-react-app,它是一个很好的搭建 React 应用程序的工具。

npx create-react-app storybook-app

然后导航到新创建的项目目录:

cd storybook-app

下一步是将 storybook 包安装到我们的项目中:

npx -p @storybook/cli sb init

该命令可以从 package.json 文件中自动检测我们正在使用的框架,并安装该框架的 Storybook 版本。

运行这两个命令后,我们可以通过打开 package.json 文件来确认我们已经安装了 @storybook/react 依赖项,以验证软件包是否已安装,然后我们可以运行应用程序以及运行 Storybook。

npm start
npm run storybook

运行这两个命令后,我们将在不同的端口上运行 React 应用程序和 Storybook 应用程序。

手动添加配置

如果我们按照上述步骤进行操作,那么它已经为我们预先配置好了。 如果我们在已经存在的 React 项目中安装了 @storybook/react 包,那么我们需要按照这些步骤来设置 Storybook。

我们首先要在我们的 React 项目的根目录中创建一个文件夹 .storybook,然后在文件夹中创建一个名为 config.js 的文件并添加以下代码行:

.storybook/config.js

import { configure } from '@storybook/react';

function loadStories() {
  require('../src/stories');
}

configure(loadStories, module);

上面的代码块是 Storybook 的配置,它告诉 Storybook 在 src/stories 目录中查找故事。 如果我们还没有设置它,我们将创建该文件夹。 在 src 文件夹中创建一个名为 stories 的文件夹。 这是我们将为其创建故事的所有组件最终所在的位置。

注意: Storybook 5.3.0 及更高版本引入了 main.js 处理 config.js 过去所做的事情。 这些更改记录在 官方迁移文档 中。

如果您使用的是 Storybook 5.3.0 或更高版本,则不需要 config.js 文件,可以忽略此步骤。

官方文档 也提出了不同的方法来放置 stories


至此,Storybook 已准备好使用。

第 2 步 — 将故事添加到 React 应用程序

现在我们已经完成了设置,我们可以使用 Storybook 创建组件。

在本教程中,我们将创建一个 <Button> 组件,对于这个组件,我们将在 stories 文件夹中记录它们的故事。 继续在 component 目录中创建一个 <Button> 组件,代码如下:

src/components/Button.js

import React from 'react';
import './Button.css';

const Button = props => (
  <button onClick={props.onClick} style={props.style}>
    {props.label && <span>{props.label}</span>}
  </button>
);

export default Button;

并为组件添加样式:

src/components/Button.css

button {
  padding: 20px;
  width: 20em;
  margin: 10px;
  color: white;
  font-size: 19px;
  cursor: pointer;
  border: 2px solid #fecd43;
  background: #fecd43;
}

现在,我们可以为创建的 <Button> 组件添加一个故事。 在 stories 目录中创建一个文件并将其命名为 buttonStories.js,然后将以下代码行添加到文件中:

src/故事/buttonStories.js

import React from 'react';
import { storiesOf } from '@storybook/react';

import Button from '../components/Button';

storiesOf('Button', module)
  .add('with primary', () => <Button label="Primary Button" />)
  .add('with outline', () => <Button
    label="Ouline Button"
    style={{ background: 'transparent', border: '3px solid #fecd43' }}
  />)
  .add('with rounder corners', () => <Button
    label="Rounded Button"
    style={{ borderRadius: '15px' }}
  />)
  .add('disabled', () => <Button disabled
    label="Disabled Button"
    style={{ background: 'gray' , border: 'gray', cursor: 'not-allowed' }}
  />);

接下来,创建一个 index.js 文件。 导入 buttonStories.js 文件:

src/故事/index.js

import './buttonStories';

这将作为所有故事的基础文件,我们可以将它们全部导入该文件。

注意: Storybook 5.3.0 及更高版本采用的文件名模式为:*.stories.js。 为了符合这个约定,buttonStories.js 应该重命名为 button.stories.js

您可能还会遇到使用相同 Button 标题的演示故事生成的 1-Button.stories.js 文件。 为避免混淆,您可以将该文件的内容注释掉。


然后对于在 stories 目录下创建的每个新文件,我们将它们导入到该文件中。

第 3 步 - 集成插件

带有 Storybook 的插件有助于实现额外的功能,使它们更有用和更具交互性。 可在 官方网站 上找到 Storybook 可用的所有插件的完整列表。

在本文中,我们将在创建的故事中添加 Action 插件。 Actions Addon 可用于显示 Storybook 中事件处理程序接收到的数据。

手动添加插件

如果默认情况下尚未完成,我们可以设置插件,您需要按照以下步骤操作。

注意: 如果您使用的是 Storybook 5.3.0 或更高版本,就本教程而言,您不需要 addons.js 文件,可以忽略此步骤。


使用以下命令安装插件包:

npm install --save-dev @storybook/addon-actions

然后,将以下内容添加到 .storybook/addons.js 中:

.storybook/addons.js

import '@storybook/addon-actions/register';

现在您的 Storybook 支持插件。

第 4 步 - 使用插件操作

为了使我们的 Button 故事与 Storybook 交互,我们可以将以下代码添加到 buttonStories.js

src/故事/buttonStories.js

import React from 'react';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';

import Button from '../components/Button';

storiesOf('Button', module)
  .add('with primary', () => <Button
    onClick={action('click')}
    label="Primary Button"
  />)
  .add('with outline', () => <Button
    label="Ouline Button"
    onClick={action('click')}
    style={{ background: 'transparent', border: '3px solid #fecd43' }}
  />)
  .add('with rounder corners', () => <Button
    label="Rounded Button"
    onClick={action('click')}
    style={{ borderRadius: '15px' }}
  />)
  .add('disabled', () => <Button disabled
    label="Disabled Button"
    onClick={action('click')}
    style={{ background: 'gray' , border: 'gray', cursor: 'not-allowed' }}
  />);

然后运行故事书:

在下面的选项卡上,您会看到一个 Actions tab,在我们与按钮交互的任何时候都会记录该操作。

第 5 步 — 自定义主题

使用 Storybook,我们可以自定义使用的默认主题,并且 Storybook 与默认的浅色主题捆绑在一起。 现在,让我们探索如何将其自定义为不同的东西。 黑暗主题可能或完全不同的东西。 首先,我们需要通过添加以下代码行来修改我们在 config.js 文件中设置的配置:

.storybook/config.js

import { addParameters } from '@storybook/react';
import { themes } from '@storybook/theming';

addParameters({
  options: {
    theme: themes.dark
  }
});

注意: Storybook 5.3.0 及更高版本引入manager.js官方主题文档中讨论了使用这种新约定进行主题化的步骤。


配置好深色主题后,我们可以观察到整个 Storybook 主题都切换到了深色主题。 在任何时候,这都可以根据我们的喜好切换回浅色或深色主题。

如果我们想要一个完全不同的主题,我们也可以开箱即用地定义一个动态主题。 第一步是为我们的主题创建一个文件,在 .storybook 文件夹中创建一个名为 yourTheme.js 的新文件。 下一步是使用 storybook/theming 中的 create() 函数生成新主题。

这是 pink.js 主题的示例:

.storybook/pink.js

import { create } from '@storybook/theming';

export default create ({
  base: 'light',
  colorPrimary: 'hotpink',
  colorSecondary: 'deepskyblue',
  // UI
  appBg: 'rgb(234, 0, 133)',
  appContentBg: 'white',
  appBorderColor: 'white',
  appBorderRadius: 4,
  // Typography
  fontBase: '"Open Sans", sans-serif',
  fontCode: 'monospace',
  // Text colors
  textColor: 'rgb(255, 250, 250)',
  textInverseColor: 'white',
  // Toolbar default and active colors
  barTextColor: 'white',
  barSelectedColor: 'white',
  barBg: 'rgb(246, 153, 190)',
  // Form colors
  inputBg: 'white',
  inputBorder: 'silver',
  inputTextColor: 'black',
  inputBorderRadius: 4,
  brandTitle: 'Pink Storybook'
});

然后,我们可以继续在 Storybook 配置文件中导入 pink.js

.storybook/config.js

import pink from './pink';

addParameters({
  options: {
    theme: pink
  }
});

与之前的图像相比,这给了我们一个完全不同的主题。

第 6 步 — 部署 Storybook

Storybook 附带的一项功能是,我们可以将 Storybook 部署为静态站点,我们可以将其部署到我们选择的任何托管选项。 要配置它,我们需要将 build-storybook 脚本添加到我们的 package.json

包.json

{
  "scripts": {
    "build-storybook": "build-storybook -c .storybook -o .out"
  }
}

该脚本的作用是将我们的故事书目录构建为静态 Web 应用程序,并将其输出到 .out 目录中。 构建完成后,我们可以运行此脚本并部署 .out 目录的内容。 继续运行命令:

npm run build-storybook

构建完成后,我们现在可以使用我们选择的任何主机来部署目录的内容。

要在本地测试它是否有效,我们可以运行以下命令:

npx http-server .out

注意: 您的 package.json 可能具有类似于 build-storybook -s publicbuild-storybook 脚本。 这不是指定的 .out 目录,而是将静态站点文件输出到 storybook-static 目录。


这会将文件夹的内容作为静态站点提供。

结论

在本文中,我们学习了如何使用 Storybook 和 React 构建交互式组件。 现在我们已经探索了 Storybook 的可能性,并且还提供了关于如何将 Storybook 作为组件库集成到我们的 React 项目中的指南。 使用 Storybook 进行开发是团队中开发人员和设计人员的单一事实来源,并且可以与其他前端框架集成。

这篇文章只概述了它是如何与 React 一起使用的。 如果您正在寻找其他框架的指南,请随时查看 Storybook 的官方文档

您还可以在 GitHub 上找到 这篇文章的代码。