React-搭建StoryBook

StoryBook

  • Storybook 是 UI 组件的开发环境,它允许开发者浏览组件库,查看每个组件的不同状态,以及交互地开发和测试组件。
  • 可在 app 之外运行,这允许开发者独立地开发 UI 组件,这可以提高组件的重用性、可测试性和开发速度。所以可以快速构建,而不必担心应用程序特定的依赖关系。

由于大型项目的开发人员众多,封装的组件没有规范的文档,StoryBook恰恰就能解决这个问题,并且StoryBook的API易使用,有利于开发人员极快上手使用。

搭建StoryBook

以React框架的项目搭建

初始化StoryBook

在已有的项目根目录下运行 npx storybook@latest init (StoryBook 7.5版本,node至少要v18.17.0, npm版本至少要10.2.4

查看页面(默认运行在localhost:6006)

以二次封装Antd组件为例子编写Story

  • 日常开发中Table组件经常需要对数据进行操作,而一个PopConfirm按钮是非常常见的

但Antd的PopConfirm的按钮顺序不正确,所以需要我们进行二次封装

  • 该PopConfirm按钮明显是一个公共组件,公共组件需要编写StoryBook,以便于团队中开发人员的维护及使用。
  • 在项目的根目录的.storybook下preview.ts中引入Antd的样式,否则Antd组件样式会丢失
  • 编写PopConfirm按钮的Story文件

    在src/stories下新建OperateButton

    index.tsx

    tsx 复制代码
    import React from "react";
    import { Button, Popconfirm } from "antd";
    import type { PopconfirmProps } from "antd";
    import "./styles.less";
    
    interface TOperateButtonProps extends Omit<PopconfirmProps, "trigger"> {
        buttonText?: string;
    }
    
    const OperateButton: React.FC<TOperateButtonProps> = (props) => {
        const { buttonText, title, ...restProps } = props;
    
        return (
            <Popconfirm title={title} trigger="click" okText="确定" cancelText="取消" {...restProps}>
                <Button type="link">{buttonText}</Button>
            </Popconfirm>
        );
    };
    
    export default OperateButton;

    OperateButton.stories.ts

    ts 复制代码
    import type { Meta, StoryObj } from "@storybook/react";
    import OperateButton from ".";
    
    type Story = StoryObj<typeof meta>;
    
    const meta = {
        title: "OperateButton", // storyBook的菜单Title
        component: OperateButton,
        parameters: {
        layout: "centered", // 组件显示的位置
        },
        tags: ["autodocs"],
    } satisfies Meta<typeof OperateButton>;
    
    export const Normal: Story = {
        // 传入组件的props
        args: {
            buttonText: "删除",
            title: "确定要删除该条数据吗?",
        },
    };
    
    export default meta;

    styles.less

    less 复制代码
    .ant-popover-buttons {
        display: flex;
        justify-content: center;
    
        button:first-child {
            order: 1;
            margin-left: 12px;
        }
    
        button:last-child {
           margin-left: 0;
        }
    }
  • 查看效果

可以在下面的Controls更改传入组件的props

  • 一个组件可以有多个Story

    新建一个红色的删除按钮Story

    index.tsx

    tsx 复制代码
    import React from "react";
    import { Button, Popconfirm } from "antd";
    import type { PopconfirmProps } from "antd";
    import "./styles.less";
    
    interface TOperateButtonProps extends Omit<PopconfirmProps, "trigger"> {
        buttonText?: string;
        danger?: boolean; // 新增代码
    }
    
    const OperateButton: React.FC<TOperateButtonProps> = (props) => {
        const { buttonText, title, danger, ...restProps } = props; // 新增代码
    
        return (
              <Popconfirm title={title} trigger="click" okText="确定" cancelText="取消" {...restProps}>
                  {/* 新增代码 */}
                  <Button type="link" danger={danger}>
                      {buttonText}
                  </Button>
              </Popconfirm>
        );
    };
    
    export default OperateButton;

    OperateButton.stories.ts

    ts 复制代码
    import type { Meta, StoryObj } from "@storybook/react";
    import OperateButton from ".";
    
    type Story = StoryObj<typeof meta>;
    
    const meta = {
      title: "OperateButton", // storyBook的菜单Title
      component: OperateButton,
      parameters: {
          layout: "centered", // 组件显示的位置
      },
      tags: ["autodocs"],
    } satisfies Meta<typeof OperateButton>;
    
    export const Normal: Story = {
      // 传入组件的props
      args: {
          buttonText: "删除",
          title: "确定要删除该条数据吗?",
      },
    };
    
    // 新增代码
    export const Danger: Story = {
      args: {
          danger: true,
          buttonText: "删除",
          title: "确定要删除该条数据吗?",
      },
    };
    
    export default meta;
  • 查看效果

总结

Storybook使团队能够有效地协作,并确保所有UI组件的一致性和质量,有利于团队中开发人员维护及使用公共组件库。

相关推荐
Lee川16 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
勤劳打代码16 小时前
Flutter 架构日记 — 状态管理
flutter·架构·前端框架
codingWhat16 小时前
手撸一个「能打」的 React Table 组件
前端·javascript·react.js
子兮曰21 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
程序员ys1 天前
前端权限控制设计
前端·vue.js·react.js
卓卓不是桌桌1 天前
如何优雅地处理 iframe 跨域通信?这是我的开源方案
javascript·架构
Qlly1 天前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
不会敲代码11 天前
从零开始用 TypeScript + React 打造类型安全的 Todo 应用
前端·react.js·typescript
小时前端2 天前
React性能优化的完整方法论,附赠大厂面试通关技巧
前端·react.js
阿慧勇闯大前端2 天前
在AI时代,再去了解react19新特性还有用吗? 最近总有朋友问我:“现在AI写代码这么厉害了,我写个需求丢给ChatGPT,几秒钟就生成一堆组件,还学新特
前端·react.js