javascript - 多个模式听同一个按键,我如何处理优先级?
问题描述
我试图找出问题背后的逻辑,我希望有人对如何解决这个问题有任何建议。
该应用程序是使用 React 构建的。
这是我的申请流程:
- 使用点击某物
- 弹出一个模态框,需要填写一个表单
- 填写表格后,用户单击“提交”按钮
- 在第一个模态的顶部弹出一个确认模态
出于可访问性和可用性的原因,我希望我的两个模态都监听ESC按键,以便可以轻松地从键盘上取消它们。我已经实现了这个并且它有效,但它不是很好。
我通过useEffect
在渲染组件时调用一个来做到这一点:
useEffect(() => {
const handler = (e: KeyboardEvent) => {
if (e.isComposing || e.keyCode === 27) {
// close modal
}
};
document.addEventListener('keydown', handler);
return () => {
document.removeEventListener('keydown', handler);
};
}, []);
我面临的问题是,如果两个模态都打开并被ESC按下,两个模态都会关闭。
您将如何设置首先关闭的模式的优先级?我考虑过有一个全局模态对象,我可以在其中检查哪个模态是最新添加的,但这似乎不必要地复杂。
我缺少一个简单的解决方案吗?
这是一个解释我的问题的简单图表。
解决方案
在第一个 Modal 的处理程序中检查第二个 Modal 的存在。如果它在那里,请不要关闭第一个:)
推荐阅读
- java - 如果在 finally 块中再次抛出期望,try 块中抛出的异常会发生什么?
- ios - 如何使用一个 uislider(-10 到 10)范围管理 CITemperatureAndTint 过滤器,如果为 10,我需要更改为暖色,如果为 -10,我需要更改为冷色?
- git - gitk 错误:自动释放池页面已损坏
- python - Flask socketio,如何为每个用户创建房间?
- android - 启动反应本机运行android时出现持续错误
- c# - 如何按需运行后台服务——而不是在应用程序启动或计时器上
- python - 在 Python 的滚动表中显示实时股票数据
- android - 使用 RTP 和 h264 的 Android 的 GStreamer 管道问题
- typescript - Eslint 返回 no-unused-vars
- lotus-notes - Lotusscript:将文件从电子邮件转换为 base64 以 POST 方法发送