GithubHelp home page GithubHelp logo

vue-zustand's Introduction

vue-zustand

State-management solution for Vue 3 based on zustand.

Vue 2 users can use this solution.

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)

If you want to construct a single object with multiple state-picks inside, similar to redux's mapStateToProps, you can tell zustand that you want the object to be diffed shallowly by passing the shallow equality function.

import shallow from 'zustand/shallow'

// Object pick, updates either state.bears or state.bulls change
const { bears, bulls } = useStore(
  state => ({ bears: state.bears, bulls: state.bulls }),
  shallow,
)

// Array pick, updates either state.bears or state.bulls change
const [bears, bulls] = useStore(state => [state.bears, state.bulls], shallow)

Nuxt

// 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

vue-zustand's People

Contributors

wobsoriano avatar zikoat avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

fgyweb

vue-zustand's Issues

Would this library work with vue 2.7.X?

I'm trying to use Zustand to share state management between React/Vue but I'm bound to 2.7. I see that vue3 is used in the deps, would this work with vue 2.7 as well?

Question: Can I use an already created store?

Hi, I am completely new to zustand, and i want to use the same zustand store in both vue2 and react. An update to a variable in react should update the state in vue2, and vice versa.

In the example in the readme, you create and export a new store, but i would like to reuse the existing store which i have created in react.

Is it possible to pass an existing store to create? Or should a new store be created differently?
The only way i see this would be possible, is to watch for any changes in the store and then use useStore.setState to update the whole state, but i don't think this is the correct way to move forward.

I might fork this repo to implement this for our own codebase, but i thought i would ask first as I'm not that experienced with zustand. Which changes would have to be made to the codebase to use and sync the store between react and vue2?

Problem with exports

Hi! I've noticed that the exports part in the package.json is different than the files generated on build.

This is the package.json:

  "exports": {
    "require": "./dist/index.js",
    "import": "./dist/index.mjs"
  },

But the files generated are .js and .cjs. Reading the documentation on tsup (the tool used on the build-fast script) it states that that happens if the type is set to module on package.json https://tsup.egoist.sh/#bundle-formats

Maybe it's better to change the type of the package? Or change the filenames on the exports on the package.json?

Thanks for your hard work!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.