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

React点击li标签跳转路由并传递suggestion.id到InnerDetail组件的问题

解决方案

1. 修改路由配置(path.js)

要支持携带id参数,把原来的Route改成带参数占位符的形式:
如果是react-router v5版本:

<Route path="/detiled/:id">
  <InnerDetail />
</Route>

如果是react-router v6版本:

<Route path="/detiled/:id" element={<InnerDetail />} />

如果不需要把id暴露在地址栏,也可以用state隐式传参,路由不需要改占位符,保持原来的path="/detiled"即可

2. 修正搜索组件的Link传参写法

你代码里写的<Link to={/detiled/${suggestion.id}}>已经是正确的路径拼接写法,不需要额外加onClick跳转逻辑,Link组件本身就支持点击跳转。如果需要额外执行finddoctor逻辑,把原来的onClick改成箭头函数避免渲染时直接执行:

<Link to={`/detiled/${suggestion.id}`}>
  <li
    style={styles.listyle}
    key={index}
    className={classname}
    onClick={() => finddoctor(suggestion.id)}
  >
    {suggestion.firstname}
  </li>
</Link>

如果用隐式state传参,Link写法改成:

<Link 
  to={{
    pathname: "/detiled",
    state: { id: suggestion.id }
  }}
>

3. 在详情页获取id参数

方式1:路由参数获取(对应路径带id的写法)

从react-router-dom引入useParams钩子直接取参数:

import { useParams } from "react-router-dom";

export default function Detail(props) {
  const { id } = useParams(); // 这里的id和路由占位符:id对应
  const [data3, setdata3] = useState({}); // 建议用对象存单条详情,不要用数组
  const config = {
    headers: {
      Authorization: `token ` + localStorage.getItem("token"),
    },
  };

  useEffect(() => {
    // 拿到id后请求接口
    axios.get(`doctor-filter/?id=${id}`, config)
      .then((res) => {
        setdata3(res.data);
      });
  }, [id]); // 加id作为依赖,只有id变化时才重新请求
  // 剩下的原有逻辑不变
}

方式2:state隐式传参获取(对应不暴露id在地址栏的写法)

用useLocation拿state里的参数:

import { useLocation } from "react-router-dom";

export default function Detail(props) {
  const location = useLocation();
  const id = location.state?.id;
  // 后面请求逻辑和方式1一致
}

其他注意点

  • 你原来的useEffect没有加依赖项,会导致组件每次更新都重复发请求,必须加上依赖项
  • 详情数据建议用对象存储,你原来初始化用数组,渲染的时候拿属性会报错,初始化改成空对象即可
  • 你原来用window.location.pathname拆分路径的方式兼容性差,用react-router提供的钩子更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:24:00