美文网首页
Pinia的基本使用

Pinia的基本使用

作者: 一只小vivi | 来源:发表于2023-05-08 11:29 被阅读0次

    Pinia

    Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态

    • dev-tools 支持
      跟踪动作、突变的时间线
      Store 出现在使用它们的组件中
      time travel 和 更容易的调试
    • 热模块更换
      在不重新加载页面的情况下修改您的 Store
      在开发时保持任何现有状态
    • 插件:使用插件扩展 Pinia 功能
    • 为 JS 用户提供适当的 TypeScript 支持或
    • autocompletion
    • 服务器端渲染支持

    定义一个store

    Store 是使用 defineStore() 定义的,并且它需要一个唯一名称,作为第一个参数传递:

    import { defineStore } from 'pinia'
    
    // useStore 可以是 useUser、useCart 之类的任何东西
    // 第一个参数是应用程序中 store 的唯一 id
    export const useStore = defineStore('counter', {
        return {
         // other options...
        };
    })
    

    这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use... 是跨可组合项的约定,以使其符合你的使用习惯。

    使用store

    我们正在定义一个store,因为setup()调用之前不会创建store:

    import { useStore } from '@/stores/counter'
    export default {
     setup() {
       const store = useStore()
       return {
         // 您可以返回整个 store 实例以在模板中使用它
         store,
       }
     },
    }
    

    请注意,store是一个用reactive 包裹的对象,这意味着不需要在getter 之后写.value,但是,就像setup中的props一样,我们不能对其进行解构:

    export default defineComponent({
      setup() {
        const store = useStore()
        // ❌ 这不起作用,因为它会破坏响应式
        // 这和从 props 解构是一样的
        const { name, doubleCount } = store
    
        name // "eduardo"
        doubleCount // 2
    
        return {
          // 一直会是 "eduardo"
          name,
          // 一直会是 2
          doubleCount,
          // 这将是响应式的
          doubleValue: computed(() => store.doubleCount),
          }
      },
    })
    

    为了从 Store 中提取属性同时保持其响应式,您需要使用storeToRefs()。 它将为任何响应式属性创建 refs。 当您仅使用 store 中的状态但不调用任何操作时,这很有用:

    import { storeToRefs } from 'pinia'
    export default defineComponent({
      setup() {
        const store = useStore()
        const { name, doubleCount } = storeToRefs(store)
        return {
          name,
          doubleCount
        }
      },
    })
    

    State

    访问 state

    默认情况下,您可以通过 store 实例访问状态来直接读取和写入状态:

    const store = useStore()
    store.counter++
    
    重置状态

    您可以通过调用 store 上的 $reset() 方法将状态 重置 到其初始值:

    const store = useStore()
    store.$reset()
    
    改变状态

    可通过$patch批量修改状态

    store.$patch({
      counter: store.counter + 1,
      name: 'Abalam',
    })
    

    但是,使用这种语法应用某些突变非常困难或代价高昂:任何集合修改(例如,从数组中推送、删除、拼接元素)都需要您创建一个新集合。 正因为如此,$patch 方法也接受一个函数来批量修改集合内部分对象的情况:

    cartStore.$patch((state) => {
      state.items.push({ name: 'shoes', quantity: 1 })
      state.hasChanged = true
    })
    
    替换state

    您可以通过将其 $state 属性设置为新对象来替换 Store 的整个状态:

    store.$state = { counter: 666, name: 'Paimon' }
    

    您还可以通过更改 pinia 实例的 state 来替换应用程序的整个状态。 这在 SSR for hydration 期间使用。

    pinia.state.value = {}
    

    Getters

    Getter 完全等同于 Store 状态的 计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个参数以鼓励箭头函数的使用:

    export const useStore = defineStore('main', {
      state: () => ({
        counter: 0,
      }),
      getters: {
        doubleCount: (state) => state.counter * 2,
      },
    })
    

    Actions

    Actions 相当于组件中的methods。 它们可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑

    export const useStore = defineStore("storeId", {
      state: () => {
        return {
          count: 10
        }
      },
      actions: {
        changeCount(val) {
          this.count += val;
        }
      }
    })
    

    并在组件中使用

    <script>
    export default {
      setup() {
       const store = useStore()
       const addClick = () => {
       store.changeCount(40);
    };
        return { store }
      }
    }
    </script>
    

    https://pinia.web3doc.top/introduction.html#%E4%B8%80%E4%B8%AA%E6%9B%B4%E7%8E%B0%E5%AE%9E%E7%9A%84%E4%BE%8B%E5%AD%90

    https://github.com/vuejs/pinia

    相关文章

      网友评论

          本文标题:Pinia的基本使用

          本文链接:https://www.haomeiwen.com/subject/jkflsdtx.html