Cannot register modal instance that's already open
When a modal is open, double-clicking on the background overlay results in the modal disappearing then quickly reappearing again with the following warning in the console:
react_devtools_backend.js:6 React-Modal: Cannot register modal instance that's already open
at ModalPortal (http://localhost:4500/static/js/0.chunk.js:60569:5)
at Modal (http://localhost:4500/static/js/0.chunk.js:60212:5)
Additionally, the ReactModal__Body--open class remains on the body after closing the re-opened modal.
Managed to get around the issue by adding pointer-events: none to .ReactModal__Overlay--before-close.
@Hainesy
[edit] Thought we had a handler for double-click on the overlay. So, once we have that it should do only one action executed.
I am getting same error even after setting pointer-events: none as mentioned above
When I click once outside the modal to close it I get:
React-Modal: Cannot register modal instance that's already open
and when I click outside the modal again I get:
portalOpenInstances.js:33 React-Modal: Unable to deregister [object Object] as it was never registered
and then the modal is closed
I agree this is still a problem
I am now getting this error after upgrading to React 18. Prior to doing the upgrade, I did not see this error: React-Modal: Cannot register modal instance that's already open. Does anybody have any idea of what might have changed?
This issue still occurs, I'm using version 3.5.1
Version 3.15.1 was released. Is this happening on this version?
Version 3.15.1 was released. Is this happening on this version?
Yes, but I think it occurs only in development mode with react 18 and enabled StrictMode https://github.com/reactwg/react-18/discussions/19
Hmmm...this is interesting...could you please help creating a reproducible example?
Hmmm...this is interesting...could you please help creating a reproducible example?
here: https://stackblitz.com/edit/nextjs-aznh2l?file=pages%2Findex.js
without modalIsOpen && error doesn't occur
Hmmmm...It's recommended to not use modal with conditional rendering. There is a problem with createPortal when using this way (need to check if it still happening. It starts happening on version +16.3 of react). Are you all using conditional rendering?
cc @Hainesy @timothymalcham @rahul-desai3 @luis-antonio-dev
Same warning

Facing the same issue for one of my modals after upgrading to React 18. Any fixes to this? Funnily enough, the modal starts working "after a while" (I think when I leave the app and come back). Super strange
¿En definitiva no hay solucion?
Please read this to help debugging this issue
It's recommended to not use modal with conditional rendering. There is a problem with createPortal when using this way (need to check if it still happening. It starts happening on version +16.3 of react). Are you all using conditional rendering?
A suggestion is: don't use conditional rendering with modals...there is no need to. There is no performance cost, there is no problem to maintain (it's only one state).
Sorry for this guys... :joy: But please let me know if you have a different case where this happens other than with conditional rendering.
Please read this to help debugging this issue
It's recommended to not use modal with conditional rendering. There is a problem with createPortal when using this way (need to check if it still happening. It starts happening on version +16.3 of react). Are you all using conditional rendering?
A suggestion is: don't use conditional rendering with modals...there is no need to. There is no performance cost, there is no problem to maintain (it's only one state).
Sorry for this guys... 😂 But please let me know if you have a different case where this happens other than with conditional rendering.
This solved the issue for me.
I was conditionally rendering in my component, rather than letting the isOpen prop handle the rendering.
The bug also happens when the Modal lives next to a component that conditionally renders.
Plus it only happens when using base | afterOpen | beforeClose classNames.
Something like this won't work:
export const MainHeader2 = () => {
const { isMobile } = useContext(ViewportContext);
const [isOpen, setIsOpen] = useState(false);
const toggleConfirmModalOrDrawer = () => {
setIsOpen((prevState) => !prevState);
};
const doSomething = () => someAction();
return (
<header>
<Logo handleClick={toggleConfirmModalOrDrawer} />
<Modal
className={{
base: styles.modalContent,
afterOpen: styles.modalContentAfterOpen,
beforeClose: styles.modalContentBeforeClose,
}}
overlayClassName={styles.modalOverlay}
isOpen={!isMobile && isOpen}
onRequestClose={toggleConfirmModalOrDrawer}
>
<ConfirmLeaveModalContent
onConfirm={doSomething}
onDismiss={toggleConfirmModalOrDrawer}
/>
</Modal>
{isMobile && (
<ConfirmLeaveDrawer
onConfirm={doSomething}
onDismiss={toggleConfirmModalOrDrawer}
/>
)}
</header>
);
};
@rodriguezmarting Awesome. This is weird... Can you make a step to reproduce so we can see how are you triggering this behavior?
Using react-modal with nice-modal-react makes for a handy combination in my opinion, but unfortunately nice-modal-react also uses conditional rendering. The console warning can be triggered in this example.
I was having this error ([email protected], [email protected]), and after a lot of frustration found out that my problem was caused by using React.StrictMode in my root element, which apparently double-invokes some lifecycle methods in development mode (not production, though). As of now, this behavior is documented in the StrictMode docs -- search for "double-invoking the following functions".
I found this solution by accident, because I was investigating an effect being called twice and found this answer, which also referenced this answer which has more info about the double rendering of StrictMode.
It seems like this is harmless in my case because the only visible issue is the warning in console (modals are still displaying fine), but if anyone has a suggestion for suppressing the warning, I'd appreciate it! Removing the StrictMode tag stops this issue from happening, but I want to keep the benefits of using strict mode.
Please fix this issue!!!
Why don't you fix it, @mleister97?
I have the same issue.
no conditional rendering, no strict mode.
react-modal 3.16.1,
react 18.2.0
This seems to be a mem leak on the src/helpers/portalOpenInstances.js, but it's most likely that this is caused by something that is holding the reference of a modal that should already be gone.
We Can't use:
{modalIsOpen && (......)
The best way to use that is creating a component where we have all the code that we need, a componet seems something like this:
<Modal isOpen={modal} style={customStyles} > <ModalProducto /> </Modal>
and ModalProducto.jsx is something like this:
export default function ModalProducto() { return ( <div>ModalProducto</div> ) }
That way works for me
No podemos usar:
{modalIsOpen && (......)
Lo que se debe hacer es crear un componente con toda la lógica que necesitamos, algo parecido a lo siguiente:
<Modal isOpen={modal} style={customStyles} > <ModalProducto /> </Modal>
y ModalProducto.jsx es algo como lo siguiente:
export default function ModalProducto() { return ( <div>ModalProducto</div> ) }
Esa es la solución.
This error is occurring because you haven't declared the CSS for the modal. If you declare the CSS in a global file such as index.css, the error will not happen.
.mymodal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);
border: 1px solid #ccc; background: #fff; overflow: auto; border-radius: 4px; outline: none; padding: 20px; }
.myoverlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.75); }
.ReactModal__Overlay { opacity: 0; transition: opacity 500ms ease-in-out; }
.ReactModal__Overlay--after-open { opacity: 1; }
.ReactModal__Overlay--before-close { opacity: 0; }
If it helps, I was able to reproduce this issue with minimal changes to the simple_usage example in this repo.
The steps I took:
- Upgrade to React 18
- Add
React.StrictModeto the example - Use
createRootinstead ofReactDOM.render - Set
isOpentotrueby default
The warning then appears in the console when you open the example.
Here is the diff: https://github.com/reactjs/react-modal/compare/master...brianpeiris:react-modal:register-warning?w=1
I did not have to use conditional rendering to reproduce this issue, and more people will run into it as they adopt React 18. Notably, modern tooling, like Vite, enables StrictMode by default.
@brianpeiris Yep, this is not just a case of conditional rendering (but kinda related).
The problem seems to be a new feature of react 18 where it can keep some components alive to make some rendering optimizations. But this causes all sorts of problems because react-modal is a stateful component that needs to deal with subtrees.