React library to render components only on specific viewports
npm install react-socksjsx
This component will render only in mobile devices
`
Why? 
Conventionally we have been writing _css media queries_ for different viewports to hide and show elements that are always present in the DOM. With React taking over the world, everything is about rendering components into the DOM. React Socks helps you conditionally render elements based on viewports.
1. Render viewport specific components without hassle
2. You can define your own breakpoints (Eg. xs, ipad, bigmonitors) and use them
3. You can improve your app performance if you lazy load your viewport specific components
4. Simpler and sweeter syntax for ease of use
Install
`sh
$ npm install --save react-socks
`
Usage
Just wrap your top level component with BreakpointProvider and use the Breakpoint component anywhere you need.
_Note: BreakpointProvider was introduced only in v1.0.0. It's not available in previous alpha versions._
`jsx
import { Breakpoint, BreakpointProvider } from 'react-socks';
// entry file (usually App.js or index.js)
const App = () => (
);
`
`jsx
// Example.js
const Example = () => {
return (
I will render only in mobile devices
I will render only in tablets (iPad, etc...)
I will render in tablets (iPad, etc...) and everything below (mobile devices)
I will render in tablets (iPad, etc...) and everything above (laptops, desktops)
I will render in laptops, desktops and everything above
{/ Add breakpoints on the fly using custom queries /}
Custom breakpoint: (min-width : 500px)
Custom breakpoint: (max-width : 1000px)
Custom breakpoint: (min-width : 500px) && (max-width : 700px)
);
};
`
API
- setDefaultBreakpoints
- Breakpoint
- useCurrentWidth / useCurrentBreakpointName
$3
You can define your own breakpoints.
- Pass an array of objects with the breakpoint name and width in _px_ to setDefaultBreakpoints once in your App.js or your React entry file.
Note: You only need to set default breakpoints once in your app
`jsx
import { setDefaultBreakpoints } from 'react-socks';
setDefaultBreakpoints([
{ xs: 0 },
{ s: 376 },
{ m: 426 },
{ l: 769 },
{ xl: 1025 }
]);
I will render only in m devices
`
- You can use any breakpoint name (Eg. cats, puppies, dinosaurs, etc) and width.
`jsx
setDefaultBreakpoints([
{ cats: 0 },
{ dinosaurs: 900 }
]);
Only cats can render me
`
- If you don't set a default breakpoint, the library will fallback to Bootstrap 4 default breakpoints as described below.
`jsx
setDefaultBreakpoints([
{ xsmall: 0 }, // all mobile devices
{ small: 576 }, // mobile devices (not sure which one's this big)
{ medium: 768 }, // ipad, ipad pro, ipad mini, etc
{ large: 992 }, // smaller laptops
{ xlarge: 1200 } // laptops and desktops
]);
`
$3
Import the Breakpoint component anywhere in the your code and start using it with your breakpoint and modifier props.
`jsx
// small is breakpoint
// down is modifier
This component will render only in mobile devices
`
You have three modifiers
- only - will render the component only in the specified breakpoint.
- up - will render the component in the specified breakpoint and all the breakpoints above it (greater than the width).
- down - will render the component in the specified breakpoint and all the breakpoints below it (less than the width).
$3
Now, you can add a breakpoint of any width by using this prop: customQuery.
Simply write your media query as a _string_ and pass it to customQuery
`jsx
Custom breakpoint: (min-width : 500px)
Custom breakpoint: (max-width : 1000px)
Custom breakpoint: (min-width : 500px) && (max-width : 700px)
`
Note: customQuery will be ignored if you have mentioned any modifiers like up, down & only
Use customQuery only if you want to make use of arbitary breakpoints.
$3
If you call useCurrentWidth in the render function, you can access the current width directly:
`jsx
import { useCurrentWidth } from 'react-socks'
const CustomComponent = () => {
const width = useCurrentWidth()
if (width < 500) {
return Hello!
} else {
return Hello!
}
}
`
You can also use the current breakpoint name with useCurrentBreakpointName:
`jsx
import { useCurrentBreakpointName } from 'react-socks'
const CustomComponent = () => {
const breakpoint = useCurrentBreakpointName()
if (breakpoint == 'small') {
return Hello!
} else {
return Hello!
}
}
``