如何在下一个 js 中使用本地或会话存储
How to use local or session storages in next js
当我从我的 ssr 应用程序收到响应时,我试图将项目设置为会话存储,但它显示未定义会话存储的错误,因为在服务器端没有这样的存储,只有 cookie但我不需要那个。
所以我的问题是如何在 NextJS 中从 getInitialProps 将项目设置为 sessionsStorage
调用getInitialProps
时不能将项目设置为sessionsStorage
,因为getInitialProps
在服务器端运行。
调用window
对象的方法时,可以先判断window
对象是否未定义
如果你使用钩子:
useEffect(() => {
if (window) {
// set props data to session storage or local storage
}
}, []);
getInitialProps
将在客户端或服务器端执行。因此,您需要在服务器端阻止访问 sessionStorage
。
Page.getInitialProps = async (context) => {
if (typeof window !== 'undefined') {
window.sessionStorage.set('item', 'itemValue')
}
}
我为此创建了一个自定义挂钩以避免 SSR 错误。 useEffect
hook 中的代码只会在客户端执行,所以你不需要检查 window
.
hooks/useSessionStorage.js
import { useState, useEffect } from "react";
const useSessionStorage = (name) => {
const [value, setValue] = useState('')
useEffect(() => {
setValue(sessionStorage.getItem(name))
}, [])
return value
}
export default useSessionStorage
SomeComponent.js
import useSessionStorage from '../hooks/useSessionStorage'
const SomeComponent = () => {
const zipCode = useSessionStorage('zipCode')
return (
<input value={zipCode} />
)
}
当我从我的 ssr 应用程序收到响应时,我试图将项目设置为会话存储,但它显示未定义会话存储的错误,因为在服务器端没有这样的存储,只有 cookie但我不需要那个。
所以我的问题是如何在 NextJS 中从 getInitialProps 将项目设置为 sessionsStorage
调用getInitialProps
时不能将项目设置为sessionsStorage
,因为getInitialProps
在服务器端运行。
调用window
对象的方法时,可以先判断window
对象是否未定义
如果你使用钩子:
useEffect(() => {
if (window) {
// set props data to session storage or local storage
}
}, []);
getInitialProps
将在客户端或服务器端执行。因此,您需要在服务器端阻止访问 sessionStorage
。
Page.getInitialProps = async (context) => {
if (typeof window !== 'undefined') {
window.sessionStorage.set('item', 'itemValue')
}
}
我为此创建了一个自定义挂钩以避免 SSR 错误。 useEffect
hook 中的代码只会在客户端执行,所以你不需要检查 window
.
hooks/useSessionStorage.js
import { useState, useEffect } from "react";
const useSessionStorage = (name) => {
const [value, setValue] = useState('')
useEffect(() => {
setValue(sessionStorage.getItem(name))
}, [])
return value
}
export default useSessionStorage
SomeComponent.js
import useSessionStorage from '../hooks/useSessionStorage'
const SomeComponent = () => {
const zipCode = useSessionStorage('zipCode')
return (
<input value={zipCode} />
)
}