Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can we have React 16 Portal functionality React Native?

I'm using React Native which ships with React 16 alpha release which supports portals. While in browser and having access to DOM we can use id or classes to access element from anywhere in component/file hierarchy like this:

const modalRoot = document.getElementById('modal-root');

and pass it to createPortal(child, container) container arg. React docs clearly says than container should be DOM element:

The second argument (container) is a DOM element.

This function is also a method of ReactDOM which doesn't exist in React Native.

Is there a way to achieve the similar functionality in React Native?

Use case:

I want to render an animated overlay in the root of my application but pass the Animated values props to it from a parent deep in the tree hierarchy (can't use Redux actions for such things).

like image 411
Pouya Sanooei Avatar asked Sep 30 '17 17:09

Pouya Sanooei


People also ask

How do you use portal in react native?

You can use the React context API to create a primary portal that allows you to transport a React Native portal component from one location to another, regardless of hierarchy. We will create a PortalProvider that will manage a table of gates, with the key being the gate name and the value is the element to be shown.

How do I change React to level 16?

To downgrade React version 17 to 16 If You Don't want to use React 17 Then Just downgrade to react 16 Just run this command in your terminal: npm install –save [email protected] [email protected] Now, Your react version is downgraded to React 16. Thank you.

Is React portal necessary?

We mainly need portals when a React parent component has a hidden value of overflow property(overflow: hidden) or z-index style, and we need a child component to openly come out of the current tree hierarchy. Following are the examples when we need the react portals: Dialogs.


2 Answers

I had similar problem where I wanted to render overlay on top of everything from deeply nested child component. I solved my problem with React Native's Modal

It renders its content on top of everything :) Easy to use and no need for extra dependencies

like image 172
Henrik R Avatar answered Oct 21 '22 09:10

Henrik R


I don't think react-native provides this functionality in its own API. But there is a library available which provides the similar functionality. react-gateway

As per the docs of react-gateway,

It also works in universal (isomorphic) React applications without any additional setup and in React Native applications.

React Gateway does not directly depend on react-dom, so it works fine with React Native under one condition:

You must pass React Native component like View or similar to component prop of .

import React from 'react';
import { Text, View } from 'react-native';
import {
  Gateway,
  GatewayDest,
  GatewayProvider
} from 'react-gateway';

export default class Application extends React.Component {
  render() {
    return (
      <GatewayProvider>
        <View>
          <Text>React Gateway Native Example</Text>
          <View>
            <Gateway into="one">
              <Text>Text rendered elsewhere</Text>
            </Gateway>
          </View>
          <GatewayDest name="one" component={View} />
        </View>
      </GatewayProvider>
    );
  }
}

The above example is taken from the repo itself. react native example

like image 36
Hardik Modha Avatar answered Oct 21 '22 11:10

Hardik Modha