vue-zustand
๐ป Bear necessities for Vue.
5,482
71
| Install | |
|---|---|
npm install vue-zustand |
|
| Latest Version: | 1.1.0 |
| Vue: | 3 |
| Older releases: | 2 |
| License: | MIT |
| Last Updated: | Oct 6, 2025 |
| Links: | GitHub · npm |
Maintainer: wobsoriano
vue-zustand
State-management solution for Vue based on zustand.
Install
npm install zustand vue-zustand
Usage
First create a store
Your store is a composable! You can put anything in it: primitives, objects, functions. State has to be updated immutably and the set function merges state to help it.
import create from 'vue-zustand'
interface BearState {
bears: number
increase: () => void
}
export const useStore = create<BearState>(set => ({
bears: 0,
increase: () => set(state => ({ bears: state.bears + 1 })),
}))
Then bind your components, and that's it!
Use the composable anywhere, no providers are needed.
<script setup>
import { useStore } from './store'
const bears = useStore(state => state.bears)
</script>
<template>
<h1>{{ bears }} around here ...</h1>
</template>
<script setup>
import { useStore } from './store'
const increase = useStore(state => state.increase)
</script>
<template>
<button @click="increase">
one up
</button>
</template>
Recipes
Fetching everything
const state = useStore()
Selecting multiple state slices
const nuts = useStore(state => state.nuts)
const honey = useStore(state => state.honey)
You can also construct a single object with multiple state-picks inside, similar to redux's mapStateToProps:
// Object pick, updates either state.bears or state.bulls change
const { bears, bulls } = useStore(state => ({ bears: state.bears, bulls: state.bulls }))
// Array pick, updates either state.bears or state.bulls change
const [bears, bulls] = useStore(state => [state.bears, state.bulls])
Nuxt
To support SSR, follow these Nuxt plugin instructions:
// plugins/zustand.ts
export default defineNuxtPlugin((nuxtApp) => {
if (process.server) {
nuxtApp.hooks.hook('app:rendered', () => {
const initialState = JSON.parse(JSON.stringify(useStore.getState()))
nuxtApp.payload.zustand = initialState
})
}
if (process.client) {
nuxtApp.hooks.hook('app:created', () => {
useStore.setState({
...useStore.getState(),
...nuxtApp.payload.zustand,
})
})
}
})
License
MIT
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 1.1.0 | ^3.2.0 | MIT | |
| 0.6.0 | >=3.2.0 | MIT | |
| 0.5.0 | >=3.2.0 | MIT | |
| 0.4.0 | >=3.2.0 | MIT | |
| 0.3.1 | >=3.2.0 | MIT | |
| 0.3.0 | >=3.2.0 | MIT | |
| 0.2.1 | ^3.2.0 | MIT | |
| 0.2.0 | ^3.2.0 | MIT | |
| 0.1.10 | ^3.2.0 | MIT | |
| 0.1.9 | ^3.2.0 | MIT | |
| 0.1.8 | ^3.2.0 | MIT | |
| 0.1.7 | ^3.2.0 | MIT | |
| 0.1.6 | ^3.2.0 | MIT | |
| 0.1.5 | >=3.2.0 | MIT | |
| 0.1.4 | >=3.2.0 | MIT | |
| 0.1.3 | >=3.2.0 | MIT | |
| 0.1.2 | >=3.2.0 | MIT | |
| 0.1.1 | >=3.2.0 | MIT | |
| 0.1.0 | >=3.2.0 | MIT | |
| 0.0.4 | ^2.0.0 || | MIT | |
| 0.0.3 | ^2.0.0 || | MIT | |
| 0.0.2 | ^2.0.0 || | MIT | |
| 0.0.1 | ^2.0.0 || | MIT |