当我try 更改页面并点击导航栏时,它会变成url,但在我手动点击重新加载页面之前,它不会改变.

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import HomePage from './components/HomePage/HomePage';
import reportWebVitals from './reportWebVitals';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'jquery/dist/jquery.js';
import 'popper.js/dist/popper.js';
import 'bootstrap/dist/js/bootstrap.min.js';
import '@fortawesome/fontawesome-free/css/fontawesome.min.css'
import { MainMenu, MainMenuItem } from './components/MainMenu/MainMenu';
import { HashRouter, Routes, Route } from 'react-router-dom';
import { ContactPage } from './components/ContactPage/ContactPage';
import { UserLoginPage } from './components/UserLoginPage/UserLoginPage';

const menuItems = [
  new MainMenuItem("Home", "/"),
  new MainMenuItem("Contact", "/contact"),
  new MainMenuItem("Log in", "/user/login"),
];

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);

root.render(
  <React.StrictMode>
    <MainMenu items={menuItems} />
    <HashRouter>
      <Routes>
        <Route index path='/' element={<HomePage />} />
        <Route path="/contact" element={<ContactPage />} />
        <Route path="/user/login" element={<UserLoginPage />} />
     </Routes>
    </HashRouter>
  </React.StrictMode>
);

reportWebVitals();

这是另一个需要对齐我的导航栏的类.

import React from 'react';
import { Nav, Container } from 'react-bootstrap';
import { HashRouter , Link } from 'react-router-dom';

export class MainMenuItem {
  text: string = '';
  link: string = '#';

  constructor(text: string, link: string) {
    this.text = text;
    this.link = link;
  }
}

interface MainMenuProperties {
  items: MainMenuItem[];
}

interface MainMenuState {
  items: MainMenuItem[];
}

export class MainMenu extends React.Component<MainMenuProperties>{
  state: MainMenuState;

  constructor(props: Readonly<MainMenuProperties>) {  
    super(props);
    this.state = {
      items: props.items,
    };
  }

  public setItems(items: MainMenuItem[]) {
    this.setState({
      items: items,
    });
  }

  render() {
    return (
      <Container>
        {this.state.items.map(this.makeNewLink)}
    );
  }

  private makeNewLink(item: MainMenuItem, index: number) {
    return (
      <Link key={index} to={item.link} className='nav-link'>
        {item.text}
      </Link>
    );
  }
}

推荐答案

您正在呈现MainMenu中的应用程序链接(100),而呈现其自己的路由的应用程序链接(100),而您想要导航到的路由在index.js中呈现在其自己的HashRouter中.

每个应用程序只需要一个路由,以及所有的react 路由组件(100, 101, etc)和挂钩(102, etc).

  1. MainMenu中go 掉HashRouter.
  2. MainMenu号公路移到HashRouter号主干道.
import React from 'react';
import { Nav, Container } from 'react-bootstrap';
import { Link } from 'react-router-dom';

...

export class MainMenu extends React.Component<MainMenuProperties>{
  state: MainMenuState;

  constructor(props: Readonly<MainMenuProperties>) {  
    super(props);
    this.state = {
      items: props.items,
    };
  }

  public setItems(items: MainMenuItem[]) {
    this.setState({
      items,
    });
  }

  render() {
    return (
      <Container>
        {this.state.items.map(this.makeNewLink)}
      </Container>
    );
  }

  private makeNewLink(item: MainMenuItem, index: number) {
    return (
      <Link key={index} to={item.link} className='nav-link'>
        {item.text}
      </Link>
    );
  }
}
const menuItems = [
  new MainMenuItem("Home", "/"),
  new MainMenuItem("Contact", "/contact"),
  new MainMenuItem("Log in", "/user/login"),
];

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);

root.render(
  <React.StrictMode>
    <HashRouter>
      <MainMenu items={menuItems} />
      <Routes>
        <Route index path='/' element={<HomePage />} />
        <Route path="/contact" element={<ContactPage />} />
        <Route path="/user/login" element={<UserLoginPage />} />
      </Routes>
    </HashRouter>
  </React.StrictMode>
);

Typescript相关问答推荐

自定义挂钩上的React useState正在忽略提供的初始状态

返回签名与其他类型正确的函数不同的函数

React-Native运行方法通过监听另一个状态来更新一个状态

我应该使用什么类型的React表单onsubmit事件?

如何将联合文字类型限制为文字类型之一

使用泛型keyof索引类型以在if-condition内类型推断

对扩展某种类型的属性子集进行操作的函数

类型,其中一条记录为字符串,其他记录为指定的

TypeScrip界面属性依赖于以前的属性-针对多种可能情况的简明解决方案

如何解决类型T不能用于索引类型{ A:typeof A; B:typeof B;. }'

为什么不能使用$EVENT接收字符串数组?

嵌套对象的类型

CDK从可选的Lambda角色属性承担角色/复合主体中没有非空断言

如何避免推断空数组

使用KeyOf和Never的循环引用

使用或属性编写无限嵌套的接口

在构建Angular 应用程序时,有没有办法通过CLI传递参数?

如何从抽象类的静态方法创建子类的实例?

基于闭包类型缩小泛型类型脚本函数的范围

可以';t使用t正确地索引对象;联合;索引类型