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

React Router Link跳转Perfil页面仅首次生效,后续URL变更但页面不渲染

问题描述

使用Material-UI的Autocomplete组件结合React Flux实现搜索用户的搜索栏,每个选项是指向用户详情页的链接。首次点击选项时功能正常,但后续点击仅变更URL,页面不会重新渲染。

解决方案

1. 清理SearchBar组件的冗余逻辑

你的SearchBar中存在不必要的url状态和依赖它的useEffect,这会导致错误的URL拼接和不必要的接口请求,修改如下:

export function SearchBar() {
  const { store, actions } = useContext(Context);

  // 组件挂载时仅调用一次search获取所有艺术家列表
  useEffect(() => {
    actions.search();
  }, []);

  const artistas = store.artistas.slice();

  return (
    <Autocomplete
      id="autocomplete"
      freeSolo
      disableClearable
      options={artistas}
      getOptionLabel={(option) => `${option.nombre} ${option.apellido}`}
      renderOption={(option) => (
        <Link
          className="text-black text-decoration-none"
          to={`/perfil/${option.id}`}
        >
          {option.nombre} {option.apellido}
        </Link>
      )}
      renderInput={(params) => (
        <TextField
          {...params}
          size="small"
          placeholder="Search for your artist"
          margin="normal"
          variant="outlined"
          InputProps={{ ...params.InputProps, type: "search" }}
        />
      )}
    />
  );
}

2. 让Perfil组件响应URL参数变化

从一个用户详情页跳转到另一个时,Perfil组件不会重新挂载,只会更新user_id参数,需要监听参数变化触发数据更新:

方法一:在Perfil中监听user_id变化

如果About和Galeria依赖用户详情数据,可在Perfil中触发数据获取:

import { useEffect } from 'react';
import { useParams } from 'react-router-dom';
import { useContext } from 'react';
import { Context } from '../your-context-path'; // 替换为你的Context实际路径

export const Perfil = () => {
  const { user_id } = useParams();
  const { actions } = useContext(Context);

  // 当user_id变化时,重新获取该用户详情
  useEffect(() => {
    actions.fetchUserDetail(user_id);
  }, [user_id, actions]);

  return (
    <>
      <About user_id={user_id} />
      <Galeria user_id={user_id} />
    </>
  );
};

方法二:子组件内部监听props变化

如果About/Galeria自行请求数据,需在子组件中监听user_id变化:

// About组件示例
export const About = ({ user_id }) => {
  const [userData, setUserData] = useState({});
  const { actions } = useContext(Context);

  useEffect(() => {
    actions.fetchUserDetail(user_id).then(data => {
      setUserData(data);
    });
  }, [user_id, actions]);

  // 渲染用户详情内容...
};

3. 新增Flux Action获取单个用户详情

当前search仅获取艺术家列表,需新增action获取单个用户数据:

// Flux actions中添加
fetchUserDetail: async (userId) => {
  try {
    const response = await fetch(
      `${process.env.BACKEND_URL}/api/artistas/${userId}`
    );
    const data = await response.json();
    setStore({
      currentUser: data, // 在store中新增currentUser字段存储当前用户数据
    });
  } catch (error) {
    console.log("Error loading user detail", error);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:39:18