This react native library provides a way of efficiently and dynamically rendering components based on a device's screen size and/or orientation irrespective of the platform. It achieves this by providing a new declarative syntax for applying different values of the same props to different devices based on their current orientation and/or screen size.
Yarn: yarn add react-native-responsive-component
Npm: npm install react-native-responsive-component --save
import { View } from "react-native";
import RComponent from "react-native-responsive-component";<RComponent
render$={() => View}
style$sm={{ flexDirection: "row", backgroundColor: "red" }}
style$md-lnd={{ flexDirection: "column", justifyContent: "center" }}
style$lg-ptr={{ flex: 1, backgroundColor: "blue" }}
/>The RComponent above will render the View component with it's style prop set to {flexDirection:"row", backgroundColor:"red"} on small devices ($sm), {flexDirection:"column", justifyContent:"center"} on medium devices ($md-lnd) with the landscape orientation and {flex:1, backgroundColor:"blue"} on large devices with the portrait orientation ($lg-ptr).
There are currently 3 break points for various screen sizes as shown by the table
| Screen Size | Break Point | Label |
|---|---|---|
| Small | ⩽ 640px | sm |
| Medium | > 640px and ⩽ 1007px | md |
| Large | > 1007px | lg |
The prop command is what is used by RComponent to determine what prop to apply to the rendered component based on the device. A prop command always begins with a dollar ($) symbol after the prop name.
Here are all the available prop commands that could be used.
| Prop Command | Scope |
|---|---|
| $sm | small devices in both portrait and landscape modes |
| $sm-ptr | small devices in portrait modes only |
| $sm-lnd | small devices in landscape modes only |
| $md | medium devices in both portrait and landscape modes |
| $md-ptr | medium devices in portrait modes only |
| $md-lnd | medium devices in landscape modes only |
| $lg | large devices in both portrait and landscape modes |
| $lg-ptr | large devices in portrait modes only |
| $lg-lnd | large devices in landscape modes only |
| $ptr | any device in portrait mode |
| $lnd | any device in landscape mode |
Multiple prop commands could be chained to extend it's scope. For example $sm$md-lnd will match for small devices in both portrait and landscape mode and medium devices in landscape mode only. e.g
<RComponent
render$={() => Text}
style$md-ptr$sm-lnd={{ fontSize: 20 }}
style$lg-lnd$md$sm={{ fontSize: 25 }}
style={{ fontSize: 35 }}
/>The above example will apply the style prop with {fontSize:20} for medium devices in portrait mode ($md-ptr) and small devices in landscape mode ($sm-lnd).
It will equally apply the style prop with {fontSize:25} for large devices in landscape mode($lg-lnd), medium devices in both portrait and landscape modes ($md) and small devices in both portrait and landscape modes ($sm).
For any other case, the style prop with {fontSize:35} will be applied.
Please note that if two prop commands conflict for the same prop, the prop command that is most specific to the device is applied. for example;
<RComponent
render$={() => View}
style$md={{ flex: 1 }}
style$md-ptr={{ flex: 2 }}
/>In the case above, there's a conflict between the two style prop when on a medium device in portrait mode because the $md and $md-ptr prop commands both matches for this mode. In such a scenario, only the style prop with {flex:2} will be applied because it's prop command ($md-ptr) is more specific to the device and its current mode.
One last thing to note is that if a prop command is not specified, it always matches (although with the least precedence in case of conflict).
| Prop | Description |
|---|---|
| visible$<prop-command> | Displays the component only if the prop command matches for the device and mode |
| hidden$<prop-command> | Hides the component only if the prop command matches for the device and mode |
| render$<prop-command> | A callback which returns a component to be rendered when the prop command matches |
Owing to the frequent use of the View, Text and Image components, react-native-responsive-components also provides precompiled RView, RText and RImage components so that the render$ method could be ommited while using them. for example:
import {RView, RText} from "react-native-responsive-component";<RView
style$ptr = {{flexDirection:"row"}}
style$lnd = {{flexDirection:"column"}}>
(...)
</RView> There are equally helper/utility functions provided by the RUtil object of the library.
import {RUtils} from "react-native-responsive-component";(...)
if(RUtils.isLandscapeMode()){
//do something when in landscape mode
}
else if (RUtils.isSmallScreen()){
//do something for small devices.
} The table below shows a list of available functions.
| Function | Description |
|---|---|
| isLandscapeMode | A function that returns true if devices is in landscape mode and false otherwise. |
| isPortraitMode | A function that returns true if device is in portrait mode and false otherwise. |
| isSmallScreen | returns true if is a small device (i.e ⩽ 640px) and false otherwise |
| isMediumScreen | returns true if is a medium device (i.e > 640px and ⩽ 1007px) and false otherwise |
| isLargeScreen | returns true if is a large device (i.e > 1007px ) and false otherwise |
| getDeviceLabel | returns the device label i.e. "sm" for small devices, "md" for medium devices and "lg" for large devices |
| getDeviceSpecificLabel | returns the device label coupled with the current mode of the device i.e. "sm-ptr" for small devices in portrait mode, "sm-lnd" for small devices in landscape mode, "md-ptr" for medium devices in portrait mode, "md-lnd" for medium devices in landscape mode, "lg-ptr" for large devices in portrait mode and "lg-lnd" for large devices in landscape mode, |
| getDeviceMode | returns the device's current mode, i.e "lnd" if device is in landscape mode or "ptr" if device is in portrait mode |
| registerOrientationChangedListener | this function accepts a callback as an argument which is invoked every time the orientation of the device is changed. The callback takes as arguments a javascript object of the form {"width":Number, "height":Number, "orientation":"LANDSCAPE"|"PORTRAIT"} |
| removeAllListeners | Removes all orientation change listeners that have been registered. |
| removeListener | Removes a particular orientation change listener. It takes as argument the listener that is to be removed. |
If you love this library, consider contributing to make it better. Thanks
