首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我把reducer钩子放到上下文中时,它会触发两次?

为什么当我把reducer钩子放到上下文中时,它会触发两次?
EN

Stack Overflow用户
提问于 2021-05-02 17:56:52
回答 1查看 28关注 0票数 0

我创建了一个undo-redo组件,它在DEF.js组件中工作正常。DEF.js的网址为here。我单击“go”按钮更改网格的所有内容,我可以单击" back“逐个单元格回滚内容。

当我将它导入到Redo.js中时,当它被触发时,它被调度两次。Redo.js的网址为here

唯一的区别是我将撤销-重做组件放在了Redo.js的上下文中。

在Redo.js中,当我复制两个单元格内容,然后将其粘贴到新位置时,在按下Ctrl-Z之后,它会将内容回滚两次,您可能会在控制台中看到两次"undo“字样。(附图显示情况)

我尝试将不同的变量放入keyDown callBack钩子依赖数组中,但没有帮助。

代码语言:javascript
复制
let keyDown=useCallback((e)=>{
    console.log("keyDown");
    if (e.ctrlKey){
        //console.log(e.which);
        switch (e.which){
            case 89:
                //console.log("redo:"+JSON.stringify(rosterList));
                console.log("RedoBody.redo="+rosterList.canRedo);
                if (rosterList.canRedo){
                    e.preventDefault();
                    rosterList.redo();
                    props.updateContextValue({type:"updateShiftValue"});
                }
                break;
            case 90:
                e.preventDefault();
                console.log("RedoBody.undo="+rosterList.canUndo);
                if (rosterList.canUndo){
                    rosterList.undo();
                    props.updateContextValue({type:"updateShiftValue"});
                }
                break;
            default:break;    
        }
    } else {
        switch (e.which){
            case 27://handle "Esc" key event
                selectedRegionUtil.clearCopiedRegion();
                break;
            case 37://handle left arrow key event
                selectedRegionUtil.selectNextCell(e,-1,0);
                break;
            case 38://handle up arrow key event
                selectedRegionUtil.selectNextCell(e,0,-1);
                break;
            case 39://handle right arrow key event
                selectedRegionUtil.selectNextCell(e,1,0);
                break;          
            case 40://handle down arrow key event
                selectedRegionUtil.selectNextCell(e,0,1);
                break;    
            default:break;                 
        }
        props.updateContextValue({type:'updateSelectedRegion',value:selectedRegionUtil});
    }    
},[props,rosterList,selectedRegionUtil]);

有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-04 15:05:54

最后,我将自定义钩子useUndoUtil转换为一个普通的javascript对象UndoableData,它可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67355016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档