首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JSX元素传递给自定义构建插件中的storybook参数

将JSX元素传递给自定义构建插件中的storybook参数
EN

Stack Overflow用户
提问于 2020-02-07 18:56:32
回答 1查看 665关注 0票数 1

我正在构建自定义选项卡

代码语言:javascript
复制
import React from 'react';
import { addons, types } from '@storybook/addons';
import { AddonPanel } from '@storybook/components';
import { useParameter } from '@storybook/api';

export const ADDON_ID = 'storybook/principles';
export const PANEL_ID = `${ADDON_ID}/panel`;
export const PARAM_KEY = 'principles'; // to communicate from stories

const PanelContent = () => {
  const { component: Component } = useParameter(PARAM_KEY, {});
  if (!Component) {
    return <p>Usage info is missing</p>;
  }
  return <Component />;
};

addons.register(ADDON_ID, api => {
  addons.add(PANEL_ID, {
    type: types.Panel,
    title: 'Usage',
    paramKey: PARAM_KEY,
    render: ({ active, key }) => {
      return (
        <AddonPanel active={active} key={key}>
          <PanelContent />
        </AddonPanel>
      );
    },
  });
});

然后在我的故事中使用它,比如

代码语言:javascript
复制
storiesOf('Superman', module)
  .addParameters({
    component: Superman,
    principles: {
      component: <Anatomy />
    },
  })
  .add('a story 1', () => <p>some data 1</p>)
  .add('a story 2', () => <p>some data 2</p>)

我尝试传入JSX元素的部分,比如

代码语言:javascript
复制
principles: { component: <Anatomy /> }, // this does not work

principles: { component: 'i can pass in a string' }, // this does work

当我将JSX元素作为prop传入时,我得到如下所示的错误

如何将JSX元素传递给storybook参数?

EN

回答 1

Stack Overflow用户

发布于 2021-01-26 01:37:16

找到了一种方法:

regiter.js

代码语言:javascript
复制
import { deserialize } from 'react-serialize'; //<-- this allows json to jsx conversion

// ...constants definitions
...

const Explanation = () => {
  const Explanations = useParameter(PARAM_KEY, null);
  const { storyId } = useStorybookState();
  const storyKey = storyId.split('--')?.[1];

  const ExplanationContent = useMemo(() => {
    if (storyKey && Explanations?.[storyKey])
      return () => deserialize(JSON.parse(Explanations?.[storyKey]));
    return () => <>No extra explanation provided for the selected story</>;
  }, [storyKey, Explanations?.[storyKey]]);

  return (
    <div style={{ margin: 16 }}>
      <ExplanationContent />
    </div>
  );
};

addons.register(ADDON_ID, () => {
  addons.add(PANEL_ID, {
    type: types.TAB,
    title: ADDON_TITLE,
    route: ({ storyId, refId }) =>
      refId
        ? `/${ADDON_PATH}/${refId}_${storyId}`
        : `/${ADDON_PATH}/${storyId}`,
    match: ({ viewMode }) => viewMode === ADDON_PATH,
    render: ({ active }) => (active ? <Explanation /> : null),
  });
});

在声明参数时:

代码语言:javascript
复制
{
  parameters:{
    component: serialize(<p>Hello world</p>)
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60112060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档