学生名单点击并重定向到 React 页面

List of Students Click and Redirect to page React

我有一个学生列表作为导航栏(它不是导航栏,只是一个列表),我想点击一个学生 link,然后只被重定向到学生页面, 没有可见的学生列表。

点击学生 => 重定向至 Pupil.jsx 并显示学生姓名,但未显示学生名单。如果它是一个博客列表,例如点击博客 => 重定向到 Blog.jsx

我试过 const history = useHistory() 和 ``history.push(/pupil/${student}}`。它所做的只是改变了 URL,但没有重定向也没有渲染Pupil.jsx 页。

如有任何帮助,我将不胜感激。

我有的是

Home
Contact

Students
 o Levi
 o Mikasa
 o Eren

 This is Pupil Page
 Student: Eren

我想要的是:

Home
Contact

This is Pupil Page
Student: Eren

我的 JSX 文件:StudentRoom,Home/Contact,Navbar,Pupil

StudentRoom.jsx

import React from "react";
import Pupil from "./Pupil";
import {Link, Switch, Route, BrowserRouter as Router, Redirect} from "react-router-dom";

const StudentRoom = props => {
    
    const students = ["eren", "levi", "mikasa", "armin", "erwin"];
    
    const studentPage = (student) => {
        
        console.log(student);
        console.log("Student page");
        setStudentName(student);
        
    }

    return (

      
        <div>
            
            <ul>
            <Router>
              
            {students.map((student, i) => (
    
                    <React.Fragment key={i}>
                        
                <Link to={`/pupil/${student}`} onClick={() => studentPage(student)}>
                <li>{student}</li>
                </Link>
                </React.Fragment>
    
                )
              )}
    
                {students.map((student, i) => (
                    
                    <React.Fragment key={i}>
                    <Redirect to={`/pupil/${student}`}/>
                    <Switch>
                    <Route exact path={`/pupil/${student}`}>
                        <Pupil name={student}/>
                    </Route>
                </Switch>
                        </React.Fragment>
                    )
                              
                  )}
            </Router>
            </ul>
        </div>
    
    );
    
};

export default StudentRoom;

Pupil.jsx

import React from "react";

const Pupil = (props) => {
    return (
        <div>
            <h4>Pupil page</h4>
            <h4>Student: {props.name}</h4>
        </div>
    );
};
export default Pupil;

Navbar.jsx

import React from "react";
import {Link, Switch, Route, BrowserRouter as Router} from "react-router-dom";
import Home from "../pages/Home";
import Contact from "../pages/Contact";
import StudentRoom from "../pages/StudentRoom";
import Pupil from "../pages/Pupil";

function Navbar(){

    return (
    <div>
     <Router>
    <ul id="navbar-ul">
        <Link to="/">
            <li className="navbar-li">Home</li>
        </Link>
 
        <Link to="/contact">
            <li className="navbar-li">Contact</li>
        </Link>
        
          <Link to="/students">
            <li className="navbar-li">Students</li>
        </Link>
            </ul>
        
        <Switch>
            <Route exact path ="/" component={Home}/>
            <Route exact path ="/contact" component={Contact}/>
      
             <Route exact path ="/students" component={StudentRoom}/>
            <Route path="/pupil" component={Pupil}/>
        </Switch>
        </Router>
    </div>
    );
};

export default Navbar;

Home.jsx和Contact.jsx基本相同

import React from "react";
const Home = props => {
    
    return (
    <div>
            <h4>This is the Home page</h4>
    </div>
    );
};
export default Home;

请像这样修改您的 StudentRoom.jsxPupil.jsx

StudentRoom.jsx

import React, { useState } from "react";
import Pupil from "./Pupil.jsx";
import {
  Link,
  Switch,
  Route,
  BrowserRouter as Router,
  Redirect,
} from "react-router-dom";

const StudentRoom = (props) => {
  const students = ["eren", "levi", "mikasa", "armin", "erwin"];

  const [student, setStudent] = useState(null);

  const studentPage = (student) => {
    console.log("Student page", student);
    setStudent(student);
  };

  return (
    <div>
      <ul>
        <Router>
          {student ? (
            <Link to={`/`} onClick={() => setStudent(null)}> Go back </Link>
          ) : (
            students.map((student, i) => (
              <Link
                key={i}
                to={`/pupil/${student}`}
                onClick={() => studentPage(student)}
              >
                <li>{student}</li>
              </Link>
            ))
          )}

          <Switch>
            <Route path={`/pupil/:name`} component={Pupil} />
          </Switch>
        </Router>
      </ul>
    </div>
  );
};

export default StudentRoom;

Pupil.jsx

import React from "react";
import { useParams } from "react-router-dom";

const Pupil = (props) => {
  const { name } = useParams();
  return (
    <div>
      <h4>Pupil page</h4>
      <h4>Student: {name}</h4>
    </div>
  );
};
export default Pupil;