Я создаю состояние уведомления, как это (в Redux),Очистить состояние один перевождь на переходе странице
import { STORE_NOTIF, PURGE_NOTIF } from '../actions/notif';
const defaultState = {
kind: null,
message: null
}
export default function notifReducer(state = defaultState, action) {
switch(action.type) {
case STORE_NOTIF:
return {kind: action.kind, message: action.message};
case PURGE_NOTIF:
return defaultState;
default:
return state;
}
}
это работает для событий, которых я знаю, чтобы контролировать. Но где я должен выполнить очистку (PURGE_NOTIF), когда я перехожу на страницы, скажем, от входа на домашнюю страницу? Я не хочу писать componentWillMount
(и я не думаю, что это путь записи) для каждого компонента, чтобы очистить notifState
. Должно ли это быть где-то на маршрутах? Я использую call-router BTW.
UPDATE с ответом
Мой новый редуктор выглядит так, где я добавил displayed
булево
import _ from 'lodash';
import { STORE_NOTIF, PURGE_NOTIF, DISPLAY_NOTIF } from '../actions/notif';
const defaultState = {
kind: null,
message: null,
displayed: true
}
export default function notifReducer(state = defaultState, action) {
switch(action.type) {
case STORE_NOTIF:
return _.merge({}, state, { kind: action.kind, message: action.message, displayed: action.displayImmediately });
case DISPLAY_NOTIF:
return _.merge({}, state, { displayed: true });
case PURGE_NOTIF:
return defaultState;
default:
return state;
}
}
и мой клиент, где я могу проверить, было ли это отображается уже или нет, и обращаться с соответствующим ,
const scrollTop =() => { window.scrollTo(0, 0) }
const handleNotifs = (store) => {
const notifState = store.getState().notifState;
if (notifState.message) {
if (notifState.displayed) {
store.dispatch({type: PURGE_NOTIF});
} else {
store.dispatch({type: DISPLAY_NOTIF});
}
}
}
const store = applyMiddleware(...middlewares)(createStore)(reducer, initialState);
ReactDOM.render(
<Provider store={store}>
<Router onUpdate={() => {scrollTop(); handleNotifs(store)}} routes={routes} history={browserHistory} />
</Provider>,
document.getElementById('app')
);
Да, это так. Но в нем говорится: «Uncaught ReferenceError: store не определено». Даже если у меня есть '<Магазин-провайдер = {store}>'. Как получить доступ к хранилищу? – index
Вам необходимо передать ссылку на ваш текущий файл – Florent
Нужно ли мне экспортировать магазин? От моего клиента у меня есть 'const store = applyMiddleware (... middlewares) (createStore) (редуктор, initialState);' и 'ReactDOM.render (<Магазин поставщика = {store}> окно .scrollTo (0, 0);} routes = {routes} history = {browserHistory} />, document.getElementById ('приложение')); ' –
index