0

采取以下代码:

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”中的一些定量数据设置警告的最佳方式吗?

4

1 回答 1

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 })
      }
    })

这意味着:当机器收到“警告”事件时,立即进入bar状态,然后再更新上下文。

动作不会立即触发。.actions相反,从 machine.transition(...) 返回的 State 对象将以声明方式提供解释器随后可以执行的数组。

通过守卫后将启用转换

根据您想要实现的目标,可能证明有用的其他代码示例:


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
      }
    })
于 2020-01-09T14:17:20.357 回答