@bit-about/native-portal
npm i @bit-about/native-portal
- 100% Idiomatic React and 100% Typescript
- Tiny & Efficient
- Does not trigger unnecessary renderings
- Just works β’
import { portal } from '@bit-about/native-portal'
// 1οΈβ£ Create a portal
const Portal = portal()
// 2οΈβ£ Wrap your app with Provider
const App = () => (
<Portal.Provider>
{/* ... */}
</Portal.Provider>
)
β¬ Set injection target
const ComponentA = () => (
<>
<Portal.Target />
</>
)
π ...then inject content from elsewhere
const ComponentB = () => (
<>
<Portal.Injector>
<Text>Hello!</Text>
</Portal.Injector>
</>
)
Thanks to this,
when the ComponentB
is rendered,
the Hello!
sentence will be moved to the ComponentA
.
import { portal } from '@bit-about/native-portal'
// Declare destinations during portal creation
const Portal = portal('toHeader', 'toMenu', 'toHeaven')
β¬ Set injection target using name
prop
const Menu = () => (
<>
<Portal.Target name="toMenu" />
</>
)
π ...then inject content using name
prop
const Screen = () => (
<>
<Portal.Injector name="toMenu">
<Text>{'New menu option'}</Text>
</Portal.Injector>
</>
)
To declare fallback content for portal that is not in use, you can just pass children
prop to Target
component.
<Portal.Target>
<Text>{'I am only visible when no content has been injected.'}</Text>
</Portal.Target>
import { portal } from '@bit-about/native-portal'
const {
Provider: MyAmazingProvider,
Target: MyAmazingTarget,
Injector: MyAmazingInjector,
} = portal()
// ... and then
const App = () => (
<MyAmazingProvider>
{/* ... */}
</MyAmazingProvider>
)
It works like a stack. The Target
will render the latest content.
If the newest Injector
is unmounted, the Target
will render the previous one.
Each Target
will display the same content.
Nope!
When you render Target
it will be automatically filled up by the injected content.
Yes.
Moreover, Providers
and Injectors
will be never unecessary re-rendered.
Target
rerender only when the latest injected content changes.
- use-context-selector & FluentUI - fancy re-render avoiding tricks and code main inspiration
MIT Β© Maciej Olejnik π΅π±
If you use my library and you like it...
it would be nice if you put the name BitAboutNativePortal
in the work experience section of your resume.
Thanks ππ»!
πΊπ¦ Slava Ukraini