Как объединить реакцию-маршрутизатор useRouterHistory с редукционным-простым-маршрутизатором

Я пытаюсь использовать react-router 2.0 с redux-simple-router, но не могу заставить его работать с разбором запросов. Вот что я получил из документов:

const appHistory = useRouterHistory({
  parseQueryString: parse,
  stringifyQueryString: stringify
})

Однако, если я передам историю на редукционно-простой маршрутизатор, как это...

syncReduxAndRouter(appHistory, store, (state) => state.router)

... Я получаю history.listen is not a function. Использование browserHistory из react-router напрямую, похоже, отлично работает с redux-simple-router. Почему listen() отсутствует в истории и как мне обойти это?


person Thijs Koerselman    schedule 11.01.2016    source источник
comment
Убедитесь, что вы используете redux-simple-router 2.x npm install redux-simple-router@next и history 2.0, если вы используете пользовательскую историю. Мне нужна была опция basename, и я заставил ее работать, установив обе из них.   -  person aarosil    schedule 23.01.2016


Ответы (1)


Документы по реактивному маршрутизатору были обновлены с тех пор, как я опубликовал это:

import { useRouterHistory } from 'react-router'
import createBrowserHistory from 'history/lib/createBrowserHistory'

const createAppHistory = useRouterHistory(createBrowserHistory)

const appHistory = createAppHistory({
  parseQueryString: parse,
  stringifyQuery: stringify
})

<Router history={appHistory}/>
person Thijs Koerselman    schedule 23.02.2016
comment
У меня сложилось впечатление, что пакет истории теперь является зависимостью от react-router, однако я не смог использовать историю хэшей из react-router/lib/hashHistory. Я получаю сообщение об ошибке «Uncaught TypeError: createHistory не является функцией» в строке 30 в react-router/lib/useBasename. Требуется ли по-прежнему устанавливать пакет истории? - person Tim Fairbrother; 26.02.2016
comment
Я думаю, что если бы пакет истории не был найден, вы бы получили другую ошибку, но, не видя кода, я не могу помочь. - person Thijs Koerselman; 27.02.2016
comment
Код такой же, как у вас, я начал с самого простого примера, который я могу. Если вы замените «history/lib/createBrowserHistory» на «act-router/lib/hashHistory», он сломается. Если я установлю свой собственный пакет истории, у меня останется 2 копии пакета истории в моей сборке. Как мне получить доступ к экземпляру истории, который использует реактивный маршрутизатор? - person Tim Fairbrother; 28.02.2016
comment
История, которую вы импортируете из react-router, является объектом (singleton). История, которую вы импортируете из history/lib, является функцией создания/фабрики. Маршрутизатор React уже создает историю перед ее экспортом. Вы можете преобразовать объект истории из react-router в функцию создания, например `const createHistoryFunction = () =› routerHashHistory`. И если у вас все еще есть проблемы, опубликуйте какой-нибудь код в сути. - person Thijs Koerselman; 28.02.2016
comment
Вы правы, говоря, что react-router уже «создает» историю до ее экспорта. Я не понимаю, откуда берется переменная/функция routerHashHistory в вашем последнем комментарии. Проблема с вашим решением заключается в том, что в моей сборке (для браузера) есть 2 копии пакета истории. Мне не нужно публиковать код, так как мой код ничем не отличается от вашего. Итак, мой вопрос: как вы создаете историю браузера/хэша/памяти/любой информации с пользовательским разбором запросов, не дублируя пакет истории? - person Tim Fairbrother; 29.02.2016
comment
Что случилось с вашей TypeError тогда? Я имел в виду routerHashHistory как одноэлементный экспорт из react-router. Обернув его в функцию создания, вы, вероятно, могли бы передать это в react-router-redux и не нужно устанавливать/ссылаться на пакет истории отдельно - person Thijs Koerselman; 29.02.2016
comment
Ошибка типа была, когда я пытался напрямую использовать экспорт react-router/lib/hashHistory. Изучив код, я не понимаю, как можно создать историю, используя пользовательские строки запроса без доступа к пакету истории. react-router/lib/hashHistory вызывает ./createRouterHistory с фабрикой history/lib/createHashHistory, ./createRouterHistory вызывает ./useRouterHistory, который вызывает history/lib/useQueries & history/lib/useBasename. Нет экспорта history/lib/useBasename или history/lib/useQueries из пакета react-router, поэтому это не представляется возможным. - person Tim Fairbrother; 01.03.2016
comment
Я думаю, что это может быть просто что-то, что было упущено при обновлении v2. Они пытались упростить начало работы для людей с меньшим пониманием пакета истории. Функция встряхивания дерева Webpack должна решить проблему. - person Tim Fairbrother; 01.03.2016
comment
Эта проблема определенно НЕ была решена в пакете react-router. У меня возникли проблемы с попыткой передать createBrowserHistory, а не createHistory в useRouterHistory, чтобы реализовать путь к базовому имени, и мой webpack bundle.js возвращает ту же ошибку TypeError: createHistory не является ошибкой функции, которую получил Тим Фэйрбратер. Разработчики react-router, похоже, игнорируют проблему. - person Peter; 11.10.2016