javascript - 如何将自定义回调传递给显示的自定义模态组件?
问题描述
我有一个自定义模态组件,它依赖于此处显示的方法(https://sandstorm.de/de/blog/post/reusable-modal-with-react-hooks-and-portals.html)呈现AntDModal
并扩展为 3属性,当引用useModal
钩子时:
const Modal = React.memo(({ visible, handleOk, handleCancel, handleDiscard }: Props) => {
const domEl = document.getElementById('modal-root')
if (!domEl) return null
return ReactDOM.createPortal(/* .... */)
})
这个想法是,我正在使用钩子并引用要调用的操作,当用户单击确定时,丢弃更改或取消:
export const useModal = (props) => {
const [isVisible, setIsVisible] = useState(false)
const show = () => setIsVisible(true)
const hide = () => setIsVisible(false)
const RenderModal = () => (
<>
{ isVisible && <Modal
visible={isVisible}
handleCancel={props.handleCancel}
handleDiscard={props.handleDiscard}
handleOk={props.handleOk}
/>}
</>
)
return {
show,
hide,
RenderModal,
}
}
然后将像这样使用它:
const { show, hide, RenderModal } = useModal({
handleCancel: () => {
hide()
},
handleOk: () => {
state.dirtyEmployeeDetails.forEach(details => {
details.saveFunc()
})
hide()
},
handleDiscard: () => {
state.dirtyEmployeeDetails.forEach(details => {
details.resetFunc()
})
hide()
}
})
这样做的问题是,我无法找到一种方法来使这个模式符合要求,我可以在调用时传入额外的回调show
。
理想情况下,我想在这样的事件处理程序中使用它:
const handleTabClick = (key: string, event: React.KeyboardEvent | React.MouseEvent) => { //检查脏表单数据是否可见,要求用户在离开当前区域前采取行动 const isDirty = state.dirtyEmployeeDetails.size > 0 if (isDirty) {
show( /* pass in callbacks to be called when ok, discard, cancel is clicked in addition to the one already defined or replacing them altogether*/)
}
else {
//default action
setActiveTabKey(key)
}
目标是在用户单击取消时调用带有可选回调的节目,例如event.preventDefault()
. 如果用户点击放弃,我们重置保存在全局状态的表单,然后继续,模拟 OK。
我找不到在 React 中执行此操作的方法,并且正在寻找解决此问题的可行方法。
解决方案
推荐阅读
- html - Bootstrap Navbar - 在折叠时保留一些项目
- javascript - 我在一个页面中有多个打印选项,但我需要为每个打印设置不同的页面尺寸
- sql - 在 OLEDB 源变量窗口中读取 for-each-loop 容器变量
- python - Django Rest & React:lookup_field = 'slug' 未从数据库返回项目
- python - 条件差异,除以数据框熊猫的同一列
- c# - xamarin.forms nuget 包兼容性问题
- ios - 如何修复 Thread 1: EXC_BAD_ACCESS (code=1, address=0x52879984) 在我的 appdelegate 上?
- perl - 如何在 Ubuntu 上安装 Perl-5.8.9
- c++ - 什么是“结构黑客”和“类型/非类型隐藏”?
- swift - 通过邮递员和 URLSession 获取的数据在这里不同 http://173.249.20.137:9000/apiapp/coupon