Created
January 23, 2022 10:08
-
-
Save send2moran/90588b7522d2b3de4b5bbca76ebe0910 to your computer and use it in GitHub Desktop.
useInterpret, useService, useSelector
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { useInterpret, useService, useSelector } from '@xstate/react' | |
const MyMachineService = React.createContext() | |
const useMyMachineService = () => { | |
const service = React.useContext(MyMachineService) | |
if (!service) { | |
throw new Error(`useMyMachineService() must be used in a child of <MyMachineProvider>`) | |
} | |
return service | |
} | |
const MyMachineProvider = (props) => { | |
const service = useInterpret(myMachine) | |
return <MyMachineService.Provider value={service}>{props.children}</MyMachineService.Provider> | |
} | |
const App = () => { | |
return <MyMachineProvider> | |
<SomeComponentThatCouldBeDeepInTheTree /> | |
</MyMachineProvider> | |
} | |
const SomeComponentThatCouldBeDeepInTheTree = () => { | |
const service = useMyMachineService() | |
// use service.send() to send events | |
React.useEffect(() => { | |
service.send({ type: 'TRIGGERED' }) | |
}, [someTrigger]) | |
// if you need only one value from the machine, use a selector | |
const value = useSelector(service, React.useCallback(state => state.context.value, [])) | |
// or if you need the whole state, use `useService()` | |
const [state] = useService(service) | |
//... | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment