我正在编写一个自定义useAxios
钩子。我希望axios
请求配置对象位于我的useEffect
的依赖项数组中。但是,该对象包含数组中的函数。我正在尝试找到一种方法来字符串化axios
请求配置对象,以便useEffect
可以正确区分它。
尝试将JSON.stringify
与自定义替换器一起使用,但toString()
方法过于文字化并保持边距间距,因此两个看似相同的函数将因间距而被评估为唯一。
这是我对自定义替代品的JSON.stringify
:
JSON.stringify(param1, (key, value) => {
if (Array.isArray(value)) {
return value.map(func => func.toString());
}
});
我正在寻找无论间距如何,这两个对象都被评估为相等:
1.
{
url: 'https://reqres.in/api/things/1',
responseType: 'json',
transformResponse: [
function test(param) {
return param;
},
],
}
阿拉伯数字。
{
url: 'https://reqres.in/api/things/1',
responseType: 'json',
transformResponse: [
function test(param) {
return param;
},
],
}
并将这两个对象评估为唯一对象:
1.
{
url: 'https://reqres.in/api/things/1',
responseType: 'json',
transformResponse: [
function test(param) {
return param;
},
],
}
阿拉伯数字。
{
url: 'https://reqres.in/api/things/1',
responseType: 'json',
transformResponse: [
function test2(param) {
return param;
},
],
}
正如建议的那样 https://github.com/facebook/react/issues/14476 您可以使用useRef
来保存以前的配置并将compare(prevConfig, config)
用作依赖项:
function useAxios(config) {
const [prevConfig] = useRef(null);
useEffect(() => {
...
prevConfig.current = config;
}, [isDeepEqual(config, prevConfig)]);
}
isDeepEqual
可能是自定义比较器或只是从下划线/lodash 帮助。