当前位置:首页 > React

react实现微博滑动

2026-01-27 16:56:55React

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

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

使用自定义滚动监听实现

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

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库:

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 是一个用于构建用户界面的 JavaScript 库。学习 React 的第一步是掌握其核心概念,包括组件、状态(State)、属性(Props)和生命周期方法…

react 如何继承

react 如何继承

在React中,组件继承并非推荐的设计模式(官方更推崇组合优于继承),但技术上仍可通过以下方式实现类似效果: 使用ES6类继承 通过extends关键字继承父组件类,子组件可访问父组件的生命周期方法…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

如何开发react

如何开发react

开发React应用的基本步骤 安装Node.js和npm 确保系统中已安装Node.js(包含npm)。可通过官网下载安装包,安装后验证版本: node -v npm -v 创建React项目…

如何用react

如何用react

使用React的基本步骤 安装Node.js和npm 确保系统已安装Node.js和npm。Node.js自带npm,可从官网下载安装包。安装完成后,通过命令行验证版本: node -v npm -…

react 如何跳转

react 如何跳转

使用 React Router 进行页面跳转 React 应用中通常使用 react-router-dom 库实现页面跳转。以下是几种常见的跳转方式: 安装依赖 npm install react…