在故事书预览中定义一个功能组件

Posted

技术标签:

【中文标题】在故事书预览中定义一个功能组件【英文标题】:Define a functional component inside storybook preview 【发布时间】:2020-07-10 12:28:21 【问题描述】:

我有一个自定义模态组件作为功能组件和打字稿。这个模态组件通过上下文提供程序公开 api 并访问它们,我正在使用 useContext 钩子。

const  openModal, closeModal  = useContext(ModalContext);

关于我如何使用这个 api 的示例代码:

const TestComponent = () => 
    const  openModal, closeModal  = useContext(ModalContext);
    const modalProps = ; //define some props
    const open = () => 
        openModal(...modalProps);
    
    return (
       <div>
          <Button onClick=open>Open Modal</Button>
       </div>
    )

我将组件包装在我的 ModalManager 中

<ModalManager>
    <TestComponent />
</ModalManager>

这个例子在我的 Modal.stories.tsx 中工作得很好

问题: 但这在我的 Modal.mdx 中不起作用。它说我无法访问功能组件之外的反应挂钩。所以,我需要定义一个类似 TestComponent 的组件来从上下文访问我的模态 api。如何定义它以及在哪里定义它以便下面的代码预览工作?

import 
 Props, Preview, Meta
 from '@storybook/addon-docs/blocks';
<Meta title='Modal' />
<Preview
  isExpanded
  mdxSource=`
    /* source of the component like in stories.tsx */
  `
>
  <ModalManager><TestComponent /></ModalManager>
</Preview>

【问题讨论】:

【参考方案1】:

您可能有一个实用程序 HOC 来在 MDX 文件中呈现它,如下所示

某些 Utils 文件夹中的 HOCComp.tsx

import React,  FunctionComponent, PropsWithChildren  from 'react';

export interface HOCCompProps 
  render(): React.ReactElement;


const HOCComp: FunctionComponent<HOCCompProps> = (props: PropsWithChildren<HOCCompProps>) => 
  const  render  = props;
  return render();
;

export default HOCComp;

内部 MDX 文件

import HOCComp from './HOC';

<HOCComp render=()=>  
    function HOCImpl()
      const [count,setCount] = React.useState(180);
      React.useEffect(() => 
        const intId = setInterval(() => 
          const newCount = count+1;
          setCount(newCount);
        ,1000)
        return () => 
          clearInterval(intId);
        
      )
      return <Text>count</Text>
    
    return <HOCImpl />

/>

【讨论】:

【参考方案2】:

我不确定这是破解还是唯一的方法。我在不同的 tsx 文件中创建了 TestComponent,然后将其导入 mdx。它奏效了。

【讨论】:

以上是关于在故事书预览中定义一个功能组件的主要内容,如果未能解决你的问题,请参考以下文章

如何测试故事书中功能道具的功能?

在故事书故事中使用类星体组件时无法读取未定义的属性“屏幕”

向故事书中的 html 类添加控件

React Typescript 故事书使用 onChange callBack 然后 setState 值 backTo Input 实现自定义 Input 组件

框架中的自定义 ui 组件未呈现到故事板

如何在故事书中配置 webpack 以允许 babel 在项目文件夹之外导入反应组件