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

React+Redux Thunk项目点击表格行传用户ID触发axios请求的实现方案

最优实现方案

推荐用路由传参+详情页内发起请求的方案,该方案支持页面刷新、书签保存,是业内通用的标准实现,步骤如下:

步骤1:调整路由配置

首先将你的用户详情页路由修改为带参数的动态路由,以react-router v5为例:

// 路由配置处修改
<Route path="/Utilisateurs/:id_user" component={用户详情页组件} />

步骤2:修改列表页行点击逻辑

修改DataUsers组件中tr的onClick事件,跳转时携带当前用户ID:

// 先引入依赖
import { useDispatch } from 'react-redux';
import { getUserById } from '你的action文件路径';

function DataUsers() {
  const users = useSelector((state: any) => state.userReducer.infos);
  const now = 60;
  const history = useHistory();
  const dispatch = useDispatch(); // 新增dispatch实例

  return (
    <div className="tableCardDataUsers">
      <Table className="table" bordered hover responsive>
        <thead>
          <tr className="tableHeader">
            <th>ID</th>
            <th>Nom</th>
            <th>Email</th>
            <th>Date de création</th>
            <th>Numéro de téléphone</th>
            <th>Pourcentage</th>
            <th>Catégories</th>
          </tr>
        </thead>
        <tbody>
          {users.slice(0, 20).map((item: any, index: number) => (
            <tr
              className="redirectUser"
              // 修改跳转逻辑,携带用户ID
              onClick={() => history.push(`/Utilisateurs/${item.id}`)}
              // 建议把key改为item.id而非index,避免列表重排时渲染异常
              key={item.id}
            >
              <td>{item.id}</td>
              <td>
                {item.nom} {item.prenom}
                <br></br>Tcheker
              </td>
              <td>{item.email}</td>
              <td>18/10/1998</td>
              <td>{item.tel}</td>
              <td>
                <ProgressBar now={now} label={`${now}%`} />
              </td>
              <td className="tableCategorie">
                <Button
                  name="VDR"
                  name2=""
                  class="catButtonMini"
                  color="orange"
                  onclick={() => {}}
                  type="button"
                  data=""
                  image=""
                />
              </td>
            </tr>
          ))}
        </tbody>
      </Table>
    </div>
  );
}

步骤3:在用户详情页获取参数并请求数据

在用户详情页组件中,获取路由参数、发起请求、读取store数据渲染即可:

import { useParams, useHistory } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import { useEffect } from 'react';
import { getUserById } from '你的action文件路径';

function UserDetail() {
  const { id_user } = useParams<{id_user: string}>(); // 读取路由中的用户ID
  const dispatch = useDispatch();
  const history = useHistory();
  // 读取store中的用户数据、加载状态
  const user = useSelector((state: any) => state.userReducer.getUserById);
  const isLoading = useSelector((state: any) => state.userReducer.isLoading); // 替换为你实际存储loading的store字段

  // 组件挂载/用户ID变化时发起请求
  useEffect(() => {
    if(id_user) {
      dispatch(getUserById(id_user));
    } else {
      // 无有效ID时回退到列表页
      history.push('/用户列表页路径');
    }
  }, [dispatch, id_user, history]);

  // 异常/加载态处理
  if(isLoading) return <div>加载中...</div>
  if(!user) return <div>未找到对应用户</div>

  // 正常渲染详情
  return (
    <div>
      <h1>{user.nom} {user.prenom}</h1>
      <p>邮箱:{user.email}</p>
      <p>手机号:{user.tel}</p>
      {/* 其余详情字段渲染 */}
    </div>
  )
}

可选替代方案(不推荐)

如果不需要支持详情页刷新,也可以在列表页点击时直接发起请求再跳转:

// 列表页tr的onClick修改为
onClick={() => {
  dispatch(getUserById(item.id));
  history.push("/Utilisateurs");
}}

该方案缺点是用户刷新详情页时store数据会丢失,需要额外做持久化处理,仅适合内部临时页面使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 02:54:05