You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React XState v5中如何监听onDone事件?

XState v5 监听最终状态的实现方式

在XState v5中,useMachine返回的ActorRef不再提供onDone方法,你可以通过以下两种方式实现最终状态的监听:

方式一:React惯用的状态监听法

通过useMachine获取状态,结合useEffect监听状态变化,判断是否进入最终状态后执行逻辑:

import { useMachine } from '@xstate/react';
import { useEffect } from 'react';

// 假设你的状态机包含名为completed的最终状态
const fsm = createMachine({
  states: {
    // ...其他业务状态
    completed: { type: 'final' }
  }
});

function YourComponent(props) {
  const [state] = useMachine(fsm);

  useEffect(() => {
    // 两种判断最终状态的方式:
    // 1. 判断状态是否为done状态(适用于任何最终状态)
    if (state.status === 'done') {
      props.submit(state.context);
    }
    // 2. 匹配具体的最终状态节点
    // if (state.matches('completed')) {
    //   props.submit(state.context);
    // }
  }, [state, props.submit]);

  // ...组件其他逻辑
}

这种方式完全贴合React的状态监听习惯,适合需要在组件层面灵活处理最终状态逻辑的场景。

方式二:将动作内聚到状态机中

按照XState的设计理念,把最终状态的处理逻辑直接定义在状态机内部,通过输入参数注入组件的方法:

import { useMachine, createMachine } from '@xstate/react';

const fsm = createMachine({
  schema: {
    // 定义输入参数类型,确保类型安全
    input: {} as { submit: (context: YourContextType) => void }
  },
  states: {
    // ...其他业务状态
    completed: {
      type: 'final',
      // 进入最终状态时执行提交逻辑
      entry: ({ input, context }) => {
        input.submit(context);
      }
    }
  }
});

function YourComponent(props) {
  const [state] = useMachine(fsm, {
    // 将组件的submit方法作为输入传入状态机
    input: { submit: props.submit }
  });

  // ...组件其他逻辑
}

这种方式把状态与对应的动作逻辑内聚,更符合状态机的设计原则,适合逻辑与状态强绑定的场景。

内容的提问来源于stack exchange,提问作者user1972265

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:50:09