首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XState,如何在操作中访问当前状态的名称?

使用XState,如何在操作中访问当前状态的名称?
EN

Stack Overflow用户
提问于 2022-05-02 18:23:44
回答 2查看 844关注 0票数 2

我正在学习XState,并希望在一台机器中包含一个操作,该操作只记录当前状态到控制台。

定义这样一个简单的示例机器,我会怎么做呢?还请注意代码中注释中的问题。

代码语言:javascript
复制
import { createMachine, interpret } from "xstate"

const sm = createMachine({
    initial: 'foo',
    states: {
        foo: {
            entry: 'logState', // Can I only reference an action by string?
                               // Or can I add arguments here somehow?
            on: {
                TOGGLE: {target: 'bar'}
            }
        },
        bar: {
            entry: 'logState',
            on: {
                TOGGLE: {target: 'foo'}
            }
        }
    }
},
{
    actions: {
        logState(/* What arguments can go here? */) => {
            // What do I do here?
        }
    }
});

我知道以contextevent作为参数调用操作,但我看不到从这两个参数中获取当前状态的方法。我是不是漏掉了什么?

EN

回答 2

Stack Overflow用户

发布于 2022-07-20 21:07:13

对于像您这样的简单用例,您可以尝试在转换时记录状态。

代码语言:javascript
复制
let currentState;
const service = interpret(machine).onTransition(state => {
   if (state.value != currentState) {
       // TODO: terminate timer if any and start a new one
      currentState = state.value;
   }
});

然后在您的操作中使用该值。

请参阅这里的更多内容:https://github.com/statelyai/xstate/discussions/1294

票数 0
EN

Stack Overflow用户

发布于 2022-07-21 09:50:24

操作接收三个参数- contexteventmetameta具有属性state,该属性为当前状态。

代码语言:javascript
复制
import { createMachine } from "xstate";

let metaDemo = createMachine(
  {
    id: "meta-demo",
    initial: "ping",
    states: {
      ping: {
        entry: ["logStateValues"],
        after: { TIMEOUT: "pong" },
      },
      pong: {
        entry: ["logStateValues"],
        after: { TIMEOUT: "ping" },
      },
    },
  },
  {
    delays: {
      TIMEOUT: 3000,
    },
    actions: {
      logStateValues(ctx, event, meta) {
        if (meta.state.matches("ping")) {
          console.log("It's PING!");
        } else if (meta.state.matches("pong")) {
          console.log("And now it's PONG");
        } else {
          console.log(
            `This is not supposed to happen. State is: ${meta.state
              .toStrings()
              .join(".")}`
          );
        }
      },
    },
  }
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72090829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档