定制设计Vue3:状态管理-Store(Vuex,Pinia)

定制设计什么是状态管理

        定制设计理论上来说,每一个 Vue 定制设计组件实例都已经在“管理”定制设计它自己的响应式状态了

        定制设计它是一个独立的单元,定制设计由以下几个部分组成

  • 状态:定制设计驱动整个应用的数据源;
  • 视图:对状态定制设计的一种声明式映射;
  • 交互:定制设计状态根据用户在视图定制设计中的输入而作出相应变更的可能方式。

Vuex和Pinia的区别

    Vuex:

          1.由state,getters,,actions,modules组成

           2.通过mutations修改state

       优点:

                支持调试功能,如时间旅行和编辑

                适用于大型、高复杂度的Vue.

  ​​​​​​       缺点:

                 服务器端呈现的,则会将您的应用程序暴露给安全漏洞

                getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果。

    Pinia:   

                1.由state,getters,actions组成

                2.通过getters,actions修改state,也可以通过$patch

        优点:

                完整的 TypeScript 支持:与在 Vuex 中添加 TypeScript 相比,添加 TypeScript 更容易

                极其轻巧(体积约 1KB)

                store 的 action 被调度为常规的函数调用,而不是使用 dispatch 方法或 MapAction 辅助函数,这在 Vuex 中很常见

                支持多个Store

                支持 Vue devtools、SSR 和 webpack 代码拆分

        缺点:

                不支持时间旅行和编辑等调试功能

Vuex状态管理

        对于已经有过Vue2项目经验的来说,可能Vuex更加熟悉。

        Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

        安装:

        npm install vuex@next --save

        开始:

主页面:

<template>

  <div class="home">

    <div>Store:{{count}}</div>

    <ChildViewVue></ChildViewVue>

  </div>

</template>

<script lang="ts" setup>

import { reactive, ref, computed } from 'vue';

import ChildViewVue from './ChildView.vue';

import { useStore } from 'vuex';

const store = useStore();

console.log('const store = useStore();', store.state.count)

const count = computed(() => store.state.count)

</script>

子页面:

<template>

  <div class="ChildView">

    <button @click="clickChange">修改store</button>

  </div>

</template>

<script lang="ts" name="ChildView" setup>

import { ref, watch } from 'vue'

import { useStore } from 'vuex';

const store = useStore();

const clickChange = () => {

  let random = Math.floor(Math.random() * 10 + 1)

  store.commit('CHANGE_COUNT',random)

}

</script>

store:

import { createStore } from 'vuex';

export default createStore({

  state: {

    count: 0

  },

  getters: {},

  mutations: {

    CHANGE_COUNT(state: { count: any }, data: any) {

      state.count = data;

    }

  },

  actions: {},

  modules: {}

});

Pinia状态管理

     Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。如果您熟悉 Composition API,您可能会认为您已经可以使用简单的export const state = reactive({}). 这对于单页应用程序来说是正确的,但如果它是服务器端呈现的,则会将您的应用程序暴露给

  • 更强的团队协作约定
  • 与 Vue DevTools 集成,包括时间轴、组件内部审查和时间旅行调试
  • 模块热更新 (HMR)
  • 服务端渲染支持
npm install pinia

主页面:

<template>

  <div class="home">

    <div>pinia:{{count}}</div>

    <ChildViewVue></ChildViewVue>

  </div>

</template>

<script lang="ts" setup>

import { reactive, ref, computed } from 'vue';

import ChildViewVue from './ChildView.vue';

import { changeNum } from "@/store";

import { storeToRefs } from 'pinia'

const store = changeNum()

const { count } = storeToRefs(store)

</script>

子页面

<template>

  <div class="ChildView">

    <button @click="clickChange">修改store</button>

  </div>

</template>

<script lang="ts" name="ChildView" setup>

import { ref, watch } from 'vue'

import { changeNum } from "@/store";

const store = changeNum()

const clickChange = () => {

  let random = Math.floor(Math.random() * 10 + 1)

  store.CHANGE_COUNT(random)

}

</script>

store

import { defineStore } from 'pinia';

export const changeNum = defineStore('main', {

  state: () => ({ count: 0 }),

  getters: {},

  actions: {

    CHANGE_COUNT(data: any) {

      this.count = data;

    }

  }

});

main.ts

import { createApp } from 'vue'

import App from './App.vue'

import router from './router'

import { createPinia } from 'pinia'

createApp(App).use(createPinia()).use(router).mount('#app')

总结

        根据Vue官方回答:

        现有用户可能对  更熟悉,它是 Vue 之前的官方状态管理库。由于 Pinia 在生态系统中能够承担相同的职责且能做得更好,因此 Vuex 现在处于维护模式。它仍然可以工作,但不再接受新的功能。对于新的应用,建议使用 Pinia

        事实上,Pinia 最初正是为了探索 Vuex 的下一个版本而开发的,因此整合了核心团队关于 Vuex 5 的许多想法。最终,我们意识到 Pinia 已经实现了我们想要在 Vuex 5 中提供的大部分内容,因此决定将其作为新的官方推荐。

相比于 Vuex,Pinia 提供了更简洁直接的 API,并提供了组合式风格的 API,最重要的是,在使用 TypeScript 时它提供了更完善的类型推导

        总得来说,Vuex目前是能够满足我们日常项目需求,等Vuex下一个版本,可能就要使用Pinia了。

        

                

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发