UNPKG

react-matchmedia-connect

Version:
152 lines (126 loc) 4.74 kB
react-matchmedia-connect ========================= [![npm](https://img.shields.io/badge/npm-react--matchmedia--connect-brightgreen.svg?style=flat-square)]() [![npm version](https://img.shields.io/npm/v/react-matchmedia-connect.svg?style=flat-square)](https://www.npmjs.com/package/react-matchmedia-connect) [![npm downloads](https://img.shields.io/npm/dm/react-matchmedia-connect.svg?style=flat-square)](https://www.npmjs.com/package/react-matchmedia-connect) * [Higher order components](https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750#.9apqrmudz) for the [matchMedia](https://developer.mozilla.org/de/docs/Web/API/Window/matchMedia) API * Receive props that indicate whether your media queries match **[Check out the demo](http://malte-wessel.github.io/react-matchmedia-connect/)** ## Installation ```bash npm install react-matchmedia-connect --save ``` ## Usage ### createMatchMediaConnect `createMatchMediaConnect` lets you register a set of [media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries). If one of the queries changes, you component will be updated. ```javascript import { createMatchMediaConnect } from 'react-matchmedia-connect'; // Define some media queries and give them a key const connect = createMatchMediaConnect({ isLandscape: '(orientation: landscape)', isMin400: '(min-width: 400px)', isTablet: '(min-width: 700px), handheld and (orientation: landscape)' }); ``` Then use this connect function throughout your app: ```javascript const Component = ({ isLandscape, isMin400 }) => ( <div> <div>{isLandscape ? 'landscape' : 'portrait'}</div> <div>{isMin400 ? 'at least 400' : 'less than 400'}</div> </div> ); // This component only needs `isLandscape` and `isMin400` const ConnectedComponent = connect(['isLandscape', 'isMin400'])(Component); ``` ```javascript const OtherComponent = ({ isTablet }) => ( isTablet ? <div>Tablet</div> : <div>No tablet</div> ); // This component only needs `isTablet` const OtherConnectedComponent = connect(['isTablet'])(Component); ``` ### createResponsiveConnect `createResponsiveConnect` expects a list of breakpoints and creates the respective media queries with `createMatchMediaConnect`. You'll get a `isMin<Size>` and `isMax<Size>` property for each breakpoint as well as a `isPortrait` and `isLandscape` property. ```javascript import { createResponsiveConnect } from 'react-matchmedia-connect'; const connect = createResponsiveConnect({ xs: 480, sm: 768, md: 992, lg: 1200 }); ``` ```javascript const Component = ({ isMinMd, isMaxMd }) => ( <div> <div>{isMinMd ? 'greater than 992px' : 'less than 992px'}</div> <div>{isMaxMd ? 'less than 1200px' : 'greater than 1199px'}</div> <div>{isMinMd && isMaxMd ? 'between 992px and 1199px' : 'other'}</div> </div> ); // Only connect to `isMinMd` and `isMaxMd` const ConnectedComponent = connect(['isMinMd', 'isMaxMd'])(Component); ``` ## API ### `createMatchMediaConnect(mediaQueries)` * `mediaQueries` (Object): A set of media queries. * `returns` (Function): **[connect](#connectproperties)** function that connects your components to changes ```javascript const connect = createMatchMediaConnect({ isLandscape: '(orientation: landscape)', isMin400: '(min-width: 400px)' }); ``` ##### `connect(properties)` * `properties` (Array): An array of properties that your component should receive * `returns` (Function): **[wrapWithConnect](#wrapwithconnectcomponent)** higher order function ```javascript const wrapWithConnect = connect(['isMin400']); ``` ##### `wrapWithConnect(Component)` * `Component` (Component): The component that you want to connect * `returns` (Component): Connected component ```javascript const Component = ({ isMin400 }) => ( <div>{isMin400 ? 'at least 400' : 'less than 400'}</div> ); // This component only needs `isLandscape` and `isMin400` const ConnectedComponent = wrapWithConnect(Component); ``` ### `createResponsiveConnect(breakpoints)` * `breakpoints` (Object): A set of breakpoints * `returns` (Function): **[connect](#connectproperties)** function that connects your components to changes *Default breakpoints:* ```javascript const defaultBreakpoints = { xs: 480, sm: 768, md: 992, lg: 1200 }; ``` ## Examples Run the simple example: ```bash # Make sure that you've installed the dependencies npm install # Move to example directory cd react-matchmedia-connect/examples/simple npm install npm start ``` ## Tests ```bash # Make sure that you've installed the dependencies npm install # Run tests npm test ``` ### Code Coverage ```bash # Run code coverage. Results can be found in `./coverage` npm run test:cov ``` ## License MIT