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

Material UI Pagination点击分页内容不更新问题求助

问题解决步骤

1. 修复Material UI Pagination的页码传递逻辑

在AppPagination.js中,Material UI的Pagination组件onChange回调的参数用法错误。官方API规定,onChange的第二个参数才是选中的页码值,而非通过e.target.textContent获取,修改如下:

// AppPagination.js
import React from "react";
import { Pagination } from "@mui/material";

const AppPagination = ({setPage,pageNumber}) => {
    const handleChange = (newPage)=> {
        setPage(newPage)
        window.scroll(0,0)
        console.log(newPage)
    }
  return (
    <div >
        <div >
            <Pagination
            onChange={(e, value) => handleChange(value)} // 改用第二个参数value获取页码
            variant="outlined"
            count={pageNumber}/>
        </div>
    </div>
  )
}

export default AppPagination;

2. 修正elementFood的作用域问题

在MealNew.js中,elementFood被定义在fetch回调内部,导致渲染时无法获取最新数据。直接在渲染阶段使用data状态生成列表即可:

// MealNew.js 中return部分修改
return (
    <Card className="meal">
        <form onSubmit={handleSubmit}>
            <input 
                className="search"
                placeholder="Search..."
                value={query}
                onChange={(e)=>setQuery(e.target.value)}/>
            <input type='submit' value='Search'/>
        </form>
      
        <li className="meal">
            <div className='meal-text'>
                {/* 直接用data.map生成列表,删除原elementFood变量 */}
                {showData && data.map((meal, key) => (
                    <div key={key}>
                        <h1>{meal.title}</h1>
                        <img src={meal.image} alt='e-meal'/>
                    </div>
                ))}
                <AppPagination
                    setPage={setPage}
                    pageNumber={numberOfPages}  
                />
            </div>
        </li>
    </Card>
)

同时简化handleClick函数,删除内部的elementFood定义:

const handleClick = () => {
    setShowData(true);
    const link = `https://api.spoonacular.com/recipes/complexSearch?query=${query}&apiKey=XYZABC&page=${page}`;
    fetch(link)
    .then((response)=> response.json())
    .then((data) => {
        setData(data.results)
        setNumberOfPages(data.total_pages)
    })
}

3. 解决useEffect的依赖警告

用useCallback包裹handleClick,明确其依赖项,再更新useEffect的依赖数组:

首先导入useCallback:

import React, {useEffect, useState, useCallback } from "react";

包裹handleClick:

const handleClick = useCallback(() => {
    setShowData(true);
    const link = `https://api.spoonacular.com/recipes/complexSearch?query=${query}&apiKey=XYZABC&page=${page}`;
    fetch(link)
    .then((response)=> response.json())
    .then((data) => {
        setData(data.results)
        setNumberOfPages(data.total_pages)
    })
}, [query, page]) // 依赖query和page,值变化时重新生成函数

更新useEffect:

useEffect(()=> {
    handleClick();
},[handleClick]) // 依赖包裹后的handleClick

另外建议将初始page值设为1(符合常规分页逻辑):

const[page,setPage] = useState(1);

4. 额外优化:搜索时重置页码

用户提交新搜索时,自动重置页码为1,避免在新结果中停留在旧页码:

const handleSubmit = (e) => {
    e.preventDefault();
    setPage(1); // 重置页码
    handleClick();
}

完成以上修改后,分页点击即可正确切换内容,同时解决React Hook的依赖警告问题。

内容的提问来源于stack exchange,提问作者senix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:05:23