Javascript Eslint React Hooks错误:对于useEffect中的函数依赖项,Eslint插件React Hooks发出详尽的deps警告
Javascript Eslint React Hooks错误:对于useEffect中的函数依赖项,Eslint插件React Hooks发出详尽的deps警告,javascript,reactjs,eslint,react-hooks,Javascript,Reactjs,Eslint,React Hooks,从“React”导入React; 从“道具类型”导入道具类型; 从'react redux'导入{connect}; 从“../Actions”导入操作; export const UserComponent=({foo,baz,bar,user,fetchUser})=>{ useffect(()=>{ log(“##########我被呼叫我被呼叫”); fetchUser(); }, []); 返回( {user.name} {foo}{baz}{bar} ); }; UserCompon
从“React”导入React;
从“道具类型”导入道具类型;
从'react redux'导入{connect};
从“../Actions”导入操作;
export const UserComponent=({foo,baz,bar,user,fetchUser})=>{
useffect(()=>{
log(“##########我被呼叫我被呼叫”);
fetchUser();
}, []);
返回(
{user.name}
{foo}{baz}{bar}
);
};
UserComponent.propTypes={
fetchUser:PropTypes.func.isRequired,
用户:PropTypes.shape({}),
};
常量mapActionsToProps={
fetchUser:Actions.fetchUser,
};
常量mapStateToProps=({data})=>({
用户:data.user,
});
导出默认连接(MapStateTops、mapActionsToProps)(UserComponent)代码>如果应用程序生命周期中的fetchUser
操作未更改,则禁用es lint警告
由于fetchUser是一个redux操作,并且它不会在应用程序生命周期中改变,因此我认为您可以安全地禁用适用于您的案例的规则
useEffect(() => {
console.log('##### I WAS CALLED I WAS CALLED');
fetchUser();
//eslint-disable-next-line import/no-extraneous-dependencies
}, []);
错误是,您需要将effect回调使用的所有资源(变量/函数)放在dependencies数组中
因此,您需要将fetchUsers放入dependencies数组中。
但是,它会导致无限循环。因为每次都会重新创建fetchUsers实例
您需要维护api响应的加载状态。
并且,在回调中进行检查,如下所示:
useEffect(() => {
if(!user && !loading ) {
fetchUser();
}
}, [fetchUser, user]);
我在基于钩子的组件中使用redux的方式是错误的。本指南帮助我在使用钩子的功能组件中使用redux
问题在于函数fetchUser在每次渲染中都会更改。
您可以使用“useCallback”解决此问题
例如:
const initFetchMethod = useCallback(() => {
return dispatch(fetchUserAction())
}, [dispatch])
useEffect(() => {
initFetchMethod();
}, [initFetchMethod]);
参考资料:
您是否尝试过使用useffect(()=>{fetchUser()})完全省略依赖项数组代码>?换句话说,不要将第二个参数传递给useffect
。对不起,我更新了我的问题。我有多个道具被传递到组件&我不想每次这些道具改变时都运行useffect。我只想第一次获取用户,而不是每次API发生更改时都获取用户。使用user
作为useffect
的第二个参数怎么样,因为您只想在user
发生更改时更新。如useffect(()=>{fetchUser()},[user])代码>嗯,总是有//eslint禁用下一行反应钩子/穷举deps
如果其他人发现此问题,请将您的解决方案作为答案发布,并将其标记为解决方案,这将对他们有所帮助。