Moa*_*mer 18 local-storage reactjs next.js
我构建了一个 React,现在我尝试从 React Router dom 迁移到 Next.js。我进行了重大更改并重构了代码;(pages/routes 和 store.js)但后来我收到此错误“ReferenceError:localStorage 未定义”。
19 | const initialState = {
> 20 | access: localStorage.getItem('access'),
| ^
21 | refresh: localStorage.getItem('refresh'),
22 | isAuthenticated: null,
23 | user: null
Run Code Online (Sandbox Code Playgroud)
你能帮我解决这个问题吗?
减速器/auth.js:
import {
LOGIN_SUCCESS,
LOGIN_FAIL,
SIGNUP_SUCCESS,
SIGNUP_FAIL,
ACTIVATION_SUCCESS,
ACTIVATION_FAIL,
USER_LOADED_SUCCESS,
USER_LOADED_FAIL,
AUTHENTICATED_SUCCESS,
AUTHENTICATED_FAIL,
PASSWORD_RESET_SUCCESS,
PASSWORD_RESET_FAIL,
PASSWORD_RESET_CONFIRM_SUCCESS,
PASSWORD_RESET_CONFIRM_FAIL,
LOGOUT
} from '../actions/types';
const initialState = {
access: localStorage.getItem('access'),
refresh: localStorage.getItem('refresh'),
isAuthenticated: null,
user: null
};
export default function (state = initialState, action) {
const { type, payload } = action;
switch(type) {
case AUTHENTICATED_SUCCESS:
return {
...state,
isAuthenticated: true
}
case LOGIN_SUCCESS:
localStorage.setItem('access', payload.access);
localStorage.setItem('refresh', payload.refresh);
return {
...state,
isAuthenticated: true,
access: payload.access,
refresh: payload.refresh
}
case USER_LOADED_SUCCESS:
return {
...state,
user: payload
}
case SIGNUP_SUCCESS:
return {
...state,
isAuthenticated: false
}
case AUTHENTICATED_FAIL:
return {
...state,
isAuthenticated: false
}
case USER_LOADED_FAIL:
return {
...state,
user: null
}
case LOGIN_FAIL:
case SIGNUP_FAIL:
case LOGOUT:
localStorage.removeItem('access');
localStorage.removeItem('refresh');
return {
...state,
access: null,
refresh: null,
isAuthenticated: false,
user: null
}
case PASSWORD_RESET_SUCCESS:
case PASSWORD_RESET_FAIL:
case ACTIVATION_SUCCESS:
case ACTIVATION_FAIL:
case PASSWORD_RESET_CONFIRM_SUCCESS:
case PASSWORD_RESET_CONFIRM_FAIL:
return {
...state
}
default:
return state
}
};
Run Code Online (Sandbox Code Playgroud)
src/store.js
import { useMemo } from 'react';
import { applyMiddleware } from 'redux';
import { legacy_createStore as createStore } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import thunkMiddleware from 'redux-thunk';
import reducers from './reducers';
let store;
function initStore(initialState) {
return createStore(
reducers,
initialState,
composeWithDevTools(applyMiddleware(thunkMiddleware))
);
};
export const initializeStore = (preloadedState) => {
let _store = store ?? initStore(preloadedState);
// After navigating to a page with an initial Redux state, merge that state
// with the current state in the store, and create a new store
if (preloadedState && store) {
_store = initStore({
...store.getState(),
...preloadedState,
})
// Reset the current store
store = undefined;
}
// For SSG and SSR always create a new store
if (typeof window === 'undefined') return _store;
// Create the store once in the client
if (!store) store = _store;
return _store;
}
export function useStore(initialState) {
const store = useMemo(() => initializeStore(initialState), [initialState]);
return store;
}
Run Code Online (Sandbox Code Playgroud)
先感谢您
Jea*_*din 30
NextJs 使用服务器端渲染,那里没有定义窗口对象。要做的事情是检查窗口对象是否存在,或者最好仅在定义的地方使用它,例如在 useEffect 挂钩中,执行客户端的挂钩。
你可以这样做:
const initialState = {
access: typeof window !== "undefined" ? window.localStorage.getItem('access') : false,
refresh: typeof window !== "undefined" ? window.localStorage.getItem('refresh') : false,
isAuthenticated: null,
user: null
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32828 次 |
| 最近记录: |