Javascript 如何停止无限循环?
这是我的组件:Javascript 如何停止无限循环?,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,这是我的组件: const Inscriptions = () => { // get state const { inscriptions, loading } = useSelector( state => state.user ); // flag const instances = Object.keys(inscriptions).length; // dispatch const dispatch = useD
const Inscriptions = () => {
// get state
const { inscriptions, loading } = useSelector( state => state.user );
// flag
const instances = Object.keys(inscriptions).length;
// dispatch
const dispatch = useDispatch();
const getInscriptions = useCallback(
() => dispatch( getInscriptionsAction() ),
[ dispatch ]
);
const cancel = id => dispatch( cancelInscriptionAction(id) );
const cancelAll = () => dispatch( cancelAllInscriptionAction() );
useEffect( () => {
const queryToApi = () => {
getInscriptions();
};
queryToApi();
}, [ getInscriptions ]);
if(loading) return null;
// delete item
const handleClickCancel = id => {...};
const handleClickCancelAll = () => {...};
return ( ... );
}
export default Inscriptions;
这是减速器:
case GET_USER_INSCRIPTIONS:
return {
...state,
error: false,
loading: true
};
case GET_USER_INSCRIPTIONS_SUCCESS:
return {
...state,
error: false,
loading: false,
inscriptions: action.payload
};
case GET_USER_INSCRIPTIONS_FAIL:
return {
...state,
error: true,
loading: false,
inscriptions: []
};
我的问题是,我有另一个具有相同逻辑的组件,但这个组件进入无限循环。查找我的Redux开发工具,我看到它perma调用“GET_USER_Dirthings”操作,我不知道为什么它不调用一次,就像我错过了后台发生的事情一样,但是对于其他没有发生的组件,它加载,一旦加载为false(当成功操作完成时),它加载
我尝试过一种解决方案,在减速器中添加一个标志布尔,如下所示:
case GET_USER_INSCRIPTIONS:
return {
...state,
error: false,
loading: true,
flag: false
};
case GET_USER_INSCRIPTIONS_SUCCESS:
return {
...state,
error: false,
loading: false,
flag: true,
inscriptions: action.payload
};
case GET_USER_INSCRIPTIONS_FAIL:
return {
...state,
error: true,
loading: false,
flag: true,
inscriptions: []
};
然后改变我的使用效果:
useEffect( () => {
if(!loading && !flag) {
const queryToApi = () => {
getInscriptions();
};
queryToApi();
}
}, [ getInscriptions, loading, flag ]);
if(loading) return null;
而且工作得很完美,但我仍然不明白为什么我必须在这个组件中执行此操作,而另一个组件在没有此功能的情况下执行得很好。如果有人能看一看并告诉我,我真的很感谢你。每次你调用GET\u USER\u Creditions\u SUCCESS action时,你都会更改连接到组件的状态,它会再次调用useEffect,因为依赖项发生了变化 修理
useffect(()=>{
如果(!加载&&!标志){
常量queryToApi=()=>{
获取铭文();
};
queryToApi();
}
},[题词];
好的,我解决了它,问题是我有其他与铭文无关的动作,共享同一个减速器,所以这就是干扰。我已经创建了一个专用的减速机来管理我的铭文组件。似乎这就是redux告诉您模块化您的东西的方式。如果您去掉代码中与问题无关的部分,您可以让回答者更轻松。例如这里不需要大部分HTML部分。看起来,甚至分派也在更改,因此useCallback无法停止重新提交--const getnothints=useCallback(()=>dispatch(getnothindsaction()),[dispatch])@你说得对,Sry,要做个编辑,去掉不必要的data@Zen_Web我真的不这么认为,因为我在另一个组件中有一个类似的回调,但工作得非常完美。问题是,在我的Redux开发工具中,我多次调用GET_USER_Literations,最终获得GET_USER_Literations_SUCCESS,但在那之后,它仍然调用GET_USER_铭文。