我正在编写一个Dialog组件的代码,它可以通过按键盘上的Esc键来关闭,工作正常.

我遇到的问题是,当使用多个对话框相互重叠时,当我按Esc时,它们都会关闭,而我只想逐个关闭顶部的对话框.

重点是知道对话框isOnTopisNotOnTop和阻止键盘事件.我曾try 使用props 钻孔来判断DialogB是否打开,然后是DialogA isNotOnTop,并防止关闭,但对于更复杂的组件,这种方法似乎很困难.

谁能给我一些建议,如何更好地实施我的 idea ?我是reactjs的新手,谢谢.

这个 idea 看起来是这样的:youtube

下面的代码写在codesanbox上.

Edit funny-rain-1cyn9y

推荐答案

我玩了一会儿.我用zustand.js来存储所有打开的对话框.

edit:

(回答您的 comments )

这是因为现在代码根据集合的大小判断标识符.要修复或更换此行

if (dialogs.size === identifier && event.keyCode === escapeKeyNumber) {

具有

if ([...dialogs].pop() === identifier && event.keyCode === escapeKeyNumber) {

this compares the last entry of the set 具有 the identifier instead of the size of the set.

修改sandbox

Reactjs相关问答推荐

使用setInterval判断数据的时间,然后在过期后从对象中删除;遇到性能问题

在一个blog函数中调用setState钩子

TypeError:b不是React.js中的函数错误

在Reaction常量函数中未更新状态变量

当列表中的项的顺序改变并且使用唯一键作为它们的索引时,Reaction如何看待呈现方面?

使用Ionic 7和React 18,如何访问历史对象以在页面之间导航?

useState导致对函数的无休止调用

如何垂直对齐 React Bootstrap Table 行中的项目

我无法通过 useContext 显示值

useEffect 内的 onClick 和 addEventListener 之间的 click 事件顺序差异

在 CrafterCMS Studio 中拖动字段

如何修改 react/jsx-no-useless-fragment 规则以允许 <>{children}

臭名昭著的测试未包含在 act(...) 中

React - 添加了输入数据但不显示

NextJS htaccess 设置

当从数组中删除数据时,UseEffect 不会重新渲染,仅在添加数据时才会重新渲染

在 Spring Cloud Gateway 中运行的 React SPA 页面刷新出现白标错误

不能在我的代码中使用 .给我一个警告!有人知道解决方案吗?

getAttribute 函数并不总是检索属性值

将 dict 值转换并插入到react 钩子的列表中