Перейти к содержанию

Начальные состояния

Когда машина состояний запускается, она сначала входит в начальное состояние. Машина может иметь только одно начальное состояние верхнего уровня; если бы было несколько начальных состояний, машина не знала бы, с чего начать!

В XState начальное состояние определяется свойством initial в конфигурации машины:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const feedbackMachine = createMachine({
    id: 'feedback',

    // Начальное состояние
    initial: 'prompt',

    // Конечные состояния
    states: {
        prompt: {
            /* ... */
        },
        // ...
    },
});

В нашем видеоплеере paused является начальным состоянием, потому что видеоплеер по умолчанию приостановлен и требует взаимодействия пользователя для начала воспроизведения.

Указание начального состояния

Обычно машина состояний имеет несколько конечных состояний, в которых она может находиться. Свойство initial в конфигурации машины указывает начальное состояние, в котором машина должна начать работу.

Родительские состояния также должны указывать начальное состояние в своём свойстве initial. Следующая trafficLightMachine начнёт в состоянии 'green', как указано в свойстве initial конфигурации машины.

Когда машина достигает родительского состояния 'red', она также будет в состоянии 'red.walk', как указано в свойстве initial состояния 'red'.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { createMachine } from 'xstate';

const trafficLightMachine = createMachine({
    initial: 'green',
    states: {
        green: {
            /* ... */
        },
        yellow: {
            /* ... */
        },
        red: {
            initial: 'walk',
            states: {
                walk: {
                    /* ... */
                },
                wait: {
                    /* ... */
                },
                stop: {
                    /* ... */
                },
            },
        },
    },
});

const trafficLightActor = createActor(trafficLightMachine);

trafficLightActor.subscribe((state) => {
    console.log(state.value);
});

trafficLightActor.start();
// выводит 'green'

Комментарии