【发布时间】:2022-01-05 13:27:00
【问题描述】:
我试图将应用程序从 React 移动到 Next
在 React 中,这段代码没有错误
let [authTokens, setAuthTokens] = useState(() => localStorage.getItem('authTokens') ? JSON.parse(localStorage.getItem('authTokens')) : null)
let [user, setUser] = useState(()=> localStorage.getItem('authTokens') ? jwt_decode(localStorage.getItem('authTokens')) : null)
但是当我尝试在 Next 中使用它时,我得到了错误
我假设是因为 Next 首先在服务器端渲染,而服务器端没有本地存储。
这是设置本地存储的函数。
let loginUser = async (e) => {
e.preventDefault();
let response = await fetch('http://127.0.0.1:8000/api/token/', {
method:'POST',
headers:{
'Content-Type': 'application/json'
},
body:JSON.stringify({'email':e.target.username.value, 'password':e.target.password.value})
})
let data = await response.json()
console.log(data)
console.log(data.access)
if(response.status == 200) {
setAuthTokens(data)
setUser(jwt_decode(data.access))
localStorage.setItem('authTokens', JSON.stringify(data))
router.push('/')
} else {
alert('something went wrong')
}
}
【问题讨论】:
-
你在哪里调用 loginUser 方法,是在客户端还是服务器端。
-
@RajneeshChaurasia 它的客户端,由表单上的提交按钮触发
-
问题发生在第一次渲染还是提交表单之后???
-
@devAR Next.js pre-renders every page 在服务器上,这意味着像
localStorage这样的 Web API 不可用。您必须在useEffect中移动任何仅限客户端的代码。
标签: reactjs next.js local-storage