Skip to content

Instantly share code, notes, and snippets.

@JeremyRH
Created November 5, 2018 15:47
Show Gist options
  • Save JeremyRH/da2e9ac7e08091da617076a6c70c4047 to your computer and use it in GitHub Desktop.
Save JeremyRH/da2e9ac7e08091da617076a6c70c4047 to your computer and use it in GitHub Desktop.
import { useState, useEffect } from 'react';
function sharedState(getState) {
const setters = new Set();
return [
() => {
const currentState = getState();
const setter = useState(currentState)[1];
useEffect(() => {
setters.add(setter);
return () => setters.delete(setter);
}, []);
return currentState;
},
action => (...args) => {
const result = action(...args);
setters.forEach(setter => setter(getState));
return result;
}
];
}
// example
const [useSharedCount, setAction] = sharedState(() => state);
const state = {
a: {
b: 0
}
};
const increment = setAction(() => {
state.a.b++;
});
const decrement = setAction(() => {
state.a.b--;
});
const setCount = setAction(value => {
state.a.b = value;
});
export {
useSharedCount,
increment,
decrement,
setCount
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment