@RomanSS

React-router и history.pushState не уверен в правильности использовании, можно ли так делать?

Использую React, React-router и Redux.

Суть вопроса: на сайте есть несколько страниц на которых можно включать всплывающие окна. Всплывающие окна это такие же страницы (они имеют свою ссылку), но отображаются поверх страницы.

При открытии такого окна, я меняю ссылку в браузере, но меняю не с помощью react-router, а стандартным методом в js history.pushState. Это сделано было для того, чтобы реакт роутер не словил изменение адреса и на странице не заменились компоненты согласно новому урлу.

Код работает, всё отлично, но задался вопросом правильно ли так делать? Подскажите, правильно ли я понимаю, что реакт-роутер не должен отлавливать такое изменение урла и это нормальное для него поведение?
  • Вопрос задан
  • 4694 просмотра
Пригласить эксперта
Ответы на вопрос 3
dpigo
@dpigo
Front-end developer
Используя какую-то архитектуру делать что-то в обход её это костыли. Либо архитектуру надо менять, либо код.

Посмотрите как вопрос с модалами решен тут: stackoverflow.com/questions/28795085/react-router-...
Ответ написан
@Aves
Всё же правильнее при использовании react-router управлять адресной строкой только через него без хаков и костылей. Например, можно сделать как-нибудь так:
const App = props => (
  <div>
    <Link to='/'><h1>App</h1></Link>
    <Link to='/news'> News </Link>
    <Link to='/about'> About </Link>
    {props.children}
  </div>
);

const Modal = props => (
  <div>
    <h3>Modal</h3>
    <p>{props.data}</p>
    <button onClick={props.onClick}>close</button>
  </div>
);

const withModal = Component => props => (
  <div>
    <Component {...props} />
    {props.params.id != undefined && <Modal data={props.params.id} onClick={() => {
      props.router.goBack();
    }}/>}
  </div>
);

const News = withModal(props => (
  <div>
    <h2>News</h2>
    <Link to='/news/1'>modal</Link>
    {props.children}
  </div>
));

const About = withModal(props => (
  <div>
    <h2>About</h2>
    <Link to={{pathname: '/news/1', state: 'about'}}>modal</Link>
    {props.children}
  </div>
));

const modalStates = {
  'about': About
};

ReactDOM.render(
  <Router history={browserHistory}>
    <Route path='/' component={App}>
      <Route path='news' component={News} />
      <Route path='about' component={About} />
      <Route path='news/:id' getComponent={(nextState, cb) => {
        let Component = News;
        const {state} = nextState.location;
        if (state && state in modalStates) Component = modalStates[state];
        cb(null, Component);
      }} />
    </Route>
  </Router>,
  document.body
);
Ответ написан
@AnjeyTsibylskij
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы