首页 > 解决方案 > React Router 动态路由:无效的 URL

问题描述

1) 在反应路由器中

<Route path={"/movie/:id"} component={ResultPage} />

2) 搜索组件

<div className="results">
  {data.map((movie) => (
    <Result
      poster_path={movie.poster_path}
      alt={movie.title}
      key={movie.id}
      id={movie.id}
      title={movie.title}
      overview={movie.overview}
      release_date={movie.release_date}
      genre_ids={movie.genre_ids}
    />
  ))}
</div>;

在此处输入图像描述

3) 结果组件

export default function Result(props) {
  const { poster_path: poster, alt, title } = props;

  return (
    <div className="result">
      <Link
        to={{
          pathname: `/movie/${title}`,
          state: { ...props },
        }}
      >
        <img
          src={
            poster
              ? `https://image.tmdb.org/t/p/original/${poster}`
              : "https://www.genius100visions.com/wp-content/uploads/2017/09/placeholder-vertical.jpg"
          }
          alt={alt}
        />
      </Link>
    </div>
  );
}

4) ResultPage 组件

您现在可以看到 URL,http://disnyplus.plus/movie/avengers-endgame但是如果您打开一个新选项卡并复制/粘贴相同的 URL,页面将出错,因为它没有所有数据是我的猜测,因为它是props从搜索中获得的 -> 单击结果 -> ResultPage 流。

是否有另一种方法来实现这一点,或者是使用动态页面并传递给它的副作用props

在此处输入图像描述

标签: javascriptreactjsreact-routerdynamic-routing

解决方案


如您所见,当用户刷新页面或访问页面而不从搜索页面重定向时,无法访问存储在 props.location.state 中的数据。因此,这不是一个好的做法。

我建议将电影的标题(或 id)保留在 URL 中(正如您已经完成的那样),然后ResultPage component根据电影的标题或 id 接收所需的数据。您可以利用 React 生命周期来发送请求以获取数据。您可以在文档中阅读有关在类和功能组件中获取数据的最佳方式的更多信息。

另一个可以解决您的问题但我不推荐的解决方案是将数据存储在 Cookie 或本地存储中,并使其在重新加载时可以访问。


推荐阅读