React Context装饰器导致Storybook中Header组件故事消失问题
问题诊断与解决办法
可能原因1:fakeAuthData() 函数执行出错
如果fakeAuthData()调用时抛出错误(比如未正确导出、内部逻辑报错),会导致装饰器渲染失败,Storybook无法正常加载该故事,直接从列表中隐藏。
解决步骤:
- 先用静态测试数据替换
fakeAuthData()验证:Beep.decorators = [ (Story) => ( <AuthContext.Provider value={{ user: { id: '1', name: 'Test User' }, isAuthenticated: true }}> <Story /> </AuthContext.Provider> ), ]; - 如果替换后故事正常显示,说明
fakeAuthData()存在问题,检查该函数实现,确保返回与AuthContext预期结构一致的数据。
可能原因2:上下文与路由的嵌套顺序错误
Header组件可能同时依赖AuthContext和Router的上下文,当前模板中Router在装饰器的Provider内部,若组件要求AuthContext在Router外层才能工作,会导致渲染异常。
调整方案:
将Router移到装饰器内部,确保AuthContext.Provider包裹Router:
// 简化Template为基础结构 const Template: ComponentStory<typeof Header> = (args) => <Header {...args} />; // 在装饰器中同时提供所需上下文 Beep.decorators = [ (Story) => ( <AuthContext.Provider value={fakeAuthData()}> <Router> <Story /> </Router> </AuthContext.Provider> ), ];
可能原因3:类型不匹配导致编译错误
如果fakeAuthData()返回的数据类型与AuthContext定义的类型不一致,TypeScript编译错误可能导致Storybook无法加载该故事(部分场景下不会显示错误提示,直接隐藏故事)。
检查步骤:
- 查看
AuthContext的类型定义,比如:export const AuthContext = createContext<{ user: User | null; isAuthenticated: boolean; }>({ user: null, isAuthenticated: false }); - 确保
fakeAuthData()返回的对象完全匹配上述类型,无缺失属性或类型不兼容情况。
可能原因4:Storybook版本兼容性问题
若使用的Storybook版本较旧,故事级别装饰器的写法可能存在兼容性问题。
验证方式:
将装饰器移到组件元数据的全局配置中测试:
export default { title: 'Header', component: Header, parameters: { layout: 'fullscreen', }, // 全局装饰器(该组件所有故事都会应用) decorators: [ (Story) => ( <AuthContext.Provider value={fakeAuthData()}> <Router> <Story /> </Router> </AuthContext.Provider> ), ], } as ComponentMeta<typeof Header>; // 简化Template const Template: ComponentStory<typeof Header> = (args) => <Header {...args} />;
内容的提问来源于stack exchange,提问作者Cjmaret
相关产品推荐
相关产品推荐

