You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:30:47