React router изменяет URL, но не просматривает

У меня возникли проблемы с изменением вида в ответ на маршрутизацию. Кажется, я пробовал все, что мог, без везения. Я только хочу показать список пользователей, и нажатие на каждого пользователя должно перейти на страницу сведений. Вот маршрутизатор:

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from 'react-router-dom';
import Users from "./components/Users";
import { Router, Route } from "react-router";
import Details from "./components/Details";

ReactDOM.render((
  <BrowserRouter>
    <div>
        <Route path="/" component={Users} />
        <Route path="/details" component={Details} />
    </div>
  </BrowserRouter>
), document.getElementById('app'))

Когда я использую url/details, мой браузер переходит к этому URL-адресу, но не меняет представление. Любой другой маршрут выдает 404, поэтому он, похоже, распознает маршрут, но не обновляет его.

Ответы

Ответ 1

Вам нужно указать exact атрибут для вашего indexRoute, иначе для четного /details маршрута он все равно будет совпадать с /. Также попробуйте импортировать Route из react-router-dom

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Route } from 'react-router-dom';
import Users from "./components/Users";

import Details from "./components/Details";

ReactDOM.render((
  <BrowserRouter>
    <div>
        <Route exact path="/" component={Users} />
        <Route path="/details" component={Details} />
    </div>
  </BrowserRouter>
), document.getElementById('app'))

ОБНОВИТЬ:

Еще одна вещь, которую вам нужно сделать, это присоединить ваш компонент Users с помощью withRouter. Вы должны использовать withRouter только тогда, когда ваш компонент не получает Router props,

Это может произойти в случаях, когда ваш компонент является вложенным дочерним элементом компонента, отображаемого маршрутизатором, или вы не передали ему реквизиты маршрутизатора, или когда компонент вообще не связан с маршрутизатором и отображается как отдельный компонент от Маршруты.

В Users.js добавь

import {withRouter} from 'react-router';

.........
export default withRouter(Users)

DOCS

Ответ 2

Вам просто нужно обернуть компоненты внутри с помощью Router.

<Route exact path = "/mypath" component = { withRouter (MyComponent)}/>

Вот пример файла App.js:

...
import { BrowserRouter as Router, Route, Switch, withRouter } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";

class App extends Component {
  render() {
    return (
      <Router>
        <Switch>
          <Route exact path="/" component={withRouter(Home)} />
          <Route exact path="/profile" component={withRouter(Profile)} />
        </Switch>
      </Router>
    );
  }
}

export default App;

ИЛИ ЖЕ

Вы также можете перенести компонент в withRouter перед экспортом, но тогда вы должны обеспечить несколько других вещей.

export default withRouter(Profile)

Ответ 3

При использовании Redux у меня были аналогичные проблемы, когда URL-адрес обновлялся в адресной строке, но приложение не загружало соответствующий компонент. Я смог решить, добавив withRouter к экспорту:

import { connect } from 'react-redux'
import { withRouter } from 'react-router-dom'

export default withRouter(connect(mapStateToProps)(MyComponentName))

Ответ 4

Вам нужно добавить точный указательный маршрут и вместо того, чтобы включать эти компоненты Route в div, используйте Switch from response-router-dom для переключения между маршрутами.

import React from "react";
import ReactDOM from "react-dom";
import { Route, Switch } from 'react-router-dom';
import Users from "./components/Users";

import Details from "./components/Details";

ReactDOM.render((
  <div>
    <Switch>
        <Route path="/" component={Users} exact/>
        <Route path="/details" component={Details} />
    </Switch>
  </div>
), document.getElementById('app'))

Ответ 5

Вы должны проверить это: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md

Поэтому это определенно не " Users или " Details, потому что они напрямую отображаются в <Route>, и location будет передано в props.

Мне интересно, зачем вам <div> между <BrowserRouter> и <Route>? Удалите это и сообщите мне, если это сработает.

Ответ 6

У меня была аналогичная проблема с React Router версии 4:

Нажимая на компонент <Link/>, URL-адрес изменится, но нет.

Один из мнений заключался в использовании PureComponent а не Component (импортированного из react), и это было причиной.

Заменив все компоненты, обработанные маршрутом, которые использовали PureComponent для Component, моя проблема была решена.

(Источник разрешения: https://github.com/ReactTraining/react-router/issues/4975#issuecomment-355393785)

Ответ 7

Я тоже встретил проблему.

https://github.com/chengjianhua/templated-operating-system

И я пробовал решения, сделанные Шубхамом Хатри, но это не работает.


Я решил эту проблему, может быть, может вам помочь.

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md

Согласно указанной выше направляющей документа, при использовании PureComponent или использовать инструменты государственного управления, как redux, mobx... Он может блокировать обновление маршрута. Проверьте свой компонент маршрута, убедитесь, что вы не заблокировали повтор вашего компонента.

Ответ 8

Попробуй это,

import React from "react";

import ReactDOM from "react-dom";
import Users from "./components/Users";
import { Router, Route } from "react-router";


import Details from "./components/Details";

ReactDOM.render((
  <Router>
        <Route path="/" component={Wrapper} >
            <IndexRoute component={Users} />
            <Route path="/details" component={Details} />
        </Route>
  </Router>
), document.getElementById('app'))

Ответ 9

Hmm нет никакого переключателя, чтобы фактически переключать представления.

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

//index.jsx    
ReactDOM.render( (<BrowserRouter><App/></BrowserRouter>), document.getElementById('root') );


//App.jsx
render()
{
    return <div>
        <Switch>
            <Route exact path='/' component={Lander}/>
            <Route path='/vadatajs' component={Vadatajs}/>
        </Switch>
    </div>
}

https://jsfiddle.net/Martins_Abilevs/4jko7arp/11/

ups, я нашел, что вы используете другой маршрутизатор. Может быть, эта скрипка будет для вас полезной

https://fiddle.jshell.net/terda12/mana88Lm/

возможно, ключ решения скрыт в строке для основной функции рендеринга.

Router.run(routes, function(Handler) {
    React.render(<Handler />, document.getElementById('container'));
});

Ответ 10

Я столкнулся с подобной проблемой, которую я решил, чтобы понравиться, пожалуйста, посмотрите, я надеюсь, что это работает.

Вам нужно использовать функцию componentWillReceiveProps в вашем компоненте.

Первый раз щелкнул ссылку, вызвав URL. www.example.com/content1/componentDidMount() запущен.

Теперь, когда вы нажимаете другую ссылку, говорите, что www.example.com/content2/вызывается тот же компонент, но на этот раз изменяется проп, и вы можете получить доступ к этому новому опору в componentWillReceiveProps (nextProps), который вы можете использовать для вызова API или сделать состояние пустым и получить новый. данные.

componentWillReceiveProps(nextProps){
     //call your API and update state with new props
}

Ответ 11

У меня была похожая проблема с условным макетом:

class LayoutSwitcher extends Component {
  render () {
    const isLoggedIn = this.props.isLoggedIn
    return (
      <React.Fragment>
        { isLoggedIn
          ? <MainLayout {...this.props} />
          : <Login />
        }
      </React.Fragment>
    )
  }
}

и переписал условия так:

  render () {
    const isLoggedIn = this.props.isLoggedIn
    if (isLoggedIn) {
      return <MainLayout {...this.props} />
    }
    return <Login />
  }

Это решило это. В моем случае кажется, что контекст был утерян.

Ответ 12

удалите <div> и ваша проблема будет решена