React轮播图优化:通过延迟 + 动画的组合,彻底消除视觉上的闪烁感

  1. 添加 showCarousel 状态:控制轮播图何时显示
  2. 延迟显示轮播图:数据加载完成后,等待 300ms 再显示轮播图,让 loading 至少显示一段时间
  3. 淡入动画:轮播图出现时带有 0.5 秒的淡入效果,使过渡更加平滑自然
  4. 双重保障:通过延迟 + 动画的组合,彻底消除视觉上的闪烁感

这样修改后,即使数据加载很快,用户也会看到 loading 短暂显示,然后轮播图以淡入的方式平滑出现,不会有突兀的闪烁感了。

js 复制代码
// ... existing code ...

export default class Index extends React.Component {
  state = {
    swipers: [],
    isSwiperLoaded: false,
    showCarousel: false,
  };

  async getSwipers() {
    const res = await axios.get("http://localhost:8080/home/swiper");

    this.setState({
      swipers: res.data.body,
      isSwiperLoaded: true,
    });

    setTimeout(() => {
      this.setState({
        showCarousel: true,
      });
    }, 300);
  }

  componentDidMount() {
    this.getSwipers();
  }

  renderSwipers() {
    return this.state.swipers.map((item) => (
      <a
        key={item.id}
        href="http://www.alipay.com"
        style={{
          display: "inline-block",
          width: "100%",
          height: 212,
        }}
      >
        <img
          src={`http://localhost:8080${item.imgSrc}`}
          alt=""
          style={{ width: "100%", verticalAlign: "top" }}
        />
      </a>
    ));
  }

  renderNavs() {
    return navs.map((item) => (
      <Flex.Item
        key={item.id}
        onClick={() => {
          this.props.history.push(item.path);
        }}
      >
        <img src={item.img} alt="" />
        <h2>{item.title}</h2>
      </Flex.Item>
    ));
  }

  render() {
    return (
      <div className="index">
        <div className="swiper-container">
          {this.state.isSwiperLoaded && this.state.showCarousel ? (
            <Carousel autoplay={true} infinite autoplayInterval="2000" className="carousel-fade">
              {this.renderSwipers()}
            </Carousel>
          ) : (
            <div className="loading-wrapper">
              <ActivityIndicator size="large" />
            </div>
          )}
        </div>

        <Flex className="nav">{this.renderNavs()}</Flex>
      </div>
    );
  }
}
css 复制代码
// ... existing code ...

.swiper-container {
  height: 212px;
  position: relative;
}

.loading-wrapper {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}

.carousel-fade {
  animation: fadeIn 0.5s ease-in-out;
}

@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

// ... existing code ...
相关推荐
Cosolar5 小时前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架
米米商聊5 小时前
同名附件为什么被 Map 覆盖?重复键与一对多索引
前端·javascript
echome8886 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
时间的情敌6 小时前
OpenLayers 实战|Vue3 + OpenLayers 完整工程案例(加载天地图、要素、弹窗、绘制、WFS)
前端·openlayers
陈随易6 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
前端的日常7 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
计算机魔术师7 小时前
谷歌搜索广告踩刹车,AI广告成为救命稻草
前端
总要学点什么8 小时前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
IT_陈寒8 小时前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
hunter_0768 小时前
一次 iOS 真机签名 409 的完整排查:证书、设备、描述文件为什么总是"对不上"
前端