storybook让组件自动形成好看的文档~

简介: storybook让组件自动形成好看的文档~

storybook让组件自动形成好看的文档~


storybook 是什么

storybook 是一个 JS 库,可以在已有项目,在无需修改业务逻辑的情況下,给组件自动形成文档,可很好的展示属性和功能。

示例

怎么安装

在已有的项目里,一行命令安装

npx storybook init

此时项目里增加了一些文件:

  • .storybook文件夹,里面是配置
  • src/stories,展示组件,我们的重点
  • package.json会多两个命令,
  • "storybook": "start-storybook -p 6006 -s public",
  • "build-storybook": "build-storybook -s public"

先运行起来,看看

npm run story

开始写 story

第一步,像平时一样,写组件。

比如这边,来个Button.jsx

import PropTypes from 'prop-types';
const Button = ({ label, backgroundColor = 'red', onClick }) => {
  return (
    <button style={{ backgroundColor, color: '#fff' }} onClick={onClick}>
      {label}
    </button>
  );
};
Button.propTypes = {
  label: PropTypes.string,
  backgroundColor: PropTypes.string,
  onClick: PropTypes.func,
};
export default Button;

第二步,新建Button.stores.jsx

import Button from './Button';
export default {
  title: 'Button', // 标题
  component: Button, // 哪个组件
};
// 组件展示的例子
export const Red = () => <Button label="red" backgroundColor="red" />;
export const Blue = () => <Button label="blue" backgroundColor="blue" />;

title有路径的话,自动在左侧菜单形成文件夹

此时,重新访问网址

网络异常,图片无法展示
|
网络异常,图片无法展示
|
为增强可读性,我们应该为组件编写 propTypes

增加 - Controls 动态修改属性显示

展示的两个例子,并不能修改,其实可以升级,在页面随时编辑,随时显示。 其实很简单,将上面的代码微改造下

import Button from './Button';
export default {
  title: 'Button', // 标题
  component: Button, // 哪个组件
};
// 先写模版
const Template = (args) => <Button {...args} />;
// 写例子,例子的模版都是一样的,只是属性不一样
// Template.bind({}) is a standard JavaScript technique for making a copy of a function. We copy the Template so each exported story can set its own properties on it.
export const Red = Template.bind({});
Red.args = {
  label: 'red',
  backgroundColor: 'red',
};
export const Blue = Template.bind({});
Blue.args = {
  label: 'blue',
  backgroundColor: 'blue',
};

网络异常,图片无法展示
|

增加 - Actions 事件用法

上面都是属性,现在增加事件onClick

const Button = ({ label, backgroundColor = 'red', onClick }) => {
  return (
    <button style={{ backgroundColor, color: '#fff' }} onClick={onClick}>
      {label}
    </button>
  );
};
Button.propTypes = {
  label: PropTypes.string,
  backgroundColor: PropTypes.string,
  onClick: PropTypes.func,
};
export default Button;

看下配置文件,发现当属性以on开头的话,会自动识别为action如果不以on开头的话,需要额外说明。

const Button = ({ label, backgroundColor = 'red', handleClick }) => {
  return (
    <button style={{ backgroundColor, color: '#fff' }} onClick={handleClick}>
      {label}
    </button>
  );
};
Button.propTypes = {
  label: PropTypes.string,
  backgroundColor: PropTypes.string,
  handleClick: PropTypes.func,
};
export default Button;

想要示例里,按钮能绑定事件的话

export default {
  title: 'Button', // 标题
  component: Button, // 哪个组件
  argTypes: { handleClick: { action: 'handleClick' } },
};

argTypes 的具体文档

增加 - children 的处理

这边简单增加一个布局组件,体验下children的处理。

import PropTypes from 'prop-types';
const Stack = ({ children, direction = 'row', spacing = 2 }) => (
  <div
    style={{ display: 'flex', gap: spacing + 'px', flexDirection: direction }}
  >
      {children} 
  </div>
);
Stack.propTypes = {
  spacing: PropTypes.number,
  direction: PropTypes.oneOf(['row', 'column']),
};
export default Stack;

感觉还是很普通的。 来个文档:

import Stack from './Stack';
export default {
  title: 'Stack', // 标题
  component: Stack, // 哪个组件
  argTypes: {
    countOfChild: { type: 'number', defaultValue: 3 },
  },
};
// 先写模版
const style = {
  display: 'flex',
  width: '50px',
  height: '50px',
  alignItems: 'center',
  justifyContent: 'center',
  backgroundColor: '#f69',
  color: '#fff',
};
const Template = ({ countOfChild, ...args }) => (
  <Stack {...args}>
    {new Array(countOfChild).fill('').map((_, index) => (
      <div style={style} key={index}>
        {index + 1}
      </div>
    ))}
  </Stack>
);
export const Horizontal = Template.bind({});
Horizontal.args = {
  direction: 'row',
  spacing: 10,
};
export const Vertical = Template.bind({});
Vertical.args = {
  direction: 'column',
  spacing: 10,
};

argTypes 的属性,只是添加到示例里面,来方便示例的展示,跟真实的组件属性没有关系。

网络异常,图片无法展示
|
网络异常,图片无法展示
|

Vue 类项目添加 storybook

上面步骤基本一致,唯一不同的就是组件的写法,不一致。 Button.vue:

<template>
   <button
    type="button"
    @click="onClick"
    :style="{ backgroundColor, color: '#fff' }"
  >
       {{ label }}  
  </button>
</template>
<script>
export default {
  name: 'Button',
  props: {
    label: {
      type: String,
      required: true,
    },
    backgroundColor: {
      type: String,
      default: '#f69',
    },
  },
  methods: {
    onClick() {
      this.$emit('onClick');
    },
  },
};
</script>

Button.stories.js:

import Button from './Button';
// More on default export: https://storybook.js.org/docs/vue/writing-stories/introduction#default-export
export default {
  title: 'Button',
  component: Button
};
// More on component templates: https://storybook.js.org/docs/vue/writing-stories/introduction#using-args
const Template = (args, { argTypes }) => ({
  props: Object.keys(argTypes),
  components: { Button },
  template: '<Button @onClick="onClick" v-bind="$props" />'
});
export const Red = Template.bind({});
Red.args = {
  label: 'Red',
  backgroundColor: 'red'
};
export const Blue = Template.bind({});
Blue.args = {
  label: 'Blue',
  backgroundColor: 'blue'
};

Stories 部署访问

先运行命令:

# npm run build-storybook
yarn build-storybook

根目录下会多一个文件夹storybook-static,部署即可,本地可以进到目录,然后anywhere 9000即可访问

其他借鉴的例子

  • vue 系列
  • react 系列点左上角的 logo,可以看到源码。 抛砖引玉,实践中,会慢慢熟练 storybook,希望能帮助大家,感谢 ❤️~

引用

目录
相关文章
|
前端开发 JavaScript API
vue3-ts-storybook:理解storybook、实践 / 前端组件库
vue3-ts-storybook:理解storybook、实践 / 前端组件库
789 0
|
11月前
|
开发者 UED
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
3215 2
postcss-px-to-viewport-8-plugin 适配
postcss-px-to-viewport-8-plugin 适配
1694 0
|
6月前
|
人工智能 自然语言处理 前端开发
面向六个月后的 AI Code,也许影响的不只是前端
本文探讨了AI在编程领域的快速发展及其对程序员职业的影响。随着AI技术的不断进步,特别是Codebase Indexing和MCP(Model Context Protocol)等技术的应用,AI已能够更好地理解企业内部知识并生成符合项目规范的代码。文章指出,未来六个月AI代码生成将形成“规范驱动→知识沉淀→协议贯通→智能执行”的闭环架构,大幅提升开发效率。同时, Anthropic CEO Dario Amodei预测,初级程序员可能在18个月内被AI取代,强调了职业规划更新的重要性。文章还对比了Function Call与MCP的技术路线,并提供了相关参考链接。
588 71
面向六个月后的 AI Code,也许影响的不只是前端
|
7月前
|
人工智能 缓存 UED
deepseek-vue3ai流式输出AI对话助手
原创新作vue3.5+deepseek+vite6+vant4仿DeepSeek-R1流式输出ai聊天对话。支持AI流式打字输出效果、浅色/暗黑主题模式、代码高亮、针对移动端+PC端适配处理。
669 65
|
11月前
|
监控
|
11月前
|
前端开发 API UED
React 懒加载图片 Lazy Image
懒加载是一种优化技术,通过延迟加载不在视口内的图片,减少初始页面加载时间,提升用户体验。本文从基础概念入手,逐步探讨 React 中实现图片懒加载的常见问题、易错点及解决方案,并通过代码案例详细解释。
434 3
|
存储 JavaScript 前端开发
❤Nodejs 第十四章(node中间件multer的认识安装使用)
【4月更文挑战第14天】Multer是Node.js用于处理multipart/form-data的中间件,专注于文件上传。。基本用法包括设置存储引擎,如磁盘存储(DiskStorage)或内存存储(MemoryStorage),并指定处理单个或多个文件的方法。例如,`multer.single(&#39;file&#39;)`处理单个文件上传。存储引擎DiskStorage适合永久保存,而MemoryStorage适合临时处理。可以通过`limits`选项限制文件大小,实现不同类型的文件有不同的大小限制。
746 0
|
JSON 前端开发 JavaScript
使用vite搭建一个React项目!真香!
【8月更文挑战第13天】使用vite搭建一个React项目!真香!
2156 3
使用vite搭建一个React项目!真香!