编写 stories

story 用于展示组件某个状态,每个组件可以包含任意多个 story,用来测试组件的各种场景。根据默认配置,只需要在组件的文件夹中,以 **.component.stories.ts 的格式创建即可。

story 语法

基本编写语法很简单,是 export 任意多个 function,每一个就是一个 story。导出主要分两种:

  1. default export:默认导出,提供组件级别的配置信息,例如以下配置会注明组件的归类,并提供 Button 组件的信息,以便渲染这个组件。

    // Button.stories.tsimport Button from './button.component';export default {title: 'Components/Button',component: Button,
    }
  2. named export:命名导出,用以描述 story,如上所说,一个组件可以有若干个 story。

    // Button.stories.ts// 创建一个模板,方便在后续的 story 中复用
    const Template = (args: Button) => ({props: args,
    });export const Primary = Template.bind({});  // 复制 Template
    Primary.args = { background: '#ff0', label: 'Button' };
    Primary.storyName = "主要状态" // 自定义 story 名export const Secondary = Template.bind({});
    Secondary.args = { ...Primary.args, label: '222' }; // 复用上一个 story 的配置export const Tertiary = Template.bind({});
    Tertiary.args = { ...Primary.args, label: '222 } // 再来一个

    通过复制模板 function,可以创建若干个 story,传入不同的参数,就可以分别渲染出组件的不同状态。每个 story 的名字默认是 function 名,也可以自定义。

Args(属性)

上一节看到了怎么去写一个 Story 文件,不过里面反复用到的 args 是什么呢?  
它代表组件的输入属性(Angular 中的 @input(),Vue/React 中的 props),它有 2 个层级,方便灵活配置。

  1. story 层级:

    // Button.stories.tsconst Template = (args: Button) => ({props: args,
    });// 在这个 story 中传入组件属性,只影响当前 story
    export const Primary = Template.bind({});
    Primary.args = {primary: true,label: 'Primary',
    };
  2. 组件层级:

    // Button.stories.tsimport Button from './button.component';// 组件层级(默认导出)中传入组件属性,
    // 这个 Button 组件的所有 stories 的 primary 属性都会是 true
    export default {title: "Button",component: Button,args: {primary: true,},
    }

就像上一节所看到的,不同的 story 的 args 是可以复用的,这里用到了 ES6 的解构语法:

const Primary = ButtonStory.bind({});
Primary.args = {primary: true,label: 'Button',
}// 复用 Primary story 的 args,并覆盖 primary 属性
const Secondary = ButtonStory.bind({});
Secondary.args = {...Primary.args, // 合并上一个 args 对象primary: false,
}

简单的导出几个 function,这个按钮组件的测试用例就写好了

可以看到,这个按钮组件可以独立于项目运行了,并且右边工具栏可以自由更改它的属性,实时查看属性改变后的效果,还可以自动生成组件文档。

有 story 做示例,有实时的控制台,有文档,再也不怕写好的组件别人不知道怎么用了。

额外的配置项

除了写给组件写 story,很多时候也会需要配置插件,或者给组件提供额外的功能,这里看看是如何配置的吧。

Parameters(参数)

Parameters 用以配置 Storybook 和 插件,具有全局、组件、story 三个层级。

Story 拥有大量的插件,以下以简单的 backgrounds 插件举例,它用来控制组件容器的背景色,默认自带黑/白两色。

  1. 全局定义在根目录 .storybook/preview.js 下,会影响所有的 stories。这样配置后,每个 story 界面下都可以选择红/绿两色背景:

    // .storybook/preview.jsexport const parameters = {backgrounds: {values: [{ name: 'red', value: '#f00' },{ name: 'green', value: '#0f0' },],},
    };
  2. 组件层级下定义,会让这个组件的所有 stories 都可以选择指定的背景色

    // Button.story.tsexport default {title: 'Button',component: Button,parameters: {backgrounds: {values: [{ name: 'red', value: '#f00' },{ name: 'green', value: '#0f0' },],},},
    };
  3. story 层级下的定义只会影响当前 story,其他 story 就只能选择默认的黑/白两色了。

    // Button.story.tsexport const Primary = Template.bind({});
    Primary.args = {primary: true,label: 'Button',
    };
    // 红绿背景只在这个 story 下可以选择
    Primary.parameters = {backgrounds: {values: [{ name: 'red', value: '#f00' },{ name: 'green', value: '#0f0' },],},
    };

Parameters 的配置是可以继承,同名的子级会覆盖父级的定义。

Decorators(装饰器)

每个 Decorator 也是 function,用来包裹 story,保持原有的 story 不变的情况下,额外给它添加额外的 DOM 元素、引入上下文环境、添加假数据等等。  
和 Parameters 一样,它也可以定义在全局/组件/story 三个层级,每个 Decorator 按定义顺序依次执行,从全局到 story。

例如,用一个额外的 <div> 包裹每个 story 的组件渲染:

// button.stories.tsimport { Meta, Story } from '@storybook/angular';
import { ListComponent } from './list.component';export default {title: 'Example/List',component: ListComponent,decorators: [(storyFunc) => {const story = storyFunc();return {...story,template: `<div style="height: 60px">${story.template}</div>`,};}]
} as Meta;

这样一来,这个列表组件的所有 story,都会展示出它在一个 60 像素高的容器内的呈现效果。

除了给组件包裹额外的元素,再例如为复合组件添加组件依赖:

// List.stories.tsimport { moduleMetadata } from '@storybook/angular';
import { CommonModule } from '@angular/common';import List from './list.component';
import ListItem from './list-item.component'// 给 list 组件添加它需要的组件和模块依赖
export default {title: 'List',component: List,decorators: [moduleMetadata({declarations: [ListItem],imports: [CommonModule],}),],
};const Template = (args: List) => ({component: List,props: args,
});

就像平常需要在 ngModule 中声明似的,moduleMetadata 装饰器可以轻松测试各种组件,让你能在 Storybook 中从小到大搭建组件库。

文章内容来源:
Storybook 组件驱动开发(一)-- 基本使用 前端 - Storybook 组件驱动开发(一)-- 基本使用 - 个人文章 - SegmentFault 思否

转载本站文章《storybook 编写stories的story基础语法》,
请注明出处:storybook 编写stories的story基础语法 - Storybook Driven Development学习笔记—组件化之后之组件管理 - 周陆军的个人网站

storybook 编写stories的story基础语法相关推荐

  1. python赋值语句的一般格式为_Python 基础语法

    Python 基础语法 Python 语言与 Perl,C 和 Java 等语言有许多相似之处.但是,也存在一些差异. 在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程 ...

  2. 深入浅出CMake(二): 基础语法

    在<深入浅出CMake(一):基础篇>文章中,我们已经知道了怎么依葫芦画瓢编写简单的 CMake 构建文件了,但如果应对复杂的工程的话,这还是远远不够的. CMake 是一套编译构建体系, ...

  3. 前端学PHP之正则表达式基础语法

    前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本 ...

  4. 01-Java基础语法

    day01_Java基础 一.课程目标 1. [了解]Java语言发展史 2. [理解]Java语言平台版本 3. [理解]Java语言特点 4. [理解]JRE与JDK 5. [掌握]Java开发环 ...

  5. Python 基础语法_Python脚本文件结构

    目录 目录 前言 软件环境 Python Script文件结构 导入模块的流程 Python的包package 最后 前言 Python基础语法这一章,主要记录了Python的文件结构.逻辑运算符.算 ...

  6. python 条件表达式换行_Python基础语法 - LongKing-Xu的个人空间 - OSCHINA - 中文开源技术交流社区...

    python基础语法 一.标识符 在Python中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. 在Python中的标识符是区分大小写的. 在Python中以下划线开头的标识符是有 ...

  7. python turtle基本语法_Python 基础语法-turtle篇

    Python 基础语法-turtle篇 今天这节课主要讲了类的概念,并引出turtle中的函数和Turtle类. -创建一个Turtle类:brad=turtle.Turtle() -定义Turtle ...

  8. html5 内嵌网页_HTML5与CSS3基础语法自学教程(二)

    本文首发于[前端课湛]微信公众号.可以在微信里搜索[前端课湛]关注,第一时间看文章! 导读: 本小节主要讲解 HTML 的基础语法内容,将通过编写第一个 HTML 页面来学习 HTML 的基本结构. ...

  9. python语法基础知识-python_基础知识_安装和基础语法

    一.python安装 先在官网,找到所属系统的安装环境.建议选择3.x 建议选择安装稳定版本. 选择自行配置安装环境. 直接选择Next,进行下一步. 选择安装目录. 安装页面,等待安装. 安装完成, ...

最新文章

  1. Subsonic设置--新手上路
  2. Linux文件系统大杂烩
  3. 强网杯2021 CipherMan (内存取证分析)
  4. WEBMIN里添加VSFTP控制模块
  5. 一个迷你ASP.NET Core框架的实现(下)
  6. UI实用素材模板|可临摹学习的控制面板
  7. 实验一 分治与递归—整数划分 java实现
  8. jstl-按照html的形式输出至页面
  9. JavaScript截断/切片/修剪掉字符串中的最后一个字符
  10. scp实现mac与linux服务器之间文件传输
  11. C# 调用C++DLL声明 常规参数/结构体/指针/数组
  12. pytorch基础教程2
  13. 查看dll/exe所依赖的库文件、导出函数、系统位数
  14. 黑客炸弹弹窗假装自己是黑客
  15. 三十不惑:情商智商决定我能走多快,德商(基本素质)决定我能走多远
  16. MySQL必知必会——实践习题
  17. 变限积分求导公式总结_变限积分的求导公式及其应用
  18. 微信发红包如何设计测试用例
  19. pscc2018安装服务器无响应,强大的功能无法使用,大神教你一招解决PSCC2018无法安装扩展插件...
  20. 用 ffmpeg 合并 m4s 音视频

热门文章

  1. 解决axios请求超时
  2. 企业软件防火墙iptables
  3. 网站购物行为数据分析
  4. matlab 劳斯稳定判据routh函数,同时实现对特殊情况的处理
  5. 【内网学习笔记】9、iodine 使用
  6. 强化学习-什么是强化学习?白话文告诉你!
  7. X-Ways Forensics v20.1
  8. java微信小程序开发难点,赶紧收藏!
  9. 无线通信知识回顾(2) - 《5G移动通信系统设计与标准详解》
  10. 系统集成项目管理工程师2021年上半年下午案例分析题及答案