useReducer
имеет возможность выполнять ленивую инициализацию через третий аргумент. Возможно, вы можете отправить действие в своем компоненте, когда доступно окно, например, в componentDidMount () или с хуками внутри useEffect()
:
// set initial state, can also pass values here from dispatch also
// This would be called when `window` is available
function init() {
return {
'about': window.location.pathname == 'about' ? true : false
};
}
// ...
// Some initial state
const initialState = { about: false };
// ..
useReducer(Reducer, initialState, init); // pass third argument, the init function
Затем обновите свой редуктор, чтобы использовать init :
function reducer(state, action) {
switch (action.type) {
// ...
case 'init':
return init(); // execute init function
}
}
Наконец, активируйте этот новый тип действия из вашего компонента, используя что-то вроде ловушки useEffect:
// Assuming you are using context to get store state/dispatch
const [state, dispatch] = useContext(MyContext);
useEffect(() => {
dispatch({ type: 'init' }); // could pass window values here also via payload perhaps
}, []);
Надеюсь, это поможет!