jaredpalmer / react-fns
- пятница, 17 ноября 2017 г. в 03:15:03
Browser API's turned into declarative React components and HoC's
react-fns is a collection of imperative Browser API's turned into declarative React components and higher-order components for lots of common situations.
There's a lot more to do. The goal is to standardize almost every Web API on MDN.
Table of Contents
When possible, each component (e.g. <Thing/>) in react-fns also exports a higher-order component with identical functionality (e.g. withThing().
Every render prop'd component shares the same three rendering methods:
<Thing render={props => <Inner />}><Thing component={Inner}><Thing>{props => <Inner />}</Thing>>All HoC's will pass through any and all additional props through to the inner component in addition to the props that they inject.
Detect and retrieve current device Motion.
acceleration: DeviceMotionEvent.accelerationaccelerationIncludingGravity: DeviceMotionEvent.accelerationIncludingGravityrotationRate: DeviceMotionEvent.rotationRateinterval: DeviceMotionEvent.intervalFor more information about the DeviceMotion API, check out the MDN reference
<DeviceMotion render/>import { DeviceMotion } from 'react-fns'
const Example = () =>
<DeviceMotion
render={({ alpha, beta, gamma, absolute }) =>
<pre>
{JSON.stringify({alpha, beta, gamma}, null, 2)}
</pre>
}
/>
export default ExamplewithDeviceMotion()import { withDeviceMotion } from 'react-fns'
const Inner = ({ alpha, beta, gamma, absolute }) =>
<pre>
{JSON.stringify({alpha, beta, gamma}, null, 2)}
</pre>
export default withDeviceMotion(Inner)Detect and retrieve current device orientation.
alpha: number: value represents the motion of the device around the z axis, represented in degrees with values ranging from 0 to 360.beta: number: value represents the motion of the device around the x axis, represented in degrees with values ranging from -180 to 180. This represents a front to back motion of the device.gamma: number: value represents the motion of the device around the y axis, represented in degrees with values ranging from -90 to 90. This represents a left to right motion of the device.For more information about the DeviceOrientation API, check out the MDN reference
<DeviceOrientation render/>import { DeviceOrientation } from 'react-fns'
const Example = () =>
<DeviceOrientation
render={({ alpha, beta, gamma, absolute }) =>
<pre>
{JSON.stringify({alpha, beta, gamma}, null, 2)}
</pre>
}
/>
export default ExamplewithDeviceOrientation()import { withDeviceOrientation } from 'react-fns'
const Inner = ({ alpha, beta, gamma, absolute }) =>
<pre>
{JSON.stringify({alpha, beta, gamma}, null, 2)}
</pre>
export default withDeviceOrientation(Inner)Retrieve network access from the browser.
online: boolean: true if the browser has network access. false otherwise.offlineAt?: Date: Date when network connection was lost.<Network render/>import { Network } from 'react-fns'
const Example = () =>
<Network
render={({ online, offlineAt }) =>
<div>
{online ? 'Online!' : 'Offline'}
{offlineAt && `Last connected ${offlineAt.toISOString()}`}
</div>
}
/>
export default ExamplewithNetwork()import { withNetwork } from 'react-fns'
const Inner = ({ online, offlineAt }) =>
<div>
{online ? 'Online!' : 'Offline'}
{offlineAt && `Last connected ${offlineAt.toISOString()}`}
</div>
export default withNetwork(Inner)Retrieve Geo position from the browser.
isLoading: boolean: true request statuscoords?: Position: Geoposition object. Has keys of latitude and longitudeerror?: PositionError: GeoPosition error. See MDN for shape.<GeoPosition render/>import { GeoPosition } from 'react-fns'
const Example = () =>
<GeoPosition
render={({ isLoading, coords, error }) =>
<div>
{coords && `${cords.longitude}$,{coords.latitude}`}
</div>
}
/>
export default ExamplewithGeoPosition()import { withGeoPosition } from 'react-fns'
const Inner = ({ isLoading, coords, error }) =>
<div>
{coords && `${cords.longitude}$,{coords.latitude}`}
</div>
export default withGeoPosition(Inner)Retrieve from the browser.
query: string: A media querymatches: boolean: true if browser matches the media query<Media render/>import { Media } from 'react-fns'
const Example = () =>
<Media
query="(min-width: 1000px)"
render={(match) =>
<div>
{match ? 'mobile' : 'desktop'}
</div>
}
/>
export default ExamplewithMedia()Not implemented
x: Horizontal scroll in pixels (window.scrollX)y: Vertical scroll in pixels (window.scrollX)<Scroll render/>Returns window.scrollY and window.scrollX.
import { Scroll } from 'react-fns'
const Example = () =>
<Scroll
render={({ x, y }) =>
<div>Scroll: {x}, {y}</div>
}
/>
export default ExamplewithScroll()Injects window.scrollY and window.scrollX as x and y props.
import { withScroll } from 'react-fns'
const Inner = ({ x, y }) => <div>Scroll Position: {x}, {y}</div>
export default withScroll(Inner)locales: The current browser locales (navigator.languages or navigator.language)<Locales render/>Returns canonical navigator.languages or navigator.language as locales.
import { Locales } from 'react-fns'
const Example = () =>
<Locales
render={({ locales }) =>
<span>Right now the time and date is {new Intl.DateTimeFormat(locales).format(new Date())}</span>
}
/>
export default ExamplewithLocales()Injects canonical navigator.languages or navigator.language as locales prop.
import { withLocales } from 'react-fns'
const Inner = ({ locales }) => <span>Right now the time and date is {new Intl.DateTimeFormat(locales).format(new
export default withLocales(Inner)<Mailto />Renders <a href="mailto:..." />
email: string: Recipient's email addresssubject?: string: Subject of the emailcc?: string | string[]: Email address or an array of email addresses to Ccbcc?: string | string[]: Email address or an array of email addresses to Bcc (blind copy)body?: string: Body copy of the email<Sms />Renders <a href="sms:..." />
phone: string: Phone numberbody?: string: Body copy of the text messageSee https://developer.mozilla.org/en-US/docs/WebAPI for the full list