Features
- 🎭 Machines can now keep in sync with spawned child machines when setting
spawn(..., { sync: true })
(false
by default). This means that the parent machine will receive a special"xstate.update"
action with the updated actor state and the actor ID:
// ...
actions: assign({
myTodo: spawn(todoMachine, { sync: true }) // keeps myTodo.state in sync
})
// ...
This will keep sync with the referenced actor's state, by mutating the actorRef.state
property with the new actor state. When doing change detection, do not rely on actorRef
to change - that will always stay constant (unless reassigned). Instead, keep a previous reference to its state and compare it:
const state = currentState.context.myTodo.state;
// ... assume an "xstate.update" event was sent
const nextState = currentState.context.myTodo.state;
state === nextState;
// => false
⚠️ Also, be careful when using { sync: true }
because an "xstate.update"
event will occur for every single state transition in every spawned actor, which will make the service more "chatty". Always prefer explicit updates.
Fixes
- ⚙️
machine.withContext()
now internally uses original config, not machine definition. #491
@xstate/graph
- 🤝
xstate
is now a peer dependency.
@xstate/react
- 🤖 You can now specify machine config directly in
useMachine(...)
options:
const [current, send] = useMachine(someMachine, {
actions: {
doThing: doTheThing
},
services: {/* ... */},
guards: {/* ... */},
// ... etc.
});