javascript - 如何仅在浏览器环境中执行功能
问题描述
拜托,我是 SSR 和 Nextjs 应用程序的新手。我正在使用 useLocalStorage Hook 将用户数据保存到本地存储。一切正常,但在我的终端(节点 js)中,我得到消息窗口未定义。有没有办法将此代码包装在某种条件下,以便此功能仅在浏览器环境中执行。我不确定我是否可以使用;
if ( process.browser ) //然后执行此操作...
有人可以帮我解决这个问题吗...
这是我的本地存储 Hook,它只能在浏览器中运行,而不是在节点服务器上:
import { useState } from 'react';
export const useLocalStorage = (key, initialValue) => {
const [storedValue, setStoredValue] = useState(() => {
try {
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : initialValue;
} catch (error) {
console.log(error);
return initialValue;
}
});
const setValue = value => {
try {
let data = [];
const voteId = {};
if (window.localStorage.getItem(key) === null || window.localStorage.getItem(key) === undefined) {
voteId.reviewId = value;
data.push(voteId);
} else {
data = JSON.parse(window.localStorage.getItem(key));
voteId.reviewId = value;
data.push(voteId);
}
const valueToStore = data instanceof Function ? data(storedValue) : data;
setStoredValue(valueToStore);
window.localStorage.setItem(key, JSON.stringify(valueToStore));
} catch (error) {
console.log(error);
}
};
return [storedValue, setValue];
};
解决方案
我实际上是这样管理的:
如果(!process.browser)返回null;
我把它放在所有东西的前面,所以如果满足它返回null,否则我将执行我的函数。
推荐阅读
- angular - Angular httpClient 将响应映射到具有行为的实体
- optimization - 使用 CPLEX 检查新的变量降低成本
- r - 将不规则嵌套列表转换为数据框
- java - LibGDX 无法创建项目
- javascript - 为什么我的 Vue.component 没有在 HTML 页面上呈现?
- html - 背景图像封面在移动 Chrome 上的行为不同
- spring-integration - 网关中的 Spring Integration 错误通道
- json - 如何在 Flask 中对图片进行 jsonify
- java - 通过 Java 写入 CSV 时的日期格式不正确
- ios - tableViewCell 按钮上的线程 1 致命错误