react-list-provider v1.1.1
React List Provider
Use Context to save lists of whatever you want, then access them anywhere in your componpent tree.
index.js
import { ListProvider } from 'react-list-provider';
import App from './app';
import ReactDOM from 'react-dom';
ReactDOM.render(
<ListProvider name="notifications">
<App />
</ListProvider>,
document.body
);app.js
const { useList } = require('react-list-provider');
export const App = () => {
const { addItem, items } = useList({ name: 'notifications' });
return (
<div>
{items.map((item) => (
<div>Notification: {item.message}</div>
))}
Example application
<button
onClick={() => addItem({ id: Date.now().toString(), message: 'Hi' })}
>
Say hi
</button>
</div>
);
};Installation
yarn add react-list-provideror, for npm:
npm install --save react-list-providerAPI
import { ListProvider, ListConsumer, useList, withListManager } from 'react-list-provider';<ListProvider>
A React Context Provider for an instance of a list of items.
<ListProvider name="notifications" keyBy="id">
<App />
</ListProvider>Props
| Prop | isRequired | Description |
|---|---|---|
name | ✅ | A unique name used to identify the list. Must match a corresponding usage of useList/withListManager/ListConsumer |
keyBy | Enforce uniqueness by setting a key to use when adding items. For example, setting 'id' will ensure all added items have a unique 'id' field. If omitted, no uniqueness will be enforced, and only items/addItems/clearItems methods are exposed on the context. |
List Methods
Each of useList/withListManager/ListConsumer return a context object which
contains the following keys:
| Type | Description | |
|---|---|---|
items | Array<Item> | The list items as added with addItem |
addItem | Function(<Item>): void | Add an individual item to the list. If the <ListProvider> has keyBy set, the item passed to addItem must contain that field. |
clearItems | Function(): void | Remove all items from the list. |
updateItem* | Function(key, <Item>): void | Update a single item in the list. Performs a shallow merge. |
removeItem * | Function(key): void | Remove a single item from the list. |
removeItems * | Function(key): void | Remove multiple items from the list. |
hasItem * | Function(key): Boolean | Check if an item in the list has the given key. |
getItem * | Function(): <Item> | Retrieve the item in the list with the given key (or undefined). |
* Only available when keyBy is set on the <ListProvider>
<ListConsumer>
A React Context Consumer, used to access the list methods.
<ListConsumer name="notifications">
{(context) => {
// context.items, context.addItem, ...etc
return <App />;
}}
</ListConsumer>Props
| Prop | isRequired | Description |
|---|---|---|
name | ✅ | A unique name used to identify the list. Must match a corresponding usage of <ListProvider> |
useList(config)
A React Hook, used to access the list methods.
const Component = () => {
const { items, addItem, ...etc } = useList({ name: 'notifications' });
return <App />;
};config
| isRequired | Description | |
|---|---|---|
name | ✅ | A unique name used to identify the list. Must match a corresponding usage of <ListProvider> |
withListManager(Component, config)
Creates a React Higher Order Component which injects a prop named listManager;
an object containing the list methods.
const Component = ({ listManager }) => {
// listManager.items, listManager.addItem, etc...
return <App />;
};
const ComponentWithList = withListManager(Component, { name: 'notifications' });Component
The existing React component to inject the prop listManager into.
config
| isRequired | Description | |
|---|---|---|
name | ✅ | A unique name used to identify the list. Must match a corresponding usage of <ListProvider> |
Nested Providers
It's possible to nest <ListProvider>s, enabling multiple lists to co-exists.
Nested Providers must be given a unique name to differentiate them:
import { ListProvider, ListConsumer } from 'react-list-provider';
const App = () => (
<ListProvider name="accounts">
<ListProvider name="notifications">
<ListConsumer name="notifications">
{({ addItem }) => (
<button onClick={() => addItem('Hello')}>Add Notification</button>
)}
</ListConsumer>
<ListConsumer name="accounts">
{({ addItem }) => (
<button onClick={() => addItem('Jess')}>Add Account</button>
)}
</ListConsumer>
</ListProvider>
</ListProvider>
);