Я использую Redux и React-router, чтобы создать простую почтовую программу. Поскольку я довольно новичок в Redux, я не совсем понимаю фактический поток данных в Redux + Router.
Что я пытаюсь получить
- После запуска страницы (
/
) MailListComponent выбирает массив сообщений с сервера. В это время MessageComponent не отображается, так как у него нет единого сообщения для извлечения данных для него. - После выбора
state.messages:[]
приложение переходит к первому сообщениюstate.messages:[]
(/messages/1
) `. - После завершения перехода отображается MessageComponent и выводит сообщение с идентификатором id = 1, а в отдельном запросе - вложения.
Здесь модель компонента:
Что я делаю
// MailListActions.js
export function loadMessages() {
return {
type: 'LOAD_MESSAGES',
promise: client => client.get('/messages')
};
}
// MailListReducer.js
import Immutable from 'immutable';
const defaultState = { messages: [], fetchingMessages: false };
export default function mailListReducer(state = defaultState, action = {}) {
switch (action.type) {
case 'LOAD_MESSAGES_REQUEST':
return state.merge({fetchingMessages: true});
case 'LOAD_MESSAGES':
return state.merge({fetchingMessages: false, messages: action.res.data || null});
case 'LOAD_MESSAGES_FAILURE':
// also do something
default:
return state;
}
}
Поскольку я использую promiseMiddleware, LOAD_MESSAGES
, LOAD_MESSAGES_REQUEST
и LOAD_MESSAGES_FAILURE
отправляются по запросу /messages
.
И теперь:
- Можно ли отправить
loadMessages()
в componentDidMount из MailListComponent? - Как его правильно перевести на
/messages/1
? - Должен ли я создать
activeMessageId<Integer>
в моем состоянии? - Как все эти компоненты должны быть связаны с React-Router?
Здесь мои текущие попытки:
export default (store) => {
const loadAuth = (nextState, replaceState, next) => { ... };
return (
<Route name="app" component={App} path="/" onEnter={loadAuth}>
<IndexRoute component={Content}/> // <== THIS IS A DUMMY COMPONENT. It diplays pre-loader until the app is transitioned to real first message
<Route path="messages/:id" component={Message}/>
</Route>
);
};
Не могли бы вы дать мне несколько моментов, как подключить точки? Что такое логика потока данных асинхронного ввода?
Я использую isomorphic-redux пример в качестве базы для своего приложения. Хотя изоморфно, это не должно быть слишком большой разницей между обычным приложением Redux
Спасибо.
UPDATE
Одна из идей - установить onEnter hook для <IndexRoute component={Content}/>
, который будет извлекать сообщения, переходить в состояние и начальный переход. Это путь redux + router?
Однако этот способ также может быть довольно сложным, потому что /messages
работает только для аутентифицированных пользователей (где store.getState().auth.get('loaded') == true
)