【问题标题】:React: Url changes, but page never moves反应:网址改变,但页面永远不会移动
【发布时间】:2021-11-09 21:12:09
【问题描述】:

就像标题一样,当我单击其中一项时,URL 会发生变化,但页面不会改变,只会显示相同的页面。

index.js

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import { BrowserRouter } from "react-router-dom";
import App from "./App";
import reportWebVitals from "./reportWebVitals";

ReactDOM.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>,
  document.getElementById("root")
);

reportWebVitals();

App.js

import axios from "axios";

import React, { useEffect, useState } from "react";
import { Routes, Route } from "react-router-dom";

import ListItem from "./components/ListItem";

function App() {
  const [data, setData] = useState([]);

  return (
    <div className="App">

       // Here I am using Routes
       <Routes>
         <Route
          path="/test"
          element={data.map((list) => (
            <ListItem key={list.id} {...list} />
          ))}
         ></Route>
       </Routes>
    
    </div>
  );
}

export default App;

Test.js

import React from "react";

const Test = () => {
  return (
    <div>
      <p>Test</p>
    </div>
  );
};

export default Test;

数据

{
  id: recipe_id
  category: String 
  cookingSteps: [String] 
  cookingTime: Int 
  description: String 
  ingredients: [String] 
  kcal: Int
  name: String 
  servings: Int 
  spices: [String] 
  picture: String
}

我也尝试过useNavigate,但没有成功。我在这里错过了什么?

我编辑了这个问题,因为它有些模糊。

这是源代码树。

你能让我知道我应该解决什么问题吗?

【问题讨论】:

  • 您是否正在渲染任何路由以匹配 URL 路径并渲染其他任何内容?从您共享的代码 sn-p 和您描述的行为来看,这正是我所期望的。似乎您有一个非常简单的示例,您可以更新并分享一个更具代表性的代码示例吗?
  • 你能分享你的路线定义吗?
  • @DrewReese 我已经编辑了我的问题。实际上我没有明白我需要分享更多内容的意义,因为我分享的代码都是我写的,所以我添加了source treeTest.js。请让我知道我需要添加更多内容。
  • @Camilo routes definition 是什么意思?
  • 所以你没有渲染任何Route 组件?这些就是将 path 属性与 URL 匹配并为该路径呈现组件的原因。

标签: reactjs react-router react-router-dom


【解决方案1】:

为了响应 URL 的变化呈现不同的内容,您还需要将组件呈现为与每个路径匹配的 Route 组件。

示例应用:

import React, { useEffect, useState } from "react";
import { Link, Routes, Route } from "react-router-dom";

import ListItem from "./components/ListItem";
import About from "./components/About";
import Test from "./components/Test";

function App() {
  const [data, setData] = useState([]);

  return (
    <div className="App">

      /* Links for navigation */
      {data.map((list) => (
        // url changes here, but page got stuck in this App page
        <Link to="/test" key={list.id}>
          <ListItem {...list} />
        </Link>
      ))}

      /* Routes for rendering content */
      <Routes>
        <Route path="/about" element={<About />} />
        <Route path="/test" element={<Test />} />
      </Routes>
    </div>
  );
}

演示

const About = () => <h1>About</h1>;
const Test = () => {
  return (
    <div>
      <p>Test</p>
    </div>
  );
};

export default function App() {
  return (
    <div className="App">
      <ul>
        <li>
          <Link to="/about">About</Link>
        </li>
        <li>
          <Link to="/test">Test</Link>
        </li>
      </ul>
      <Routes>
        <Route path="/about" element={<About />} />
        <Route path="/test" element={<Test />} />
      </Routes>
    </div>
  );
}

【讨论】:

  • 我确实很感谢您的回答,但我仍然面临同样的问题。你能再检查一下我刚刚编辑的问题吗?
  • @Uheny ListItem 是什么?看起来你正在映射其中的一些。您能否还包括data 是什么?
  • @Uheny 如果您所做的正是这个答案所显示的,那么应该没有问题。假设您使用的是 react-router-dom v5。此答案假定 ListItem 是导航链接按钮,Test 组件是您希望根据 path 组件的 path 属性中指定的不同 URL 呈现的内容。检查您的理解并在提供的沙箱中尝试您的变量。
  • 是的,我确实最初假设data 正在映射到导航链接,但此时它可以是任何东西,或者完全不相关,IDK。这就是为什么我添加了带有 2 个链接和 2 个路由的非常简单的沙盒演示。
  • @DrewReese 我刚刚添加了我想看的图像。希望这有助于理解我的问题..
【解决方案2】:

Route 组件渲染第一个匹配当前 URL 的,因为它总是匹配 home '/' 它会渲染第一个页面。 -> 将 'exact' 添加到您的 Route 组件,它将呈现与当前 URL 匹配的确切 URL

import { Switch, Route } from "react-router-dom";
function App() {

    return (
     <>
       <div className="App">

         <Link to="/test">
           <ListItem />
         </Link>
      </div>
      <Switch>
         <Route exact path='/' />
         <Route path='/test' />
      </Switch>
   </>
   );
   }

export default App;

【讨论】:

  • 当我们还没有看到任何Route 组件来知道它们的顺序时,您怎么可能提供答案?还有一个最近的主要版本从根本上改变了Route 组件的使用和匹配方式,消除了exact 属性。此外,在旧版本中,正确的解决方案是使用正确的路由/路径顺序,而不是在任何地方指定 exact 属性。
  • @Abraham 谢谢你的回答,但我收到了这个错误'Switch' is not exported from 'react-router-dom'.
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多