ReferenceError: localStorage 没有在 JavaScript 中定义
ReferenceError: localStorage is not defined in JavaScript
出现“ReferenceError: localStorage is not defined”的原因有多种:
localStorage
在 Node.js 中使用。localStorage
在服务器上使用(例如 Next.js 中的服务器端渲染)。- 全局变量拼写错误
localStorage
(应该是驼峰式)。
ReferenceError: localStorage is not defined
localStorage
属性是对象的一个
属性window
,因此它在服务器上不可用。
console.log(localStorage === window.localStorage); // 👉️ true localStorage.setItem('name', 'Tom'); console.log(localStorage.getItem('name')); // 👉️ "Tom"
localStorage
如果你使用 React.js 或 Next.js 并且你需要检查你是在浏览器上(可以使用localStorage
)还是在服务器上(不能使用localStorage
),请检查window
变量是否为 not undefined
。
if (typeof window !== 'undefined') { console.log('You are on the browser') // 👉️ can use localStorage here localStorage.setItem('name', 'Tom'); console.log(localStorage.getItem('name')); // 👉️ "Tom" } else { console.log('You are on the server') // 👉️ can't use localStorage }
window
变量是否没有. 如果定义了变量,我们就可以在浏览器上使用API。 undefined
window
localStorage
if
只有当我们处于浏览器环境中并且window
对象已定义时,该块才会运行。
localStorage
如果您使用 React.js,您还可以在useEffect
钩子或事件处理程序中使用。
import {useEffect} from 'react'; export default function App() { useEffect(() => { console.log(localStorage.getItem('counter')); }, []); return ( <div> <h2>hello world</h2> <button onClick={() => { localStorage.setItem('counter', 100); }} > Increment counter </button> </div> ); }
该useEffect()
钩子仅在浏览器上运行,从不在服务器上运行。
我们还在localStorage.setItem()
事件处理程序中使用了该方法,这也是允许的。
最常用的localStorage
方法是
setItem()
和
getItem()。
// 👇️ adds the key and value to the localStorage object localStorage.setItem('key', 'value') // 👇️ returns the value of the specified key or null if the key doesn't exist localStorage.getItem('key')
ReferenceError: localStorage 未在 Next.js 中定义
“ ReferenceError : localStorage is not defined”经常出现在 Next.js 应用程序中,当您尝试在localStorage
浏览器呈现之前访问它时。
这可能在 React.js 组件的主体中。
import {useState} from 'react'; export default function App() { // ⛔️ this would run before the browser is ready (BAD) const [name, setName] = useState(localstorage.getItem('name')) return ( <div> <h2>hello world</h2> </div> ); }
您可以将null
初始值作为初始值传递给挂钩并在您的挂钩中useState
访问
。localStorage
useEffect
该useEffect
钩子在 React 在浏览器环境中渲染您的组件后运行,因此您可以安全地localStorage
使用useEffect
.
import {useEffect} from 'react'; export default function App() { useEffect(() => { console.log(localStorage.getItem('counter')); }, []); return ( <div> <h2>hello world</h2> <button onClick={() => { localStorage.setItem('counter', 100); }} > Set counter </button> </div> ); }
如果这不起作用,则必须使用if
语句来检查您是在浏览器(可以使用localStorage
)还是服务器(不能使用localStorage
)上。
if (typeof window !== 'undefined') { console.log('You are on the browser') // 👉️ can use localStorage here localStorage.setItem('name', 'Tom'); console.log(localStorage.getItem('name')); // 👉️ "Tom" } else { console.log('You are on the server') // 👉️ can't use localStorage }
结论
要解决“ReferenceError: localStorage is not defined”错误,请确保仅localStorage
在浏览器中使用该对象。
该localStorage
属性在对象上定义window
,在服务器上不可用,例如在 Node.js 中或在使用 Next.js 进行服务器端渲染时。