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组件的一致性和质量,有利于团队中开发人员维护及使用公共组件库。

相关推荐
阿狸猿5 分钟前
论云上自动化运维及其应用
架构
葫芦和十三6 分钟前
设计坐标系|别把 Agent 模式学成名词表
架构·agent·ai编程
不爱吃糖的程序媛6 分钟前
React Native 三方库 react-native-share 的 HarmonyOS 适配实战
react native·react.js·harmonyos
Sunia14 分钟前
《AgentX 专栏》09-MCP协议双向打通:让AgentX既能被Claude调用又能调度全球工具生态
java·架构
喵了几个咪17 分钟前
基于 Flutter 的 Headless CMS 全平台前端架构:技术解析与二次开发导引
前端·flutter·架构
YFF菲菲兔18 分钟前
renderRootConcurrent VS renderRootSync 源码解析
react.js
caimouse24 分钟前
Reactos 第 3 章 内存管理 — 【下篇】换出、Section、池
c语言·开发语言·windows·架构
不爱吃糖的程序媛36 分钟前
React Native 应用适配鸿蒙PC 实战:从白屏到成功运行
react native·react.js·harmonyos
San813_LDD1 小时前
[量化]《从 L1/L2 缓存到 SIMD:矩阵乘法性能优化完全指南》
线性代数·矩阵·架构
国科安芯1 小时前
商业航天级抗辐照全双工RS-485/RS-422收发器ASM491S2Y的技术特性与应用研究
运维·网络·单片机·嵌入式硬件·安全·架构·安全性测试