Переходный переход, который устанавливает значение только при выполнении условия

Возьмите следующий код:

const isWarning = () => { ... }
const setWarning = () => { ... }

const machine = Machine({
  initial: "foo",
  context: {
    warning: null
  },
  states: {
    foo: {
      on: {
        "": [
          target: "bar",
          action: "setWarning",
          cond: "isWarning",
        ]
      }
    },
    bar: {
      on: {
        FOO: "foo,
      }
    }
  }
}, {
  actions: {
    setWarning
  }
  guards: {
    isWarning
  }
});

Это лучший способ перейти к "bar" и установить предупреждение на основе некоторых количественных данных в "foo"?


person Paul Razvan Berg    schedule 18.11.2019    source источник


Ответы (1)


Учитывая опубликованный пример кода, я не уверен, что вы подразумеваете под "количественными данными в foo". Данные, относящиеся к поведению машины, могут храниться в свойстве context машины или в свойстве meta состояния. Для перехода в состояние bar и установите предупреждение, вам может понадобиться что-то вроде:


    const sm = Machine({
      initial: 'baz',
      context: { wasWarned: false },
      on: {
        'WARNING': {
            target: 'bar',
            action: 'setWarning'     
        }
      },
      states: {
        baz: {},
        bar: {}
      }  
    }, {
      actions: {
        setWarning: assign({ warning: true })
      }
    })

Это означает: когда машина получает событие 'WARNING', переходите в состояние bar И немедленно прежде всего обновить контекст.

Действия запускаются не сразу. Вместо этого объект State, возвращаемый из machine.transition(...), декларативно предоставляет массив .actions, который затем может выполнить интерпретатор.

переход будет включен после< /strong> охрана пройдена.

Другой пример кода, который может оказаться полезным в зависимости от того, чего вы хотите достичь:


const sm = Machine({
      initial: 'pending',
      context: { wasWarned: null },
      states: {
        pending: {
          on: {
            '': [
             {target: 'bar', cond:'wasWarned'},
             {target: 'baz', cond: 'otherCond'} 
            ]
          }
        },
        bar: {},
        baz: {}
      },
      guards: {
        wasWarned: (ctx) => ctx.wasWarned
      }
    })
person Tdk    schedule 09.01.2020