如何使 Storybook 插件“插件链接”适用于 Vue.js?

Posted

技术标签:

【中文标题】如何使 Storybook 插件“插件链接”适用于 Vue.js?【英文标题】:How to make Storybook addon 'addon-links' work for Vue.js? 【发布时间】:2018-07-09 00:18:18 【问题描述】:

我正在尝试学习如何在使用 Vue.js 的项目中使用 Storybook,但我似乎无法使插件“addon-links”正常工作,因为文档主要在 React 中。

我安装了

npm i --save @storybook/vue
npm i --save vue-loader@13.6.1
npm i --save @storybook/addon-actions
npm i --save @storybook/addon-links

插件“addon-actions”有效。

对于“插件链接”,我使用了网上的各种示例,这里是其中之一。

import Vue from 'vue'
import  storiesOf  from '@storybook/vue'

import  linkTo  from '@storybook/addon-links'

...

storiesOf('Button', module)
  .add('First', () => (
    template: `<button @click="action">Go to "Second"</button>`,
    methods: 
      action: () => 
        console.log('Go to "Second"')
        linkTo('Button', 'Second')
      
    
  ))
  .add('Second', () => (
    template: `<button @click="action">Go to "First"</button>`,
    methods: 
      action: () => 
        console.log('Go to "First"')
        linkTo('Button', 'First')
      
    
  ))

package.json


  "private": true,
  "scripts": 
    ...
    "storybook": "start-storybook -p 9001 -c .storybook"
  ,
"dependencies": 
    "@fortawesome/fontawesome": "^1.1.1",
    "@fortawesome/fontawesome-free-brands": "^5.0.3",
    "@fortawesome/fontawesome-free-regular": "^5.0.3",
    "@fortawesome/fontawesome-free-solid": "^5.0.3",
    "@fortawesome/vue-fontawesome": "^0.0.22",
    "@storybook/addon-console": "^1.0.0",
    "@storybook/addon-knobs": "^3.3.11",
    "axios": "^0.17.1",
    "bootstrap": "^4.0.0",
    "jquery": "^3.3.1",
    "js-cookie": "^2.2.0",
    "json-server": "^0.12.1",
    "popper.js": "^1.12.9",
    "sweetalert2": "^7.3.5",
    "vform": "^0.8.1",
    "vue": "^2.5.13",
    "vue-i18n": "^7.3.4",
    "vue-loader": "^13.6.1",
    "vue-meta": "^1.4.2",
    "vue-router": "^3.0.1",
    "vuetable-2": "^1.7.2",
    "vuex": "^3.0.1",
    "vuex-router-sync": "^5.0.0"
  ,
  "devDependencies": 
    "@storybook/addon-actions": "^3.3.11",
    "@storybook/addon-links": "^3.3.11",
    "@storybook/addon-notes": "^3.3.11",
    "@storybook/vue": "^3.3.11",
    "babel-core": "^6.26.0",
    "babel-eslint": "^8.2.1",
    "babel-plugin-syntax-dynamic-import": "^6.18.0",
    "cross-env": "^5.1.0",
    "eslint": "^4.15.0",
    "eslint-plugin-vue-libs": "^2.1.0",
    "laravel-mix": "^1.7.2",
    "vue-template-compiler": "^2.5.13",
    "webpack-bundle-analyzer": "^2.9.2"
  

console.log 有效。 Storybook UI 有效,按钮生成事件,但不会更改为使用 linkto 的下一个故事。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

使用新的组件故事格式 (CSF),我找到了一种方法来满足您的要求。

    export const myStory = () => (
      components:  MyComponent ,
      template: `<div style="width: 640px">
        <my-component :my-data="myData" @updated="updated" />
      </div>`,
      data() 
        return 
          myData: null,
        
      ,
      methods: 
        action: action('data-updated'),            // define the raw action
        updated($event) 
          this.myData = $event;                 // alter your data locally
          this.action($event);                      // call the raw action using a method
        
      
    );

花了不少功夫——但我就是这样做的。

【讨论】:

【参考方案2】:

安装没有getstorybook 命令后,链接按钮对我有效

methods: 
  action: linkTo('Button', 'Second') 

这行得通

methods: 
  action: linkTo('Button', (e) => 
    console.log('Go to "Second"')
    return 'Second';
  ) 

但不是这个

methods: 
  action: () => 
    console.log('Go to "Second"')
    linkTo('Button', 'Second')
  

正在安装 来自Storybook for Vue,

npm i --save-dev @storybook/vue npm i --save vue npm i --save-dev babel-core

从这个问题

npm i --save vue-loader@13.6.1 npm i --save-dev @storybook/addon-actions npm i --save-dev @storybook/addon-links

在一些编译错误之后

npm i --save-dev vue-template-compiler npm i --save vuex

这是我的 .storybook/addons.js

import '@storybook/addon-actions/register'
import '@storybook/addon-links/register'

这是我的 .storybook/config.js

import  configure  from '@storybook/vue'

import Vue from 'vue';
import Vuex from 'vuex'; // Vue plugins

function loadStories() 
  require('../src/stories')


configure(loadStories, module)

这是我的 src/stories/index.js

import  storiesOf  from '@storybook/vue';
import  action  from '@storybook/addon-actions';
import  linkTo  from '@storybook/addon-links';

storiesOf('Button', module)
  .add('First', () => (
    template: `<button @click="action">Go to "Second"</button>`,
    methods: 
      action: linkTo('Button', 'Second') 
    
  ))
  .add('Second', () => (
    template: `<button @click="action">Go to "First"</button>`,
    methods:  
      action: linkTo('Button', 'First') 
    
  ))

【讨论】:

感谢您的回复。在我使用的示例中,没有其他组件,只有一个简单的 html 按钮,因此不需要 components: MyButton 。我无论如何都试过了,只是为了绝对确定,但它没有用。在我看到的示例中,插件似乎适用于纯 Vue.js,因此不需要 React.js。我尝试了其他函数/方法语法,但也没有用。对其他可能的问题有什么想法吗? 实际上,我的第一个和第二个按钮在没有components 属性的情况下可以正常工作。我认为它是必需的,因为示例(上面的前 3 个按钮)显示了它。我完全错过了&lt;button&gt; 不是MyButton 组件的选择器这一事实。 其他似乎相关的唯一因素是安装 Storybook 的方法。 我设法使以下插件工作:ActionsKnobsNotesConsole 都具有类似的安装。唯一不起作用的是Links 插件。 如果我按照您的安装,我无法编译情节提要。您是否遗漏了一些步骤?

以上是关于如何使 Storybook 插件“插件链接”适用于 Vue.js?的主要内容,如果未能解决你的问题,请参考以下文章