当前位置:首页 > React

react实现微博滑动

2026-01-27 16:56:55React

实现微博滑动效果的核心思路

微博滑动效果通常指下拉刷新和上拉加载更多功能。React中可以通过监听滚动事件或使用现成库实现。

使用自定义滚动监听实现

监听滚动位置计算是否到达容器底部或顶部触发对应操作:

import { useState, useEffect, useRef } from 'react';

function WeiboList() {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(false);
  const containerRef = useRef(null);

  useEffect(() => {
    fetchData();
    window.addEventListener('scroll', handleScroll);
    return () => window.removeEventListener('scroll', handleScroll);
  }, []);

  const fetchData = () => {
    setLoading(true);
    // 模拟API请求
    setTimeout(() => {
      setData(prev => [...prev, ...new Array(10).fill(0).map((_,i) => 
        `微博内容 ${prev.length + i + 1}`
      )]);
      setLoading(false);
    }, 1000);
  };

  const handleScroll = () => {
    if (loading) return;

    const { scrollTop, scrollHeight, clientHeight } = document.documentElement;
    // 到达底部加载更多
    if (scrollTop + clientHeight >= scrollHeight - 100) {
      fetchData();
    }
  };

  return (
    <div ref={containerRef}>
      {data.map((item, i) => (
        <div key={i} style={{padding: '20px', borderBottom: '1px solid #eee'}}>
          {item}
        </div>
      ))}
      {loading && <div>加载中...</div>}
    </div>
  );
}

使用react-infinite-scroll-component库

更简单的实现方式是使用专门处理无限滚动的React库:

import InfiniteScroll from 'react-infinite-scroll-component';

function WeiboList() {
  const [data, setData] = useState([]);
  const [hasMore, setHasMore] = useState(true);

  const fetchData = () => {
    // 模拟API请求
    setTimeout(() => {
      setData(prev => [...prev, ...new Array(10).fill(0).map((_,i) => 
        `微博内容 ${prev.length + i + 1}`
      )]);
      // 模拟数据加载完毕
      if (data.length >= 50) setHasMore(false);
    }, 1000);
  };

  return (
    <InfiniteScroll
      dataLength={data.length}
      next={fetchData}
      hasMore={hasMore}
      loader={<h4>加载中...</h4>}
      endMessage={<p>没有更多内容了</p>}
    >
      {data.map((item, i) => (
        <div key={i} style={{padding: '20px', borderBottom: '1px solid #eee'}}>
          {item}
        </div>
      ))}
    </InfiniteScroll>
  );
}

添加下拉刷新功能

实现下拉刷新需要监听touch或鼠标事件:

const [refreshing, setRefreshing] = useState(false);

const handleRefresh = () => {
  setRefreshing(true);
  setTimeout(() => {
    setData(new Array(10).fill(0).map((_,i) => `最新微博 ${i+1}`));
    setRefreshing(false);
  }, 1000);
};

// 在渲染中添加下拉刷新UI
{refreshing && (
  <div style={{textAlign: 'center', padding: '10px'}}>
    正在刷新...
  </div>
)}

性能优化建议

对于长列表渲染应使用虚拟滚动技术,推荐使用react-window库:

import { FixedSizeList as List } from 'react-window';

const Row = ({ index, style }) => (
  <div style={style}>
    微博内容 {data[index]}
  </div>
);

<List
  height={600}
  itemCount={data.length}
  itemSize={80}
  width="100%"
>
  {Row}
</List>

react实现微博滑动

标签: react
分享给朋友:

相关文章

react如何销毁

react如何销毁

React 组件销毁的机制 在 React 中,组件的销毁通常由 React 的生命周期管理。当组件从 DOM 中移除时,React 会自动触发销毁相关的生命周期方法。以下是关键点: 组件的销毁通…

react性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…

react 如何分页

react 如何分页

分页实现方法 在React中实现分页功能可以通过多种方式完成,具体取决于数据来源(如API或本地数据)和UI库的选择。以下是常见的实现方法: 使用本地数据分页 对于存储在组件状态或Context中…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

react架构如何

react架构如何

React 架构核心概念 React 的架构围绕组件化、虚拟 DOM 和单向数据流设计。组件是构建用户界面的独立模块,分为函数组件和类组件。虚拟 DOM 通过高效的 Diff 算法减少直接操作真实 D…

如何创建react

如何创建react

创建React项目的步骤 使用Create React App工具快速搭建React项目。确保已安装Node.js(版本需≥14.0.0)和npm(版本需≥5.6)。 打开终端或命令行工具,运行以下…