Skip to main content

Actions

Actions can be defined with the actions property in defineModel() and they are perfect to define business logic:

export const counterModel = defineModel({
state: {
count: 0,
},
actions: {
// since we rely on `this`, we cannot use an arrow function
increment() {
this.count++
},
randomizeCounter() {
this.count = Math.round(100 * Math.random())
},
},
})

Actions get access to the whole model instance through this with full typing (and autocompletion ✨) support. actions can be asynchronous, you can await inside of actions any API call or even other actions!

export const useUsers = defineModel({
state: {
userData: null,
},
actions: {
async registerUser(login, password) {
try {
this.userData = await api.post({ login, password })
showTooltip(`Welcome back ${this.userData.name}!`)
} catch (error) {
showTooltip(error)
// let the form component display the error
return error
}
},
},
})

You are also completely free to set whatever arguments you want and return anything. When calling actions, everything will be automatically inferred!

Actions are invoked like methods:

const counter = store.getModel('counter', counterModel)
// call the action as a method of the model
counter.randomizeCounter()