Реакции-маршрутизатор "Не удается прочитать свойство 'push' из неопределенного"

Я совершенно новый, чтобы реагировать и реагировать маршрутизатор.

Проблема с реакцией заключается в том, что на некоторых страницах моего приложения реактив-маршрутизатор работает, а некоторые выдают ошибку вроде этого: "Невозможно прочитать свойство" push "из неопределенного".

я использую реагировать 0.14.1

Мой код маршрутизации выглядит так:

render(
<Router history={hashHistory}>
  <Route path="/" component={Loginpanel}/>
  <Route path="Index" component={Index}/>
  <Route path="Form" component={Form} />
  <Route path="Checkindex" component={Index}/>

  <Route path="Signup" component={Signup}/>
  <Route path="Admin" component={Admin}/>
  <Route path="AdminEditDetails" component={AdminEditDetails}/>
  <Route path="AdminDetails" component={AdminDetails}/>


</Router>,
document.getElementById('js-main'));

Мой компонент теперь такой:

class  App extends React.Component {

  constructor(props) {
    super(props);
    this.state= {      
      comments: AppStore.getAll();
    };
  }

  componentWillMount() {  
    var length = this.state.comments.length;
    var firstnumber = length - 4;

    if(length == 0){
      console.log("here comes");
      this.props.router.push('/');
    }
    else{
      console.log('work normally');
    }
  }

}

Кто-нибудь может мне с этим помочь? Благодарю.

7 ответов

Решение

Ваше приложение не имеет экземпляра маршрутизатора в своих реквизитах, который дает вам Cannot read property 'push' of undefined,

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

Вместо этого лучшим подходом к программной навигации является использование

import { hashHistory } from 'react-router;' ... hashHistory.push('/'); в вашем componentWillMount событие жизненного цикла.

Документы здесь

Надеюсь это поможет!

С помощью hashHistory прямо из react-router Это, конечно, вариант, но он делает юнит-тестирование немного более болезненным. История браузеров, как правило, не будет доступна в контекстных тестах, и проще смоделировать реквизит, чем глобальный API.

Рассмотрите возможность использования withRouter компонент высшего порядка, который react-router предоставить (так как v2.4.0).

import { withRouter } from 'react-router';

class App extends Component {

    (...)

}

export default withRouter(App);

Ваш App класс получатель router с помощью реквизита, и вы можете безопасно сделать this.props.router.push('/');,

Если вы используете частичный компонент и называете его как <Header /> тогда вы должны заменить его на <Header {...this.props} />

Вы можете попробовать приведенный ниже код посмотреть, если ваш router props работает или нет

componentWillMount() {

var length = this.state.comments.length;
var firstnumber = length - 4;
if(length == 0){
    console.log("here comes");
  if(this.props.router !== undefined) {
    this.props.router.push('/');
  } else {
    console.log(this.props.router);
  }
}
else{
    console.log('work normally');
}
}

также вы можете посетить их документацию, чтобы получить дополнительную информацию по ссылке ниже https://github.com/reactjs/react-router/blob/master/docs/guides/NavigatingOutsideOfComponents.md

Вы используете hashHistory. Следующий код должен работать.

import { hashHistory } from 'react-router';
hashHistory.push('/');

Корневой маршрут также должен быть определен.

<Route path="/" component={App}>

импортировать {withRouter} из "дом-маршрутизатора-реакции";this.props.history.push("/ профиль");

// В конце вашего класса вы также экспортируете

экспорт по умолчанию withRouter (имя компонента класса);

Добавьте две строчки.

import { withRouter } from "react-router-dom";
this.props.history.push("/welcomePage");
Другие вопросы по тегам