如何在storybook中渲染后调用vue组件上的方法?

0x6upsns  于 2023-10-23  发布在  Vue.js
关注(0)|答案(4)|浏览(180)

我的问题是在storybook中呈现组件后调用方法。它是关于展示一个模态的,但它可以应用于任何vue组件。
我需要在这里调用showDialog(true)方法创建组件后使其可见。

xmd2e60i

xmd2e60i1#

以下是使用Typescript和component story format of storybook (version 5.2+)的棘手解决方案:

import Vue from 'vue';

// ... some imports and global setup 

export const normalError = () => ({
  components: { 'error-modal': ErrorModal },
  template: `<error-modal @hook:mounted='externalMount'/>`, // bind the custom method on mounted hook
  methods: {                           // bind the new method to the component
    async externalMount() {            // don't use an arrow function or this will have wrong scope
      const anyThis: any = this;
      const vm = anyThis.$children[0]; // target the component ErrorModal
      await Vue.nextTick();            // wait that mounted() finished
      vm.showDialog(true);             // finally show the modal / call the method !
    }
  }
});

如果你找到一个更好的,我会很高兴知道和投票。

h9a6wy2h

h9a6wy2h2#

这是我们使用StoryBook 6.1的项目中的一个示例。它在组件被挂载后执行代码

<Preview>
  <Story name="The equipment">
  {
    {
      components: { EquipmentView },
      template: `<EquipmentView />`,
      mounted () {
        this.$store.commit('equipmentStore/setSelectedEquipment', {
          equipmentId: 'CONT100A',
          equipmentName: 'Container 100L A',
        });
      }
    }
  }
  </Story>
</Preview>

Vue(x)组件

export default class EquipmentView extends Vue {
    private storeModule = getModule(EquipmentStore);
    ...
}

我想在故事书中的打字脚本支持甚至更多(也许有人可以添加一个答案)。

xmjla07d

xmjla07d3#

下面是我如何解决它的(在mdx中,应该有一个等价的CSF)

export const Template = (args, { argTypes }) => ({
  components: { ModalComponent },
  props: Object.keys(argTypes),
  mounted () {
    this.$children[0].open()
  },
  template: `
    <ModalComponent v-bind="$props">
      <template #header>Header</template>
      <template #body>Lorem ipsum dolor sit amet</template>
      <template #footer>Footer</template>
    </ModalComponent>
  `
 });
vuv7lop3

vuv7lop34#

因为Vue 3已经删除了$children属性,现在需要使用refs来代替。

export const Template = (args, { argTypes }) => ({
  components: { ModalComponent },
  mounted () {
    this.$nextTick(() => {
      this.$refs.MY_REF.componentFunction();
    });
  },
  template: `<ModalComponent v-bind="args" ref="MY_REF">`
 });

相关问题