Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sunny250984/redux-data-fetch
digiaonline.github.io/redux-fetch-data
https://github.com/sunny250984/redux-data-fetch
react redux
Last synced: about 2 months ago
JSON representation
digiaonline.github.io/redux-fetch-data
- Host: GitHub
- URL: https://github.com/sunny250984/redux-data-fetch
- Owner: sunny250984
- License: mit
- Created: 2024-10-29T01:50:58.000Z (4 months ago)
- Default Branch: master
- Last Pushed: 2024-10-29T01:52:53.000Z (4 months ago)
- Last Synced: 2024-10-29T03:27:00.296Z (4 months ago)
- Topics: react, redux
- Language: JavaScript
- Homepage:
- Size: 80.1 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: .github/CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# redux-fetch-data
[![Build Status](https://travis-ci.org/digiaonline/redux-fetch-data.svg?branch=master)](https://travis-ci.org/digiaonline/redux-fetch-data)
[![Test Coverage](https://codeclimate.com/github/digiaonline/redux-fetch-data/badges/coverage.svg)](https://codeclimate.com/github/digiaonline/redux-fetch-data/coverage)
[![Code Climate](https://codeclimate.com/github/digiaonline/redux-fetch-data/badges/gpa.svg)](https://codeclimate.com/github/digiaonline/redux-fetch-data)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/digiaonline/redux-fetch-data/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/digiaonline/redux-fetch-data/?branch=master)
[![StyleCI](https://styleci.io/repos/58546352/shield?style=flat)](https://styleci.io/repos/58546352)
[![npm version](https://img.shields.io/npm/v/redux-fetch-data.svg)](https://www.npmjs.com/package/redux-fetch-data)
[![npm downloads](https://img.shields.io/npm/dt/redux-fetch-data.svg)](https://www.npmjs.com/package/redux-fetch-data)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/digiaonline/redux-fetch-data/master/LICENSE)Redux utility library for fetching data using promises on both server and client.
## Install
```bash
npm install redux-fetch-data --save
```## Usage
### Initial setup
#### On the server
Here is an example setup of a simple server. In this example we used Express, but any server framework will do.
```js
import Express from 'express';
import React from 'react';
import { renderToString } from 'react-dom/server';
import { match, RouterContext } from 'react-router';
import { createStore, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import { fetchDataOnServer, reducer as fetching } from 'redux-fetch-data';
import createHistory from 'react-router/lib/createMemoryHistory';import routes from '../../routes';
const app = Express();
// Renders the actual HTML page
function renderHtml(html, state) {
return `
${html}
`;
}// Register the rendering middleware
app.use((req, res) => {
const history = createHistory(req.originalUrl);
const store = createStore(combineReducers({ fetching }));match({ routes, location: req.url }, (err, redirect, renderProps) => {
// Fetch data
fetchDataOnServer(renderProps, store).then(() => {
// Data has been fetched, resolve request
if (err) {
res.status(500).send(err.message);
} else if (redirect) {
res.redirect(redirect.pathname + redirect.search);
} else if (renderProps) {
// Render the root component
const html = renderToString((
));// Send the rendered page back to the client
res.status(200).send(renderHtml(html, store.getState()));
} else {
res.status(404).send('Not found.');
}
});
});
});app.listen(3000);
```#### On the client
Here is an example of a client-side entry script.
```js
import React from 'react';
import { createStore, combineReducers } from 'redux';
import { render } from 'react-dom';
import { Router, browserHistory } from 'react-router';
import { Provider } from 'react-redux';
import { FetchData, reducer as fetching } from 'redux-fetch-data';import routes from './routes';
// Hydrate the initial state from the server state
const initialState = window.__INITIAL_STATE__;
const store = createStore(combineReducers({ fetching }), initialState);render(
}
history={browserHistory}
routes={routes}/>
,
document.getElementById('root')
);
```### Fetching data
Instead of loading data in `componentWillMount`, move that logic to a static `fetchData` method.
This method should return a promise. Also, make sure you only fetch data from your containers
(top-level components), and pass down the data as props to sub-components.```js
export class Foo extends Component {
static fetchData() {
// this method should return a promise
}
.....
}
```**Protip!** You can use `Promise.all` to combine multiple promises into one.
## Tests
Run the test suite:
```bash
npm test
```Run the test suite in watch mode:
```bash
npm run test:watch
```Generate the code coverage report:
```bash
npm run test:cover
```## License
See [LICENSE](LICENSE).