简体   繁体   English

将路由器 dom 路由反应到 ItemDetail

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM