[英]React router dom routing to ItemDetail
I am doing a personal React.js project.我正在做一个个人 React.js 项目。 I am trying to use react-router-dom, but I haven't been able to make it work.我正在尝试使用 react-router-dom,但我无法使其工作。 I did the BrowserRouter in the App.js.我在 App.js 中做了 BrowserRouter。 Till there the app works fine, but I cannot make the routing redirect dynamically to a map item.直到那里应用程序工作正常,但我无法使路由动态重定向到 map 项目。 I tried to follow the documentation and some tutorials unsuccesfully.我试图按照文档和一些教程没有成功。 The data comes from the Star Wars API This is the code: App.js:数据来自星球大战API这是代码:App.js:
import './App.css';
import { Route, BrowserRouter as Router, Routes } from "react-router-dom";
import Home from './components/Home';
import MovieDetail from './components/MovieDetail'
import Navbar from './components/Navbar';
function App() {
return (
<Router>
<>
<Navbar />
<Routes>
<Route exact path='/' element={<Home />} />
</Routes>
<Routes>
<Route exact path to='/:movieId' element={<MovieDetail />} />
</Routes>
</>
</Router>
);
}
export default App;
ItemDetail:项目详情:
import { useEffect, useState } from "react";
import { useParams } from "react-router-dom";
const MovieDetail = () => {
const { movieId } = useParams();
const [result, setResult] = useState([]);
const fetchData = async () => {
const res = await fetch("https://www.swapi.tech/api/films/");
const json = await res.json();
setResult(json.result);
}
useEffect(() => {
fetchData();
}, []);
let movieMatch = (result.find(value) => value.properties.title == movieId)
return (
<div>
<h2>
{result
.find((value) => {value.properties.title == movieId})}
</h2>
</div>
);
}
export default MovieDetail;
From your code I'm assuming you're using React Router v6
in your project.根据您的代码,我假设您在项目中使用React Router v6
。 Try the below code:试试下面的代码:
import './App.css';
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from './components/Home';
import MovieDetail from './components/MovieDetail'
import Navbar from './components/Navbar';
function App() {
return (
<BrowserRouter>
<Routes>
<Navbar />
<Route path='/' element={<Home />} />
<Route path=':movieId' element={<MovieDetail />} />
</Routes>
</BrowserRouter>
);
}
export default App;
Checkout React Router's Documentation for more detail.查看React Router 的文档以获取更多详细信息。
if you are using index.js as a wrapper for app.js <BrowserRouter /> or <Router />
in your case is not used in app.js it's used in index.js otherwise it will not work如果您使用 index.js 作为 app.js 的包装器<BrowserRouter /> or <Router />
在您的情况下未在 app.js 中使用它在 index.js 中使用,否则它将不起作用
index.js should look like this: - index.js 应该是这样的: -
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
function App() {
return <h1>Hello React Router</h1>;
}
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById("root")
);
**For example just Let's say you are having "/movies" route and you want when ever your app (route = "/") starts / loads up to be redirected to "/movies" ** then wrap the routing logic with **例如,假设您有“/movies”路由,并且您希望在您的应用程序(路由 =“/”)启动/加载时重定向到“/movies”**然后将路由逻辑包装为,make use of Redirect property of router dom to redirect from "/" to "/movies" and use component instead of element to render the corresponding component plus dont wrap with <Routes> </Routes>
every time you are doing the route as we used it in index.js ,利用路由器 dom 的Redirect属性从“/”重定向到“/movies”,并使用组件而不是元素来渲染相应的组件,并且每次执行路由时不要用<Routes> </Routes>
包装我们在 index.js 中使用它
then app.js will be: -那么 app.js 将是:-
import './App.css';
import { Route, BrowserRouter as Router, Routes } from "react-router-dom";
import Home from './components/Home';
import MovieDetail from './components/MovieDetail'
import Navbar from './components/Navbar';
function App() {
return (
<>
<Navbar />
<Switch>
<Route exact path='/movies' component={<Home />} />
<Route exact path to='movies/:movieId' component={<MovieDetail />}
// to redirect from "/" to "/movies"
<Redirect from="/" to="/students"></Redirect>
);
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.