【发布时间】:2021-01-22 11:11:53
【问题描述】:
好的,所以我正在创建这个很棒的钩子来保持过滤器状态,现在我的一些过滤器不仅包括可以保存到本地存储然后检索的简单字符串,还包括更复杂的对象,例如在许多情况下包含函数的日期,这个想法是能够存储然后从本地存储中检索这些函数。
这是钩子:
export default function usePersistedState(key, defaultValue) {
let transformedFuncs = parseWithFunc(localStorage.getItem(key))
const [state, setState] = React.useState(
() => transformedFuncs || defaultValue
);
React.useEffect(() => {
if (key){
localStorage.setItem(key, stringifyWithFunc(state));
}
}, [key, state]);
return [state, setState];
}
function stringifyWithFunc(obj) {
return JSON.stringify(obj, function(key, value) {
return typeof value === "function" ? value.toString() : value;
});
}
function parseWithFunc(json) {
return JSON.parse(json, function(key, value) {
if (isFunction(key)) {
return transformFunc(value);
} else {
return value;
}
});
}
function isFunction(key) {
switch (key){
case "toOption":
return true
case "transform":
return true
case "validate":
return true
default:
return false
}
}
function transformFunc(value) {
return eval(value);
}
现在,由于引用了here 的 JSON.stringify 的 replacer 选项,我成功地对包括函数在内的所有属性进行了字符串化,我还能够使用 reviveroption 来“恢复”我的函数JSON.parse(上面也提到过),问题是我从本地存储中返回的一些函数具有从 webpack 导入的函数(luxon 日期函数),所以我收到以下错误:
Unhandled Rejection (ReferenceError): _utils_common__WEBPACK_IMPORTED_MODULE_11__ is not defined
eval
src/Components/hooks/usePersistedState.js:46
43 | }
44 | }
45 | function transformFunc(value) {
> 46 | return eval(value);
47 | }
48 |
问题:eval 无法转换或访问_utils_common__WEBPACK_IMPORTED_MODULE_11__ 这只是应用程序中的一个简单共享功能。
我尝试过的事情:我尝试只在本地执行该函数,但仍然出现相同的错误,因为我使用了 luxon 的日期转换函数,我不能简单地自己做。
我不想做的事情:传递我的挂钩回调函数。
我正在寻找一种方法来从本地存储中对我的函数进行水化/再水化,以便我可以继续在应用程序中使用它们。
【问题讨论】:
标签: javascript json reactjs webpack react-hooks