import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import Actions from '../actions';
export const UserComponent = ({ foo, baz, bar, user, fetchUser }) => {
useEffect(() => {
console.log('##### I WAS CALLED I WAS CALLED');
fetchUser();
}, []);
return (
<div>
<p>{user.name}</p>
<p>{foo} {baz} {bar}</p>
</div>
);
};
UserComponent.propTypes = {
fetchUser: PropTypes.func.isRequired,
user: PropTypes.shape({}),
};
const mapActionsToProps = {
fetchUser: Actions.fetchUser,
};
const mapStateToProps = ({ data }) => ({
user: data.user,
});
export default connect(mapStateToProps, mapActionsToProps)(UserComponent);
我收到一个错误消息'React Hook useEffect缺少依赖项'
但是如果我将fetchUser
放在依赖项数组中
useEffect(() => {
console.log('##### I WAS CALLED I WAS CALLED');
fetchUser();
}, [fetchUser]);
它会导致无限循环。
答案 0 :(得分:0)
我在基于钩子的组件中错误地使用了redux。本指南对使用钩子在功能组件中使用redux
起到了很大的帮助。 https://react-redux.js.org/next/api/hooks
答案 1 :(得分:0)
问题在于函数fetchUser在每个渲染中都会更改。 您可以使用“ useCallback”解决问题。
示例:
const initFetchMethod = useCallback(() => {
return dispatch(fetchUserAction())
}, [dispatch])
useEffect(() => {
initFetchMethod();
}, [initFetchMethod]);
参考文献:
答案 2 :(得分:-1)
如果fetchUser
操作在应用程序生命周期中未更改,请禁用es-lint警告
由于fetchUser是一个redux操作,并且不会在您的应用程序生命周期中发生变化,所以我想说您可以放心地为您的案例禁用规则。
useEffect(() => {
console.log('##### I WAS CALLED I WAS CALLED');
fetchUser();
//eslint-disable-next-line import/no-extraneous-dependencies
}, []);
答案 3 :(得分:-1)
错误提示,您需要将效果回调使用的所有资源(变量/函数)放入依赖项数组中。
因此,您需要将fetchUsers放入依赖关系数组中。 但是,它将导致无限循环。因为,每次都会重新创建fetchUsers实例。
您需要维护api响应的加载状态。 然后,按如下所示在回调中进行检查:
useEffect(() => {
if(!user && !loading ) {
fetchUser();
}
}, [fetchUser, user]);