# Usage with Vue
These XState v4 docs are no longer maintained
XState v5 is out now! Read more about XState v5 (opens new window) and check out the XState v5 docs (opens new window).
Usage of XState in a Vue application may vary depending on which version of Vue your application is running. This page focuses on Vue 2 only. To see how to use XState with Vue 3 check the documentation for the XState @xstate/vue package.
There are two ways you can use XState with Vue 2:
- Since Vue
^2.7: using theuseMachinehook provided by thexstate-vue2package (opens new window) (3rd-party) plugin; - Using XState
interpretutility to create a service and inject it into your app.
TIP
If you want to use the Vue Composition API, we recommend using the following packages:
@xstate/vuepackage for Vue 3xstate-vue2package (opens new window) (3rd-party) for Vue^2.7
Vue follows a similar pattern to React:
- The machine can be defined externally;
- The service is placed on the
dataobject; - State changes are observed via
service.onTransition(state => ...), where you set some data property to the nextstate; - The machine's context can be referenced as an external data store by the app. Context changes are also observed via
service.onTransition(state => ...), where you set another data property to the updated context; - The service is started (
service.start()) when the component iscreated(); - Events are sent to the service via
service.send(event).
The following recipes use the following toggleMachine:
import { createMachine } from 'xstate';
// This machine is completely decoupled from Vue
export const toggleMachine = createMachine({
id: 'toggle',
context: {
/* some data */
},
initial: 'inactive',
states: {
inactive: {
on: { TOGGLE: 'active' }
},
active: {
on: { TOGGLE: 'inactive' }
}
}
});
# Using useMachine hook from xstate-vue2 plugin
<!-- toggle.vue -->
<!-- Top level bindigs are pre-processed via "setup" -->
<script setup>
import { useMachine } from 'xstate-vue2';
import toggleMachine from '../path/to/toggleMachine';
const { state, send } = useMachine(toggleMachine);
</script>
<template>
<main>
<button @click="send('TOGGLE')">
{{ state.value === "inactive" ? "Click to activate" : "Active! Click to
deactivate" }}
</button>
</main>
</template>
# Using XState interpret
<!-- Toggle.vue -->
<template>
<button v-on:click="send('TOGGLE');">
{{ current.matches("inactive") ? "Off" : "On" }}
</button>
</template>
<script>
import { interpret } from 'xstate';
import { toggleMachine } from '../path/to/toggleMachine';
export default {
name: 'Toggle',
created() {
// Start service on component creation
this.toggleService
.onTransition((state) => {
// Update the current state component data property with the next state
this.current = state;
// Update the context component data property with the updated context
this.context = state.context;
})
.start();
},
data() {
return {
// Interpret the machine and store it in data
toggleService: interpret(toggleMachine),
// Start with the machine's initial state
current: toggleMachine.initialState,
// Start with the machine's initial context
context: toggleMachine.context
};
},
methods: {
// Send events to the service
send(event) {
this.toggleService.send(event);
}
}
};
</script>