XState中如何在状态转换时传递动态参数?
我在用XState实现表单提交流程时遇到问题,想根据后端返回的状态跳转不同状态。比如提交成功跳转”success”,验证失败跳转”error”类型。我尝试在transition里写when: {src: 'submitting', cond: (ctx, e) => e.data.status === 'success'},但发现event里的参数总是undefined。
之前尝试把后端响应存到context里:
const formMachine = createMachine({
states: {
submitting: {
invoke: {
src: 'submitForm',
onDone: {
target: 'success',
actions: assign({
response: (_, e) => e.data // 这里能拿到数据
})
}
}
}
}
})
但在状态转换条件里读取不到response数据,直接报错”e.data is not defined”,应该怎样正确传递动态参数到转换条件里?
正确的做法是在onDone的时候把数据作为事件载荷发送出去,然后在transition条件中使用。你需要改两处:
先把invoke的onDone改成用target函数动态跳转:
重点来了:默认情况下invoke的response会通过e.data自动传给onDone,但前提是你的异步函数要正确返回数据。比如你定义src: 'submitForm'时:
如果你还想把数据存到context里,可以加个assign动作:
记住核心点:invoke完成后的数据是通过onDone事件的e.data传递的,不是存在context里再读。很多人像我当初一样,总想着先assign再判断,结果发现cond执行时context还没更新,白白浪费几个小时调试。
onDone: {
target: 'success',
actions: assign({
response: (_, e) => e.data
})
}