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_铭文。