Javascript 当我把它放到上下文中时,为什么减速机挂钩会触发两次?

Javascript 当我把它放到上下文中时,为什么减速机挂钩会触发两次?,javascript,reactjs,Javascript,Reactjs,我创建了一个undo-redo组件,它在该组件中正常工作。 DEF.js的URL为。我单击“go”按钮更改网格的所有内容,我可以单击“back”逐个单元格回滚内容 当我将其导入时,它会在触发时被调度两次。 Redo.js的URL为 唯一的区别是我将undo-redo组件放在redo.js的上下文中 在Redo.js中,当我复制2个单元格内容并将其粘贴到新位置时, 在我按下Ctrl-Z键之后,它会将内容回滚两次,您可能会在控制台中看到“undo”一词显示两次。(附图显示了情况) 我曾尝试将不同的变

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

当我将其导入时,它会在触发时被调度两次。
Redo.js
的URL为

唯一的区别是我将undo-redo组件放在redo.js的上下文中

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

我曾尝试将不同的变量放入keyDown回调挂钩依赖项数组中,但没有帮助

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]);
有什么问题


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

你不能创建一个吗?好的,我需要一些时间。