Comments (4)
My solution for this was to create nested portals in the DOM:
import * as React from "react";
import * as ReactDOM from "react-dom";
const PortalContext = React.createContext(
typeof document !== "undefined" ? document.body : null
);
export function Portal({ children }) {
// if it's a nested portal, context is the parent portal
// otherwise it's document.body
const context = React.useContext(PortalContext);
const [container] = React.useState(() => {
if (typeof document !== "undefined") {
return document.createElement("div");
}
// ssr
return null;
});
React.useLayoutEffect(() => {
if (!container || !context) return undefined;
context.appendChild(container);
return () => {
context.removeChild(container);
};
}, [container, context]);
if (container) {
const portal = ReactDOM.createPortal(children, container);
return (
<PortalContext.Provider value={container}>
{portal}
</PortalContext.Provider>
);
}
// ssr
return null;
}
Then you can pass the portal element to useOnClickOutside
.
from use-onclickoutside.
I'm afraid that's not possible without hacks. React doesn't give access to its tree and we can't just traverse it.
from use-onclickoutside.
@diegohaz this is interesting, would you be able to prepare a simple codesandbox showcasing how this could be used? I'm not sure if I understand how this is supposed to work with DOM and outside clicks
from use-onclickoutside.
@Andarist There you go: https://codesandbox.io/s/o9086wk8j5
It doesn't close nested portals when closing the parent ones though. But I think it's doable. I just made it really fast.
from use-onclickoutside.
Related Issues (14)
- Disabling useOutsideClick callback for specified elements HOT 12
- Logging just to ask some questions HOT 2
- How this package works so it uses event listeners effectively? HOT 2
- How to test a component using this hook? HOT 1
- Add `capture` option for event handler? HOT 5
- [Question] Why does it use "mousedown" and not "click"? HOT 10
- Clashes with mouse down events creating the element HOT 2
- Account for multiple refs? HOT 9
- Don't trigger when scrolling down on mobile? HOT 1
- Add unit tests
- Feature request: adding/excluding Events HOT 1
- Update peerDependency to react 18 HOT 2
- [Feature Requrest] Option to use `window.addEventListener` rather than `document.addEventListener` HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from use-onclickoutside.