Ton*_*ndi 9 javascript node.js reactjs next.js
我在 reactjs 中制作系统 jsonwebtoken 并使用 nextjs。当我在未定义 localStorage 的浏览器中运行代码时,我发现问题。
这是我在文件 AuthStudentContext.js 中的代码
import React from 'react'
import axios from 'axios'
const axiosReq = axios.create()
const AuthStudentContext = React.createContext()
export class AuthStudentContextProvider extends React.Component {
constructor() {
super()
this.state = {
students: [],
student: localStorage.getItem('student') || {},
token: localStorage.getItem('token') || "",
isLoggedIn: (localStorage.getItem('student' == null)) ? false : true
}
}
login = (credentials) => {
return axiosReq.post("http://localhost:4000/api/login", credentials)
.then(response => {
const { token } = response.data
localStorage.setItem("token", token)
this.setState({
token,
isLoggedIn: true
})
return console.log(response)
})
}
Run Code Online (Sandbox Code Playgroud)
并显示错误 localStorage 未定义
wen*_*jun 10
在 constructor 还有componentWillMount生命周期挂钩,服务器仍呈现组件。另一方面,localStorage作为浏览器 Window 全局的一部分存在,因此您只能在呈现组件时使用它。因此,您只能在componentDidMount生命周期挂钩上访问 localStorage 。您可以定义一个空状态,并componentDidMount在可以开始调用 localStorage 时更新状态,而不是在构造函数上调用 localStorage。
constructor() {
super()
this.state = {
students: [],
student: undefined
token: undefined,
isLoggedIn: undefined
};
}
componentDidMount() {
this.login();
this.setState({
student: localStorage.getItem('student') || {},
token: localStorage.getItem('token') || "",
isLoggedIn: (localStorage.getItem('student' == null)) ? false : true
});
}
Run Code Online (Sandbox Code Playgroud)
正如大家已经提到的,NextJS 在客户端和服务器上运行。在服务器上,没有localStorage,因此出现undefined错误。
但是,另一种解决方案是在访问localStorage. IE
const ISSERVER = typeof window === "undefined";
if(!ISSERVER) {
// Access localStorage
...localStorage.get...
}
Run Code Online (Sandbox Code Playgroud)
我从未接触过 nextjs,但我猜它相当于 Nuxt.js。因此,当您尝试在客户端访问 localstorage 时,它会进行服务器端渲染。
您将需要为此使用componentDidMount()。这里有一个例子
componentDidMount(){
localStorage.setItem('myCat', 'Tom');
alert("Tom is in the localStorage");
}
Run Code Online (Sandbox Code Playgroud)
编辑:
否则你可以尝试 process.browser
if (process.browser) {
localStorage.setItem("token", token);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
除了SILENT 所说的之外,这对我有用:
React.useEffect(() => {
if (localStorage) {
const getLocalState = localStorage.getItem("headless");
console.log("LocalState: ", getLocalState)
}
}, []);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23928 次 |
| 最近记录: |