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

Redux拉取数据实现MUI DataTables分页失效问题求助(React+Laravel)

问题定位

排查到你代码里存在3个核心问题:

  • 语法错误:props.carlists.(page=${pages}&per_page=${rowsPerPages}); 存在冗余的点运算符,且你混淆了Redux存储数据和请求方法的定位:props.carlists是你存在Redux store中的列表数据,不是请求调用函数,不能直接加括号传参调用
  • 逻辑流程错误:你直接复用了原生fetch的.then()逻辑处理Redux调用,Redux异步请求的响应处理应该放在thunk/saga等异步中间件中,最终把返回的列表数据、总条数更新到store,组件直接从props取更新后的数据即可,无需在组件内手动处理请求响应
  • 触发逻辑缺失:useEffect依赖项为空数组,只会在组件首次挂载时执行一次拉取,切换页码、修改每页行数时不会触发重新拉取数据;同时你代码里的changePage、changeRow方法没有更新组件内的page、rowsPerPage状态,也没有关联数据拉取逻辑

修复方案

步骤1:补充Redux异步逻辑

先定义异步action(以Redux Thunk为例),在action中发起请求并更新store:

// 定义action type
const FETCH_CAR_LISTS_SUCCESS = 'FETCH_CAR_LISTS_SUCCESS';
// 异步action
export const fetchCarLists = (page, perPage) => async dispatch => {
  const res = await fetch(`./indexListCar?page=${page}&per_page=${perPage}`);
  const resJson = await res.json();
  dispatch({
    type: FETCH_CAR_LISTS_SUCCESS,
    payload: {
      data: resJson.data,
      total: resJson.total
    }
  })
}
// reducer里处理state更新
const initialState = {
  carlists: [],
  total: 0,
  loading: false
}
const carReducer = (state = initialState, action) => {
  switch(action.type) {
    case FETCH_CAR_LISTS_SUCCESS:
      return {
        ...state,
        carlists: action.payload.data,
        total: action.payload.total,
        loading: false
      }
    // 其他action处理省略
    default:
      return state
  }
}

步骤2:修正组件内逻辑

把请求触发、状态更新都和Redux关联,修正后的组件代码如下:

// 把fetchCarLists映射到props,这里可以用mapDispatchToProps或者useDispatch hook
const loadData = (pages, rowsPerPages) => {
  setIsLoading(true)
  // 触发异步拉取action
  props.fetchCarLists(pages, rowsPerPages)
}

// 依赖项加入page、rowsPerPage,值变化时自动拉新
useEffect(() => {
  loadData(page, rowsPerPage)
}, [page, rowsPerPage])

// 分页/每页行数变化时更新对应状态,触发useEffect重新拉取
const changePage = (newPage, newRowsPerPage) => {
  setPage(newPage)
  setRowsPerPage(newRowsPerPage)
}
const changeRow = (newPage, newRowsPerPage) => {
  setPage(newPage)
  setRowsPerPage(newRowsPerPage)
}

const options = {
  filter: true,
  selectableRows: 'none',
  filterType: 'dropdown',
  responsive: 'vertical',
  rowsPerPage: 100,
  elevation: 0,
  onChangeRowsPerPage: false,
  setTableProps: () => {
      return {
          padding: '5px 3px 5px 10px',
          size: 'small'
      };
  },
  onRowSelectionChange: (i, t) => {
    console.log(i)
  },
  onTableChange: (action, tableState) => {
    switch (action) {
      case 'changePage':
        changePage(tableState.page, tableState.rowsPerPage);
        break;
      case 'sort':
        break;
      case 'changeRowsPerPage':
        changeRow(tableState.page, tableState.rowsPerPage)
        break;
      default:
    }
  }
};

// 渲染表格时直接用props.carlists作为数据源,用props.total作为总条数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:39:01