Storybook操作文档

Storybook操作文档

一、Storybook的安装和配置

  1. 安装

通过命令 初始化StoryBook环境,storybook自动检测开发环境,安装依赖

$ npx -p @storybook/cli sb init

  1. 更新目录结构

image

通过 npx sb init 安装storybook添加的目录

├─ .storybook // 预设的配置文件
│     ├─ main.js // 入口文件 
│     ├─ preview.js // 控制Stories的呈现、全局资源的加载 
├─ stories // 示例模版
│     ├─ Button.stories.js // 控制Stories的呈现、全局资源的加载 
│     ├─ Input.stories.js // 控制Stories的呈现、全局资源的加载 

  1. package.json 添加命令

 "scripts": { 
     "storybook": "start-storybook -p 6006", // 启动本地服务以预览 
     "build-storybook": "build-storybook" // 构建 
 },

  1. 入口配置 .storybook/main.js

storybook的webpack和项目的webpack是完全分离的,要在main.js里配置webpackFinal

const path = require('path')
module.exports = {
      stories: ['../stories/**/*.stories.mdx', '../stories/**/*.stories.@(js|jsx|ts|tsx)'],
      addons: ['@storybook/addon-links', '@storybook/addon-essentials'],
      framework: '@storybook/vue3',
      core: {
        builder: '@storybook/builder-webpack5'
      },
      webpackFinal: async config => {
        config.resolve.alias['@utils'] = path.resolve(__dirname, '../packages/utils')
        config.resolve.extensions.push('.ts', '.tsx')
        return config
      }
      // staticDirs: ["../public"], //静态资源访问
}

  1. 依赖配置 .storybook/preview.js

该文件引入全局依赖,定义StoryBook渲染相关的配置

因为示例代码中依赖 lucid-theme ,展现的页面没有样式,所以,StoryBook渲染需要额外引入lucid-theme主题

import '@dingdao/lucid-theme/lib/theme-default.css' //<== 引入全局样式

import elementPlus from 'element-plus'; //<== 引入第三方组件库
import { app } from '@storybook/vue3'   //<== 导入Storybook提供的Vue支持
app.use(elementPlus);                   //<== 安装

// 全局装饰器 decorators 装饰器的作用主要是统一修饰组件展示区域的样式,例如:设置居中、margin、padding 的距离等等。包括全局装饰器和组件装饰器
export const decorators = [(story) => ({
   components: { story },
   template: '<div style="margin: 3em;padding: 3em;text-align:center;"><story /></div>'
})];

export const parameters = {
  actions: { argTypesRegex: '^on[A-Z].*' },
  controls: {
    matchers: {
      color: /(background|color)$/i,
      date: /Date$/
    },
    expanded: true, //controls 展示更多字段
  }
}

  1. 全局管理配置 .storybook/manager.js
import { addons } from "@storybook/addons";
import theme from "./themes/theme";

addons.setConfig({
  theme: theme
})

  1. 全局主题配置 .storybook/themes/theme.js
import { create } from '@storybook/theming';
export default create({
  base: 'light',
  brandTitle: 'Lucid-UI', // logo不展示时,替代文本alt
  // brandImage: '/logo.png',
  brandImage: 'https://lucent.dev.dingdaoos.com/img/lucid-ui-logo.679258d4.png',
});

二、组件的Stroybook编写

  1. 创建 *.stories.js
  2. 引入组件
  3. 配置左侧菜单
  4. 配置控制门面板属性(argTypes)
  5. 配置Template模板
  6. 配置左侧子菜单
import LuInput from '../packages/components/input'

export default {
  title: 'Example/输入框Input',
  component: LuInput,
  decorators: [() => ({ template: '<div style="margin: 3em;width:240px"><story /></div>' })], //组件装饰器 就是套在组件外层的一个容器, 不需要可以不加.
  argTypes: {
    modelValue: {
      name: 'modelValue', //属性的名称,可以不写,默认是字段名
      control: { type: 'text' }, //关联属性的控件类型
      defaultValue: '', // Control 字段的默认值
      description: '组件的值', //设置属性的描述
      required: true, //将属性设置为可选或必需 >>> 没什么用,主要受字段内props字段影响
      //控制面板详情表格
      table: {
        type: {
          summary: '[string | number]' //提供该类型的简短版本
          // detail: 'something' //提供类型的扩展版本。
        },
        defaultValue: {
          //控制面板默认值字段
          summary: '' //提供默认值的简短描述
          // detail: 'Something' //提供更长版本的默认值描述。
        }
      }
    },
    maxlength: {
      name: 'maxlength',
      control: { type: 'Number' },
      defaultValue: 'text',
      description: `原生属性,最大输入长度`,
      options: ['text', 'password'],
      table: {
        type: {
          summary: 'Number'
        }
      }
    },
    type: {
      name: 'type',
      control: { type: 'inline-radio' },
      defaultValue: 'text',
      description: `组件的可选类型 =>  'text' | 'password'`,
      options: ['text', 'password'],
      table: {
        type: {
          summary: 'string'
        },
        defaultValue: {
          summary: '"text"'
        }
      }
    }
  }
}
const Template = args => ({
  components: { LuInput },
  setup() {
    return { args }
  },
  template: '<lu-input v-bind="args"></lu-input>'
})

export const Primary = Template.bind({})
Primary.storyName = '基础用法'

export const Primary2 = Template.bind({})
Primary2.args = {
  type: 'password',
}
Primary2.storyName = '密码框'

export const Primary3 = Template.bind({})
Primary3.args = {
  state: 'warning',
}
Primary3.storyName = '提醒状态'

export const Primary4 = Template.bind({})
Primary4.args = {
  type: 'text',
  state: 'danger',
  size: 'oversize'
}
Primary4.storyName = '超大警告'

三、运行部署

命令行执行:

npm run storybook

image

通过build命令 生成静态页面,直接部署静态页面即可

npm run build-storybook

image

四、附录:

  1. Props属性

无法复制加载中的内容

  1. Controls类型

无法复制加载中的内容

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容