storybook 是一个 JS 库,可以在已有项目,在无需修改业务逻辑的情況下,给组件自动形成文档,可很好的展示属性和功能。
在已有的项目里,一行命令安装
bash
复制代码
npx storybook init
此时项目里增加了一些文件:
.storybook
文件夹,里面是配置src/stories
,展示组件,我们的重点package.json
会多两个命令,
先运行起来,看看
bash
复制代码
npm run story
第一步,像平时一样,写组件。
比如这边,来个Button.jsx
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
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
展示的两个例子,并不能修改,其实可以升级,在页面随时编辑,随时显示。 其实很简单,将上面的代码微改造下
jsx
复制代码
`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',
};`
上面都是属性,现在增加事件onClick
。
jsx
复制代码
`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
开头的话,需要额外说明。
jsx
复制代码
`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;`
想要示例里,按钮能绑定事件的话
jsx
复制代码
`export default {
title: 'Button', // 标题
component: Button, // 哪个组件
argTypes: { handleClick: { action: 'handleClick' } },
};`
这边简单增加一个布局组件,体验下children
的处理。
jsx
复制代码
`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;`
感觉还是很普通的。 来个文档:
jsx
复制代码
`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 的属性,只是添加到示例里面,来方便示例的展示,跟真实的组件属性没有关系。
上面步骤基本一致,唯一不同的就是组件的写法,不一致。 Button.vue:
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:
jsx
复制代码
`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'
};
`
先运行命令:
bash
复制代码
`# npm run build-storybook
yarn build-storybook`
根目录下会多一个文件夹storybook-static
,部署即可,本地可以进到目录,然后anywhere 9000
即可访问
原网址: 访问
创建于: 2024-01-07 01:34:57
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论