【问题标题】:React Router Dynamic Route: Invalid URLReact Router 动态路由:无效的 URL
【发布时间】:2021-09-26 09:17:25
【问题描述】:

1) 在 React 路由器中

<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 页面会出错,因为它没有所有数据是我的猜测,因为它是从 Search -> Click Result -> ResultPage 流中的 props 获得的。

是否有其他方法可以实现这一点,或者是使用动态页面并将props 传递给它的副作用?

【问题讨论】:

    标签: javascript reactjs react-router dynamic-routing


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,让我重新解释一下以确保我理解。 1) 不要通过链接传递...props。 2) 获取ResultPage 组件上的所有内容,因此如果我们只需输入特定的 URL,它就可以“独立”。但是我仍然需要通过Link 传递id,因为API 端点使用id 来获取所有数据(https://api.themoviedb.org/3/movie/${id}?api_key=${API_KEY}&amp;append_to_response=videos,images,release_dates,credits)。所以我不知道该怎么办?
    • 是的,你完全正确。在这种情况下,请将 URL 中的 title 替换为电影的 id。因此,它们可用于在结果组件中发送每部电影的相应数据
    • 听起来不错,因此无法在 URL 中传递 id,而是在 URL 中显示名称,http://disnyplus.plus/movie/space-jam-a-new-legacyhttp://disnyplus.plus/movie/379686。喜欢美化 URL。我不介意这种 id URL 方法,但显然名称看起来更好
    • 这是不可能的,因为除了刷新之外,用户可能会在没有任何历史记录的情况下作为第一页访问电影页面。因此,您必须在 URL 中包含 id,或者更改 API 并按名称发送请求,而不是按 id,或者在 URL 中同时包含名称和 id。
    • 如果能解决您的问题,请将此答案标记为正确答案。
    【解决方案2】:

    所以这是客户端路由的问题,基本上在你可以点击你的网址之前,在这种情况下http://disnyplus.plus/movie/avengers-endgame,你的浏览器向服务器发出请求,由于没有服务器路由,页面将导致错误。这样做是因为并非所有获取电影所需的 javascript 都已执行。 React 让您通过执行一些 javascript 打开网站上的页面而无需刷新。

    我可以推荐的一种可能的解决方案是使用 HashRouter,您的网址看起来像这样 http://disnyplus.plus/#/movie/avengers-endgame

    哈希路由会忽略哈希后的 url 部分,因此它们不会向服务器询问特定的 url,但它们所做的是首先调用索引页面,然后相应地呈现它们应该呈现的内容。

    如果您很好奇,我认为这个答案确实可以确定服务器/客户端/混合端路由,即使该问题与您的问题不匹配。我想你可以从中学到一些东西。

    React-router urls

    【讨论】:

    • 好的,谢谢,我会读一遍!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多