С react-router-redux кажется, что единственный способ получить информацию о маршрутизации — только через реквизиты. Это правильно?
Вот примерно то, что я делаю в своем приложении прямо сейчас:
<Provider store={Store}>
<Router history={history}>
<Route path="/" component={App}>
<Route path="child/:id" />
</Route>
</Router>
</Provider>
Приложение
const App = (props) =>
<div className="app">
<Header />
<Main {...props}/>
<Footer />
</div>
Главный
const Main = (props) =>
<div>
<MessageList {...props}/>
</div>
Список сообщений
let MessageList = (props) => {
const {id} = props;
// now I can use the id from the route
}
const mapStateToProps = (state, props) => {
return {
id: props.params.id
};
};
MessageList = connect(mapStateToProps)(MessageList)
Что бы я хотел сделать, так это удалить {...props} из всех моих компонентов и превратить MessageList в это:
let MessageList = (props) => {
const {id} = props;
// now I can use the id from the route
}
const mapStateToProps = (state) => {
return {
id: state.router.params.id
};
};
MessageList = connect(mapStateToProps)(MessageList)
Необходимость передавать реквизиты во всем кажется большим шагом назад по сравнению с тем, насколько чистым Redux сделал мое приложение. Итак, если передача параметров верна, мне интересно, почему это предпочтительнее?
Мой конкретный случай, который привел к этому:
У меня есть компонент UserInput, который отправляет сообщение (отправляет действие SEND_MESSAGE). В зависимости от текущей страницы (комната чата, лента сообщений, отдельное сообщение и т. д.) редьюсер должен поместить ее в нужное место. Но с помощью react-redux-router редуктор не знает о маршруте, поэтому он не может знать, куда отправить сообщение.
Чтобы исправить это, мне нужно передать реквизиты, прикрепить идентификатор к моему действию SEND_MESSAGE, и теперь простой в остальном пользовательский ввод обрабатывает бизнес-логику для моего приложения.