@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
