首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在nuxt可组合中使用XState

在nuxt可组合中使用XState
EN

Stack Overflow用户
提问于 2022-10-25 16:25:39
回答 1查看 42关注 0票数 1

我想在Nuxt 3中使用xstate机器,它用于多个组件。我创建了一个小例子,说明我希望这个样子。

我还使用了诺克斯特模块。

状态机:

代码语言:javascript
复制
export default createMachine(
    {
        id: 'toggle',
        initial: 'switched_off',
        states: {
            switched_on: {
                on: {
                    SWITCH: {
                        target: 'switched_off'
                    }
                }
            },
            switched_off: {
                on: {
                    SWITCH: {
                        target: 'switched_on'
                    },
                }
                
            },
        },

    }

)

可合成的:

代码语言:javascript
复制
const toggle = useMachine(toggleMachine)

export function useToggleMachine(){
    return { toggle }
}

app.vue:

代码语言:javascript
复制
<template>
  <div>
    State: {{toggle.state.value.value}}
  </div>
  <br />
  <button
    @click="toggle.send('SWITCH')"
  >
      Switch
  </button>
</template>

<script>
    import { useToggleMachine } from '~/composables/toggle_machine'
    export default { 
        setup(){
            const { toggle } = useToggleMachine()


            return { toggle }
        }
    }
</script>

问题是,我可以查看机器{state.value.value}的状态,给出预期的“关闭”。但我不能把这些事件称为国家间的过渡。单击按钮时,什么都不会发生。

下面是传递的‘切换’对象的console.log:

是否有人知道如何修复此问题,或如何在多个组件上使用xstate状态机。我知道道具能起作用,但我真的不想有这样的分级方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-27 03:43:07

在Nuxt3中,它非常简单:

composables/states.ts

代码语言:javascript
复制
import { createMachine, assign } from 'xstate';
import { useMachine } from '@xstate/vue';

const toggleMachine = createMachine({
  predictableActionArguments: true,
  id: 'toggle',
  initial: 'inactive',
  context: {
    count: 0,
  },
  states: {
    inactive: {
      on: { TOGGLE: 'active' },
    },
    active: {
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
      entry: assign({ count: (ctx: any) => ctx.count + 1 }),
      on: { TOGGLE: 'inactive' },
    },
  },
});
export const useToggleMachine = () => useMachine(toggleMachine);

pages/counter.vue

代码语言:javascript
复制
<script setup>
const { state, send } = useToggleMachine()
</script>

<template>
  <div>
    <button @click="send('TOGGLE')">
      Click me ({{ state.matches("active") ? "✅" : "❌" }})
    </button>
    <code>
      Toggled
      <strong>{{ state.context.count }}</strong> times
    </code>
  </div>
</template>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74197308

复制
相关文章

相似问题

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