Skip to content

iamdustan/react-resolver

 
 

Repository files navigation

React Resolver https://img.shields.io/npm/v/react-resolver.svg

Isomorphic library to lazy-load data for React components

Features

  • Promise-based – Define & lazy-load component data dependencies and inject them as props.
  • Isomorphic – Express/Koa/Hapi-friendly server-side rendering & progressive, client-side rendering.
  • Test friendly – Containers promote separation between data-fetching & rendering.

Demo

Demo

View Demo



Requirements

  • React v0.13.x

For browsers that don't nativeuly support promises, use ES6 Promise.

Installation

npm install --save react-resolver

Usage

Example is based on Stargazers.js in the demo.

Suppose you want to display list of users, but that data is loaded asynchronously via an API.

Rather than having your component handle data-fetching and rendering, you can create a "container" that fetches the data and only renders when ready:

import React from "react";
import { Resolver } from "react-resolver";

class Users extends React.Component {
  render() {
    return (
      <ul>
        {this.props.users.map(user => (
          <li>{user}</li>
        ))}
      </ul>
    );
  }
}

Users.defaultProps = { limit: 5 };
Users.propTypes = { users: React.PropTypes.array.isRequired };

// Rather than `export default Users`, create a container:
export default Resolver.createContainer(Users, {
  resolve: {
    users: function(props) {
      return fetch(`/api/users?limit=${props.limit}`);
    }
  }
});

Client

Replace React.render with Resolver.render, and you're all set!

import React from "react";
import Resolver from "react-resolver";

Resolver.render(<Users />, document.getElementById("app"));

Server

Because data has to be fetched asynchronously, React.renderToString (and React.renderToStaticMarkup) won't have the data in time.

Instead, replace React with Resolver and you'll receive a promise that resolves with the rendered output!

import React from "react";
import Resolver from "react-resolver";

Resolver.renderToString(<Users />).then((string) => {
  reply(string);
}).catch((err) {
  // An error was thrown while rendering
  console.error(err);
});

Development

If you'd like to contribute to this project, all you need to do is clone this project and run:

$ npm install
$ npm test

Authors

Collaboration

If you have questions or issues, please open an issue!

About

Isomorphic library to recursively lazy-load data for React components

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 99.1%
  • HTML 0.9%