Skip to content

Instantly share code, notes, and snippets.

@davidbarratt
Last active August 4, 2019 03:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidbarratt/f3eb75b3b8653a00ca01ed6abca6811f to your computer and use it in GitHub Desktop.
Save davidbarratt/f3eb75b3b8653a00ca01ed6abca6811f to your computer and use it in GitHub Desktop.
RxJS with React Hook
function createSearchSubject() {
return (new Subject()).pipe(
// Whatever you want to do, but the end result should be an action object.
)
}
const initialState = {
search: '',
};
function reducer(state, action) {
switch (action.type) {
case 'CHANGE':
return {
...state,
[action.name]: action.value
};
}
}
function Awesome() {
const { current: subject } = useRef(() => createSearchSubject());
const [state, dispatch] = useReducer(reducer, initialState);
const handleChange = ({ name, value }) => {
dispatch({ action: 'CHANGE', name, value, });
};
useEffect(() => {
const sub = subject.subscribe(action => dispatch(action));
return () => sub.unsubscribe();
}, [])
useEffect(() => {
subject.next(state.search);
}, [state.search]);
return (
<input type="text" name="search" value={state.search} onChange={handleChange} />
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment