如何在Storybook中触发组件传入的懒加载函数?
在Storybook中触发Item组件的懒加载函数
我来给你几个实用的方案,帮你在Storybook里模拟触发这个懒加载函数,让Item组件能正常显示加载后的内容:
方案1:组件挂载后自动触发
如果想模拟用户滚动到组件位置自动触发懒加载的场景,可以在Story的渲染逻辑里,用useEffect在组件挂载后直接调用模拟的懒加载函数:
// Item.stories.js import React, { useEffect } from 'react'; import Item from './Item'; export default { title: 'Components/Item', component: Item, }; const DefaultTemplate = (args) => { // 模拟容器组件的懒加载函数逻辑 const mockLazyLoading = () => { console.log('触发懒加载,加载帖子内容'); // 如果实际逻辑是更新内容状态,这里可以结合useState来模拟 }; // 组件挂载后自动执行懒加载 useEffect(() => { mockLazyLoading(); }, []); return <Item {...args} lazyLoading={mockLazyLoading} />; }; export const AutoLoadOnMount = DefaultTemplate.bind({}); AutoLoadOnMount.args = { key: 1, text: "test", styles: { background: '#f0f0f0' } };
方案2:手动点击触发(模拟用户交互)
如果需要测试用户主动触发的场景(比如点击按钮加载),可以在Story里添加一个触发按钮,手动调用懒加载函数:
export const ManualLoadTrigger = () => { const [contentLoaded, setContentLoaded] = React.useState(false); const mockLazyLoading = () => { // 模拟异步加载过程 setTimeout(() => { console.log('懒加载完成,更新内容'); setContentLoaded(true); }, 1000); }; return ( <div> <button onClick={mockLazyLoading} disabled={contentLoaded}> {contentLoaded ? '已加载完成' : '点击触发懒加载'} </button> <Item key={1} text={contentLoaded ? '加载后的完整帖子内容' : 'test'} styles={{ background: '#f0f0f0' }} lazyLoading={mockLazyLoading} /> </div> ); };
方案3:模拟容器组件的上下文逻辑
如果原来的lazyloading函数依赖容器组件的内部状态或方法,你可以在Story里完整模拟容器的核心逻辑,让Item组件的调用更贴近真实场景:
export const WithContainerContext = () => { const [posts, setPosts] = React.useState([]); // 完全模拟容器组件的懒加载函数 const lazyloading = () => { // 模拟从接口获取帖子数据 fetch('https://api.example.com/posts') .then(res => res.json()) .then(data => setPosts(data)) .catch(err => console.error('加载失败:', err)); }; useEffect(() => { // 可选:挂载后自动触发 lazyloading(); }, []); return ( <div> {posts.map(post => ( <Item key={post.id} lazyLoading={lazyloading} text={post.content} styles={{ background: '#f0f0f0' }} /> ))} </div> ); };
核心思路就是:在Storybook中我们是独立渲染Item组件,所以需要自己模拟容器组件传入的lazyLoading函数的行为,然后通过自动执行或手动交互的方式调用它,这样就能触发加载逻辑,让Item显示对应的内容了。
内容的提问来源于stack exchange,提问作者jak111
相关产品推荐
相关产品推荐

