
用于 JavaScript 的 Vue 框架在构建用户界面和单页面应用程序(SPA)方面很受欢迎。为确保您的大型应用程序以更佳状态运行,您需要牢牢掌握状态管理,即管理和集中多个组件中的应用程序反应数据(状态)的过程。
在 Vue 中,状态管理长期以来一直依赖于 Vuex,这是一个为应用程序的所有组件提供集中存储的库。然而,Vue 生态系统的最新进展催生了 Vuex 的后继者 Pinia。
Pinia 提供了一种更加轻量级、模块化和直观的管理 *** 。它与 Vue 的反应系统和 Composition API 无缝集成,使开发人员可以轻松地以可扩展和可维护的方式管理和访问共享状态。
作为 Vue 应用程序状态管理的首选库,Vuex 为应用程序的所有组件提供了一个集中存储空间。然而,随着 Vue 的发展,Pinia 代表了一种更现代的解决方案。让我们探讨一下它与 Vuex 的不同之处。
要在 Vue 项目中集成 Pinia,请使用 Vue CLI 或 Vite 初始化项目。项目初始化后,可以通过 npm 或 yarn 将 Pinia 作为依赖关系安装。
// Using Vue CLI vue create my-vue-ap // Using Vite npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
// Using npm npm install pinia // Using yarn yarn add pinia
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
const app = createApp(App);
app.use(createPinia());
app.mount('#app'); 在 Vue 项目中安装并设置好 Pinia 后,就可以定义并使用存储来进行状态管理了。
Store 是 Pinia 驱动的 Vue 应用程序中状态管理的支柱。它可以帮助您以协调一致的方式管理应用程序范围内的数据。存储是您定义、存储和管理应用程序各组件间共享数据的地方。
这种集中化非常重要,因为它可以构建和组织应用程序的状态变化,使数据流更可预测,调试更简单。
此外,Pinia 中的存储不仅仅是保存状态: Pinia 附带的功能可让您通过操作更新状态,并通过获取器计算派生状态。这些内置功能有助于提高代码库的效率和可维护性。
下面的示例说明了如何在项目的 src/store.js 文件中创建一个基本的 Pinia store。
import { defineStore } from 'pinia';
export const useStore = defineStore('main', {
state: () => ({
count: 0,
}),
actions: {
increment() {
this.count++;
},
},
getters: {
doubleCount: (state) => state.count * 2,
},
});
与 Vuex 相比,Pinia 的状态访问和管理 *** 更加直观,尤其是如果您熟悉 Vue 3 的 Composition API。该 API 是一组能够在组件中包含反应性和可组合逻辑的 API。
请看下面的代码。
<template>
<div>{{ store.count }}</div>
</template>
<script>>
import { useStore } from './store';
export default {
setup() {
const store = useStore();
return { store };
},
}
</script>
在上述代码段中, <template> 标签包含了组件定义的 标记。要显示 Pinia store 中的 count 属性值,需要使用 Vue 的数据绑定语法,即 {{ count }}。
useStore 函数提供了对 Pinia store 的访问,因此您可以使用 import { useStore } 从 store.js 中 import { useStore } from './store';。
作为 Vue 3 的 Composition API 的一项功能,setup 函数定义了组件的反应状态和逻辑。然后在该函数中调用 useStore() 访问 Pinia store。
接着,const count = store.count 访问存储的 count 属性,使其在组件中可用。
最后,setup 返回 count,允许模板对其进行渲染。Vue 的反应性系统意味着,只要 store 中的 count 发生变化,组件的模板就会更新其值。
下面是输出的截图。

在浏览器中加载 Pinia store 演示模板的截图。
此示例说明了 Pinia 的优势:
mapState (或类似的助手)才能实现相同的访问。store.count),从而使您的代码更易读、更易懂。与此同时,Vuex 通常需要 getter 来访问即使是基本的属性,从而增加了复杂性,降低了可读性。在 Pinia 中,您可以使用动作来修改 store 的状态,这比 Vuex 的突变更灵活。请看下面的函数调用,它会增加状态的 count 属性:
store.increment(); // Increments the count
另一方面,Vuex 的等价 *** 除了定义至少一个动作外,还需要定义一个突变:
mutations: {
increment(state) {
state.count++;
},
},
actions: {
increment({ commit }) {
commit('increment');
},
}
Pinia 操作及其对应的 Vuex 代码体现了这两个库代码复杂度之间的重要差异。让我们进一步探讨这些差异:
increment 操作所展示的,Pinia 操作会直接改变存储的状态。在 Vuex 中,您只能使用突变来改变状态,而突变必须通过操作提交。这种流程分离确保了状态更改的可追踪性,但它比类似的 Pinia 操作更加复杂和僵化。过渡到 Pinia 可以在简单性、灵活性和可维护性方面带来诸多好处,但需要仔细规划和考虑,以确保成功实施。
在转换之前,请确保:
将存储从 Vuex 转换到 Pinia 需要几个步骤,以适应两者结构和 API 的差异。请看前面的 Pinia store。
在 Vuex store.js 文件中,相同的存储显示如下。
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 0,
},
mutations: {
increment(state) {
state.count++;
},
},
actions: {
increment(context) {
context.commit('increment');
},
},
getters: {
doubleCount(state) {
return state.count * 2;
},
},
});
与之前的 Pinia store 一样,这个 Vuex 示例包含一个 state 对象,其单一的 count 属性初始化为 0。
getters 对象包含直接突变状态的 *** ,而动作对象的 *** 则提交增量突变。
然后,getters 对象包含 doubleCount *** ,该 *** 将 count 状态乘以 2 并返回结果。
正如这段代码所展示的,在 Pinia 中实现存储与 Vuex 有几个明显的不同之处:
Vue.use()。使用 Vuex 时,您可以这样使用存储:
<template>
<div>{{ doubleCount }}</div>
<button @click="increment">Increment</button>
</template>
<script>
import { mapGetters, mapActions } from 'vuex';
export default {
computed: {
...mapGetters(['doubleCount']),
},
methods: {
...mapActions(['increment']),
},
};
</script>
对于 Pinia 来说,用法变成了:
<template>
<div>{{ store.doubleCount }}</div>
<button> @click="store.increment">Increment</button>
</template>
<script>>
import { useStore } from '/src/store';
export default {
setup() {
const store = useStore();
return {
store,
};
},
};
</script>

Pinia store 转换。
本示例涵盖基本转换。对于更复杂的 Vuex store,尤其是使用模块的 store,转换将涉及更详细的重组,以与 Pinia 的架构保持一致。
在部署之前,请注册免费试用 Kinsta 的应用程序托管服务。您将在 Dockerfile 的帮助下部署应用程序。
在项目根目录下创建一个 Dockerfile,并粘贴以下内容:
FROM node:latest WORKDIR /app COPY package*.json ./ RUN npm install COPY ./ . CMD ["npm", "run", "start"]
这段代码指示 Kinsta 的 Docker 引擎安装 Node.js ( FROM node:late )、创建工作目录 ( WORKDIR /app )、从 package.json 文件中安装 node 模块 ( RUN npm install ),并设置 Vue 应用程序启动时将调用的启动 ( CMD ["npm", "run", "start" ])命令。COPY 命令会将指定的文件或目录复制到工作目录中。
然后,将代码推送到首选的 Git 提供商(Bitbucket、GitHub 或 Gitlab)。软件仓库准备就绪后,请按照以下步骤将应用程序部署到 Kinsta:
npm start 启动应用程序。除了应用程序托管,您还可以选择将 Vue 应用程序作为静态网站部署到静态网站托管中。
从 Vuex 到 Pinia 的过渡标志着 Vue 生态系统中状态管理的重大演进。Pinia 的简单性、改进的 TypeScript 支持以及与 Vue 3 的 Composition API 的一致性使其成为现代 Vue 应用程序的理想选择。
不久前,PHP 8.0大张旗鼓地发布了。它带来了许多新特性、性能增强和变化——其中最令人兴奋的是新的JIT编译器。 技术世界总是在向前发展,PHP也是如此。 ,包含了几个令人兴奋的特性。它定于今年晚些时候于2021年11月25日发布。 在本文中,我们将详细介绍PHP 8.1将带来哪些新的东...
宝塔面板设置主要涉及的是宝塔控制后台自身的参数,包括诸如面板的开关、自动更新及SSL、面板端口设置等。虽然这部分不涉及服务器自身的管理,但对宝塔面板的设置也有其重要。 特别是面板端口、安全入口及面板密码等涉及安全的参数设置。 启动和关闭面板 如果你长时间无需使用到宝塔面板,可以考虑...
经过几个小时的努力工作后,您是否感到眼睛疲劳或难以阅读代码?许多程序员在开始头疼之前从没想过要切换字体。 如果您经常发现在尝试扫描一千行代码时眼睛模糊不清,或者在停止编码数小时后头疼,那么可能是时候尝试一种新字体了。即使您没有遇到这些症状,设计良好的字体通常也比默认系统字体具有更好的可读性。...
想成为一名网络开发人员或好奇工作的哪些子类型的薪水最高?Web开发是一个竞争激烈、多样化的行业,随着新语言和框架的出现而不断发展。 询问Web开发人员的薪水是一个难以解决的问题(尽管我们尝试)。有太多的因素需要考虑。 无论您是自由开发者还是有兴趣从事更传统的工作、喜欢前端或后端工作,或者想知...
无服务器计算是一种基于云的执行模型,可以将应用程序作为服务托管,而无需维护服务器。 服务提供商维护服务器上的资源分配,并根据实际使用情况向用户收费。焦点转移到一个人正在创建的核心应用程序上,基础设施完全由服务提供商处理。无服务器计算也称为功能即服务 (FaaS)。 换句话说,Serverle...
近年来,Web应用程序和网站的开发变得越来越简单。即使是我们当中最受技术挑战的人也已经相当熟练地使用WordPress和Wix等产品。 对于更高级的开发人员,有许多工具可以帮助简化开发过程。这些工具中最有用的工具之一是Laravel。 本文回答了“什么是Laravel?”这个问题。通过将其分...