Почему URL-адреса маршрутов React не обновляются?

#reactjs #react-router-dom

Вопрос:

Когда я изменяю URL-адреса в своем App.js файле, компонент больше не отображается, поэтому, если я перейду на новый URL-адрес, я получу сообщение об ошибке, как будто страницы не существует, но если я перейду на старый URL-адрес, он загрузит навигационную панель, которая находится в родительском компоненте, но не в компоненте маршрута

App.js

 import React, { Component } from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
import "antd/dist/antd.css";

import MainPage from "./mainpage";
import Details from "./Detail";
import SignUp from "../containers/Signup";
import AddItem from "./AddItem";
import Admin from "../containers/admin";
import CustomLayout from "../containers/Layout";

class App extends Component {
  render() {
    return (
      <BrowserRouter>
        <CustomLayout {...this.props}>
          <Switch>
            <Route exact path="/" component={MainPage} />
            <Route exact path="/signup" component={SignUp} />
            <Route exact path="/Add-Item" component={AddItem} />
            <Route exact path="/admin" component={Admin} />
            <Route exact path="/post/:id" component={Details} />
          </Switch>
        </CustomLayout>
      </BrowserRouter>
    );
  }
}

export default App;
 

index.js

 const store = createStore(reducers, {}, compose(applyMiddleware(thunk)));

const app = (
  <Provider store={store}>
    <App />
  </Provider>
);
 

Комментарии:

1. Я думаю, что вам не хватает элемента переключателя

Ответ №1:

Вы пропустили тег переключателя, приведенный ниже код будет работать нормально:

  class App extends Component {
  render() {
    return (
      <BrowserRouter>
        <CustomLayout {...this.props}>
          <Switch>
            <Route exact path="/" component={mainpage} />
            <Route exact path="/signup" component={Signup} />
            <Route exact path="/Add-Item" component={AddItem} />
            <Route exact path="/admin" component={admin} />
            <Route exact path="/post/:id" component={Details} />
          </Switch >
        </CustomLayout>
      </BrowserRouter>
    );
  }
}
 

Комментарии:

1. попробовал с выключателем, не получилось

Ответ №2:

Добавьте компонент коммутатора, как все предлагают, чтобы компоненты, которые вы монтируете на маршрут, были названы и импортированы в случае Pascal(например, на главной странице). Если это не работает, можете ли вы вставить дамп кода App.js досье? (включая импорт)

Обновление после проверки кода: Я изменил один URL-адрес маршрута, чтобы воспроизвести проблему, «/регистрация» на «/регистрация заново». Вы правы, после изменения URL-адреса, если вы посетите старый(которого больше не существует), вы просто увидите оболочку макета(которая представляет собой панель навигации и нижний колонтитул). Такое поведение понятно, поскольку не было найдено соответствующего маршрута, указывающего на этот путь, и не был указан запасной маршрут для монтирования компонента 404. это объясняет, почему компонент не отображается на старом пути. На новом URL/пути я смог отобразить назначенный ему компонент.

Изменение, которое я внес в код

Старый Путь

Новый Путь

Попробуйте перезапустить сервер react и получить доступ к новому URL-адресу, который вы изменили в app.js файл. Или, если вы изменили URL-адрес иначе, чем я, дайте мне знать.

Комментарии:

1. я отредактировал свой пост с полным App.js

2. codesandbox.io/s/stf-test-66109 Попытался воспроизвести подобную ситуацию, и это работает с моей стороны. возможно, это компоненты, которые вы передаете в маршрутах, и то, как компонент макета обрабатывает их. Было бы больше возможностей для отладки, если бы вы могли использовать платформу, такую как codesandbox, для вывода разбитого примера.

3. я загрузил весь проект на github: github.com/xunsus/E-commerce-Test

4. отредактировал мой ответ. дайте мне знать, если я сделал что-то не так при воспроизведении проблемы.

5. главная проблема в том, что я хочу изменить <Route exact path="/post/:id" component={Details} /> то, что работает только в том случае, если я делаю это вот так path="/:id" (изначально так и было). когда я пытаюсь path="/post/:id" , я получаю сообщение об ошибке

Ответ №3:

Используйте переключатель и измените браузер на маршрутизатор.

  class App extends Component {
  render() {
    return (
      <Router>
        <CustomLayout {...this.props}>
          <Switch>
            <Route exact path="/" component={mainpage} />
            <Route exact path="/signup" component={Signup} />
            <Route exact path="/Add-Item" component={AddItem} />
            <Route exact path="/admin" component={admin} />
            <Route exact path="/post/:id" component={Details} />
          </Switch >
        </CustomLayout>
      </Router>
    );
  }
}
 

Кроме того, вы можете попробовать добавить историю; история.createBrowserHistory . . . к маршрутизатору, чтобы проверить, работает ли он.

И тогда вы можете просто щелкнуть события, чтобы изменить путь, поэтому импортируйте историю: история.нажмите(‘/путь’)

Комментарии:

1. использование history.push по ссылке сработало, я действительно не знаю почему, но это так, так что спасибо.

2. без проблем. просто способ перезаписать функциональность тегов <a>.

Ответ №4:

Вот пример того, что я имею в виду в комментарии, просто добавьте переключатель, обертывающий маршруты

 <Switch>
  <Route path="/about">
    <About />
  </Route>
  <Route path="/users">
    <Users />
  </Route>
  <Route path="/">
    <Home />
  </Route>
</Switch>
 

Комментарии:

1. попробовал с выключателем, не получилось