react-render-props-link-loader
TypeScript icon, indicating that this package has built-in type declarations

1.2.0 • Public • Published

react-render-props-link-loader

CircleCI Coverage Status Commitizen friendly npm version

an easier to use dynamic link loader with a render prop

This is useful if you want to wait to load web fonts or other static CSS until the user navigates to a view that uses it. When you mount a <LinkLoader> component, it will create the link tag you've requested.

<LinkLoader> doesn't load a given link URL more than once, even if there is a pre-existing <link> tag for that URL that it didn't create. If the href prop changes, it will load that new URL.

Version notes

  • supports React 15 or 16
  • if building for legacy browsers with a bundler like Webpack that supports the module field of package.json, you will probably need to add a rule to transpile this package.

Installation

npm install --save react-render-props-link-loader

Example

import * as React from 'react'
import LinkLoader from 'react-render-props-link-loader'

import SomeView from './SomeView'

export const SomeViewContainer = (props) => (
  <LinkLoader
    href="https://fonts.googleapis.com/css?family=Rubik:300,400,500"
    rel="stylesheet"
    onLoad={() => console.log('loaded fonts!')}
    onError={(error) => console.error('failed to load fonts', error.stack)}
  >
    {({ loading, error }) => {
      if (loading) return <h3>Loading fonts...</h3>
      if (error) return <h3>Failed to load fonts: {error.message}</h3>
      return <SomeView {...props} />
    }}
  </LinkLoader>
)

API

LinkLoader

import LinkLoader from 'react-render-props-link-loader'

href (required string)

The link URL.

onLoad (?() => any)

A callback that LinkLoader will call once the link has been loaded

onError (?(error: Error) => any)

A callback that LinkLoader will call if there was an error loading the link

children (?(state: State) => ?React.Node)

The render function. It will be called with an object having the following props, and may return your desired content to display:

{
  loading: boolean,
  loaded: boolean,
  error: ?Error,
  promise: ?Promise<any>,
}

Server-Side Rendering

import {
  LinksRegistry,
  LinksRegistryContext,
} from 'react-render-props-link-loader'

On the server, create an instance of LinksRegistry and put it on the app's context:

const registry = new LinksRegistry()

const body = ReactDOM.renderToString(
  <LinksRegistryContext.Provider value={registry}>
    <App />
  </LinksRegistryContext.Provider>
)

Then render registry.linkTags() in your head element:

const html = (
  <html className="default">
    <head>
      ...
      {registry.linkTags()}
    </head>
    ...
  </html>
)

Package Sidebar

Install

npm i react-render-props-link-loader

Weekly Downloads

64

Version

1.2.0

License

MIT

Unpacked Size

30.3 kB

Total Files

12

Last publish

Collaborators

  • jedwards1211