Ответ 1
Хороший вопрос. Мне нравится иметь часть моего магазина. Редуктор, для которого может выглядеть так:const initialState = {
screenWidth: typeof window === 'object' ? window.innerWidth : null
};
function uiReducer(state = initialState, action) {
switch (action.type) {
case SCREEN_RESIZE:
return Object.assign({}, state, {
screenWidth: action.screenWidth
});
}
return state;
}
Действие, для которого довольно шаблонный. (SCREEN_RESIZE
является постоянной строкой.)
function screenResize(width) {
return {
type: SCREEN_RESIZE,
screenWidth: width
};
}
Наконец, вы подключаете его вместе с прослушивателем событий. Я бы поставил следующий код в том месте, где вы инициализируете свою переменную store
.
window.addEventListener('resize', () => {
store.dispatch(screenResize(window.innerWidth));
});
Запросы мультимедиа
Если ваше приложение принимает более двоичный вид размера экрана (например, большой/маленький), вы можете вместо этого использовать медиа-запрос. например.
const mediaQuery = window.matchMedia('(min-width: 650px)');
if (mediaQuery.matches) {
store.dispatch(setLargeScreen());
} else {
store.dispatch(setSmallScreen());
}
mediaQuery.addListener((mq) => {
if (mq.matches) {
store.dispatch(setLargeScreen());
} else {
store.dispatch(setSmallScreen());
}
});
(на этот раз я оставлю код действия и редуктора. Это довольно очевидно, как они выглядят.)
Один из недостатков этого подхода заключается в том, что хранилище может быть инициализировано с неправильным значением, и мы полагаемся на запрос СМИ, чтобы установить правильное значение после того, как хранилище было инициализировано. Я не знаю, как это сделать. Обратная связь приветствуется.
UPDATE
Теперь, когда я думаю об этом, вы можете обойти это, сделав что-то вроде следующего. (Но будьте осторожны, я не проверял это.)
const mediaQuery = window.matchMedia('(min-width: 650px)');
const store = createStore(reducer, {
ui: {
largeScreen: mediaQuery.matches
}
});
mediaQuery.addListener((mq) => {
if (mq.matches) {
store.dispatch(setLargeScreen());
} else {
store.dispatch(setSmallScreen());
}
});
ОБНОВЛЕНИЕ II: Недостаток этого последнего подхода заключается в том, что объект ui
заменит целое состояние ui
не только поле largeScreen
. Независимо от того, что происходит из исходного состояния ui
, теряется.