Переход определяет, каким будет следующее состояние, учитывая текущее состояние и событие, определенные в его свойстве on: {...}. Это можно увидеть, передав событие в метод перехода:
Многие нативные события, такие как события DOM, совместимы и могут использоваться напрямую с XState, указав тип события в свойстве type:
1 2 3 4 5 6 7 8 91011121314151617181920
import{createMachine,interpret}from'xstate';constmouseMachine=createMachine({on:{mousemove:{actions:[(context,event)=>{const{offsetX,offsetY}=event;console.log({offsetX,offsetY});},],},},});constmouseService=interpret(mouseMachine).start();window.addEventListener('mousemove',(event)=>{// event can be sent directly to servicemouseService.send(event);});
Синтаксис нулевого события ({on: {'': ...}}) будет устаревшим в версии 5. Вместо него следует использовать новый синтаксис always.
Нулевое событие (null event) — это событие, которое не имеет типа и происходит сразу после входа в состояние. В переходах оно представлено пустой строкой (''):
// contrived exampleconstskipMachine=createMachine({id:'skip',initial:'one',states:{one:{on:{CLICK:'two'},},two:{// null event '' always occurs once state is entered// immediately take the transition to 'three'on:{'':'three'},},three:{type:'final',},},});const{initialState}=skipMachine;constnextState=skipMachine.transition(initialState,'CLICK');console.log(nextState.value);// => 'three'
Существует много вариантов использования нулевых событий, особенно при определении переходов, когда (потенциально проходное) состояние сразу определяет, какое следующее состояние должно быть основано на защитных функциях:
constisAdult=({age})=>age>=18;constisMinor=({age})=>age<18;constageMachine=createMachine({id:'age',context:{age:undefined},// age unknowninitial:'unknown',states:{unknown:{on:{// immediately take transition that satisfies conditional guard.// otherwise, no transition occurs'':[{target:'adult',cond:isAdult},{target:'child',cond:isMinor},],},},adult:{type:'final'},child:{type:'final'},},});console.log(ageMachine.initialState.value);// => 'unknown'constpersonData={age:28};constpersonMachine=ageMachine.withContext(personData);console.log(personMachine.initialState.value);// => 'adult'