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

相关推荐
岁岁种桃花儿2 分钟前
Flink CDC从入门到上天系列第一篇:Flink CDC简易应用
大数据·架构·flink
秋邱10 分钟前
AIGC 的“隐形引擎”:深度拆解 CANN ops-math 通用数学库的架构与野心
架构·aigc
小a杰.14 分钟前
CANN技术深度解析
架构
光影少年18 分钟前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
向哆哆28 分钟前
CANN生态深度解析:ops-nn仓库的核心架构与技术实现
架构·cann
笔画人生1 小时前
系统级整合:`ops-transformer` 在 CANN 全栈架构中的角色与实践
深度学习·架构·transformer
程序猿追1 小时前
深度解码计算语言接口 (ACL):CANN 架构下的算力之门
架构
程序猿追1 小时前
深度解码AI之魂:CANN Compiler 核心架构与技术演进
人工智能·架构
冻感糕人~2 小时前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
艾莉丝努力练剑2 小时前
跨节点通信优化:使用hixl降低网络延迟的实战
架构·cann