The following is a small working example of a React app that uses the Contexto library.
import React, { useCallback, useRef } from "react";
import ReactDOM from "react-dom";
import { createContext, useContext, useContextUpdate } from "contexto";
const CounterContext = createContext({});
const useMemberEqual = (id) =>
useCallback((previous, current) => previous[id] === current[id], [id]);
const useMemberIncrement = (id) => {
const update = useContextUpdate(CounterContext);
return useCallback(
() => update(values => ({ ...values, [id]: values[id] + 1 }),
[update, id]));
};
function Counter({ id }) {
const isMemberEqual = useMemberEqual(id);
const increment = useMemberIncrement(id);
const count = useContext(CounterContext, isMemberEqual)[id];
return (
<tr>
<th>{id}:</th>
<td>{count}</td>
<td><button onClick={increment}>Increment</button></td>
<th>Render #{++renderCounts[id]}</th>
</tr>
);
}
const renderCounts = { count1: 0, count2: 0 };
function App() {
const ref = useRef();
const initialCounts = { count1: 0, count2: 0 };
return (
<table>
<tbody>
<CounterContext.Provider initialValue={initialCounts} ref={ref}>
<Counter id="count1" />
<Counter id="count2" />
</CounterContext.Provider>
<button onClick={ () => ref.current.update(initialCounts) }>Reset counters</button>
</tbody>
</table>
);
}
ReactDOM.render(<App />, document.getElementById('root'));