【发布时间】:2020-01-18 21:02:45
【问题描述】:
我正在设计一个钩子,仅当钩子依赖项发生变化时才获取数据。 它按预期工作,但我收到了 linter 警告:
React Hook useEffect was passed a dependency list that is not an array literal. This means we can't statically verify whether you've passed the correct dependencies.
和
React Hook useEffect has missing dependencies: 'data', 'errorHandler', 'route', and 'successHandler'. Either include them or remove the dependency array. If 'successHandler' changes too often, find the parent component that defines it and wrap that definition in useCallback.
据我所知,我不想在我的依赖项中包含所有这些变量,因为我不想在这些更改时触发此钩子,我只想在我传递的依赖项更改时触发它。
问题:
如何以符合 hooks linter 标准的方式设计useFetch() hook(如果我的设计模式不符合标准,请详细说明应该如何最好地完成)。
我的useFetch()钩子
function useFetch(
{
route,
data = {},
successHandler,
errorHandler,
},
dependencies = []) {
const [loading, setLoading] = useState(true);
useEffect(() => {
setLoading(true);
postJson({route}, data)
.then(
res => {
if(isFunction(successHandler)) successHandler(res);
},
({responseJSON: err}) => {
if(isFunction(errorHandler)) {
errorHandler(err);
} else {
notify({text: err.message || messages.saveFailed(), cssClass: 'error'});
}
}
)
.finally(() => {
setLoading(false);
});
}, dependencies);
return loading;
}
组件使用useFetch()
function MyComponent({data, selectedReviewId, setField}) {
const loading = useFetch({
route: 'foo.fetchData',
data: {crrType, clientId, programId, userId},
successHandler: d => setField([], d) // setField() will set data with the value fetched in useFetch()
}, [selectedReviewId]);
return loading ? <SpinnerComponent/> : <div>{data.foo}</div>;
}
【问题讨论】:
-
我的建议是,无论如何你有静态分配空数组给依赖变量,然后将该变量作为依赖数组提供,你应该直接提供空数组。另一个是不要破坏你的道具,你可以在 useEffect 直接使用
props.data,props.route。
标签: javascript reactjs functional-programming react-hooks