npm xstate 4.6.2

latest releases: 4.33.1, 4.33.0, 5.0.0-alpha.0...
3 years ago


  • 🎭 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.


  • ⚙️ machine.withContext() now internally uses original config, not machine definition. #491


  • 🤝 xstate is now a peer dependency.


  • 🤖 You can now specify machine config directly in useMachine(...) options:
const [current, send] = useMachine(someMachine, {
  actions: {
    doThing: doTheThing
  services: {/* ... */},
  guards: {/* ... */},
  // ... etc.

Don't miss a new xstate release

NewReleases is sending notifications on new releases.