Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@recruit-tech/redux-async-loader

Package Overview
Dependencies
Maintainers
8
Versions
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@recruit-tech/redux-async-loader

Async data loader for Redux apps.

  • 2.0.0
  • Source
  • npm
  • Socket score

Version published
Maintainers
8
Created
Source

redux-async-loader

Async data loader for Redux apps with React-Router.

CAUTION

redux-async-loader is incompatible with react-redux@5

For react-redux@5, you neeed to use the 1.x release of redux-async-loader.

Installation

npm install --save redux-async-loader

Usage

1. Register Reducer

import { combineReducers, createStore } from 'redux';
import { reduxAsyncLoader } from 'redux-async-loader';

const store = createStore(combineReducers({
  reduxAsyncLoader,
  ...
}), initialState);

2. Server-Side Rendering (Optional)

import { applyRouterMiddleware, match, RouterContext } from 'react-router';
import { loadOnServer } from 'redux-async-loader';

match({ history, routes }, (error, redirectLocation, renderProps) => {
  // ...

  loadOnServer(renderProps, store).then(() => {
    const content = renderToString(
      <Provider store={store} key="provider">
        <RouterContext {...renderProps} />
      </Provider>
    );
  });
});

3. Client-Side Rendering

import { render } from 'react-dom';
import { Router, applyRouterMiddleware, browserHistory } from 'react-router';
import { useAsyncLoader } from 'redux-async-loader';

const RenderWithMiddleware = applyRouterMiddleware(
  useAsyncLoader(),
);

render(
  <Provider store={store} key="provider">
    <Router history={browserHistory} render={(props) => <RenderWithMiddleware {...props} />} />
  </Provider>
, el);

If you are using react-router-scroll, it should be applied after redux-async-loader.

import useScroll from 'react-router-scroll';

const RenderWithMiddleware = applyRouterMiddleware(
  useAsyncLoader(),
  useScroll()
);

4. Async data loading by routing (both client and server-side rendering)

import { connect } from 'react-redux';
import { asyncLoader } from 'redux-async-loader';

class UserList extends React.Component {
  // ...
}

export default asyncLoader((props, store) => store.dispatch(loadUsers(props)))(
  connect({ ... }, { ... })(
    UserList
  )
);

or, with decorator:

@asyncLoader((props, store) => store.dispatch(loadUsers(props)))
@connect({ ... }, { ... })
export default class UserList extends React.Component {
  // ...
}

or, with recompose:

import { compose } from 'recompose';

export default compose(
  asyncLoader((props, store) => store.dispatch(loadUsers(props))),
  connect({ ... }, { ... })
)(class UserList exptends React.Component {
  // ...
});

Unlike redux-async-connect, redux-async-loader itself doesn't connect to store. You have to call connect() explicitly if you want to use store's state.

If you want to invoke asyncLoader() when just querystring (not path) is changed, you must specify key names of querystring to router.

<Route path="items" component=ItemList asyncLoaderProps={{queryKeys: "q, page"}} ... />

Or, you can use the wildcard for any keys of querystring:

<Route path="items" component=ItemList asyncLoaderProps={{queryKeys: "*"}} ... />

5. Async data loading by mounting/updating (client-side rendering only)

import { connect } from 'react-redux';
import { deferLoader } from 'redux-async-loader';

class UserList extends React.Component {
  // ...
}

export default deferLoader((props, store) => store.dispatch(loadUsers(props)))(
  connect({ ... }, { ... })(
    UserList
  )
);

or, with decorator:

@deferLoader((props, store) => store.dispatch(loadUsers(props)))
@connect({ ... }, { ... })
export default class UserList extends React.Component {
  // ...
}

or, with recompose:

import { compose } from 'recompose';

export default compose(
  deferLoader((props, store) => store.dispatch(loadUsers(props))),
  connect({ ... }, { ... })
)(class UserList exptends React.Component {
  // ...
});

API

asyncLoader(loader)

Creates Higher-order Component for async data loading by routing.

Arguments
  • loader (Function): Called when this component is routed.
    • Arguments
      • props (Object): The props passed from React-Router. See React-Router API docs for more info.
      • store: (Object): Redux's store object.
    • Returns
      • (Promise): Fulfilled when data loading is completed.
Returns
  • (Function): Creates higher-order component.
    • Arguments
      • wrappedComponent (Component): Wrapped component.
    • Returns
      • (Component): Wrapper component.
deferLoader(loader)

Creates Higher-order Component for async data loading by mounting and updating.

Arguments
  • loader (Function): Called when this component is mounted or updated.
    • Arguments
      • props (Object): The props passed from parent component.
      • store: (Object): Redux's store object.
    • Returns
      • (Promise): Fulfilled when data loading is completed.
Returns
  • (Function): Creates higher-order component.
    • Arguments
      • wrappedComponent (Component): Wrapped component.
    • Returns
      • (Component): Wrapper component.
loadOnServer(renderProps, store)

Loads async data on the server side.

Arguments
  • renderProps (Object): The props passed via match()'s callback. See React-Router API docs for more info.
  • store (Object): Redux's store object.
Returns
  • (Promise): Fulfilled when data loading is completed.

Keywords

FAQs

Package last updated on 03 Dec 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc