diff --git a/snippets/useGetSet.md b/snippets/useGetSet.md
new file mode 100644
index 000000000..a564c59c1
--- /dev/null
+++ b/snippets/useGetSet.md
@@ -0,0 +1,44 @@
+---
+title: useGetSet
+tags: hooks,state,intermediate
+firstSeen: 2021-10-27T05:00:00-04:00
+---
+
+Creates a stateful value, returning a getter and a setter function.
+
+- Use the `useRef()` hook to create a ref that holds the stateful value, initializing it with `initialState`.
+- Use the `useReducer()` hook that creates a new object every time it's updated and return its dispatch.
+- Use the `useMemo()` hook to memoize a pair of functions. The first one will return the current value of the `state` ref and the second one will update it and force a re-render.
+
+```jsx
+const useGetSet = initialState => {
+ const state = React.useRef(initialState);
+ const [, update] = React.useReducer(() => ({}));
+
+ return React.useMemo(
+ () => [
+ () => state.current,
+ newState => {
+ state.current = newState;
+ update();
+ },
+ ],
+ []
+ );
+};
+```
+
+```jsx
+const Counter = () => {
+ const [getCount, setCount] = useGetSet(0);
+ const onClick = () => {
+ setTimeout(() => {
+ setCount(getCount() + 1);
+ }, 1_000);
+ };
+
+ return ;
+};
+
+ReactDOM.render(, document.getElementById('root'));
+```