青少年编程与数学 02-006 前端开发框架VUE 22课题、状态管理

青少年编程与数学 02-006 前端开发框架VUE 22课题、状态管理

  • 一、状态管理
  • 二、Vuex
      • 1. 安装Vuex
      • 2. 创建Vuex Store
      • 3. 在Vue应用中使用Store
      • 4. 在组件中使用状态
      • 5. 模块化Store
  • 三、Vuex应用示例
      • 1. 创建项目
      • 2. 安装Vuex
      • 3. 设置Vuex Store
      • 4. 在主项目中使用Store
      • 5. 创建组件
      • 6. 更新App.vue
      • 7. 运行项目
  • 四、pinia
  • 五、Pinia 与 Vuex 的区别
  • 六、Pinia yiet
      • 步骤 1: 创建项目
      • 步骤 2: 安装依赖
      • 步骤 3: 设置Pinia
      • 步骤 4: 创建组件
      • 步骤 5: 在主应用中使用组件
      • 步骤 6: 运行项目
      • 步骤 7: 构建项目
      • 总结

课题摘要:本文介绍了Vue中的状态管理,重点讲解了Vuex和Pinia两种状态管理库。Vuex是Vue的官方状态管理库,适用于大型应用,它采用集中式存储管理应用状态,并确保状态以可预测的方式变化。文章详细阐述了Vuex的安装、创建Store、在Vue应用中使用Store、以及模块化Store的步骤。Pinia作为Vue 3的新一代状态管理库,以其轻量级、直观的API、TypeScript支持和模块化设计等特点,提供了一种更简洁的状态管理方案。文章还提供了使用Vuex和Pinia的示例代码,展示了如何在Vue项目中实现状态管理和组件间的状态共享。


一、状态管理

状态管理是软件工程中的一个概念,它涉及到在应用程序的不同部分之间跟踪、管理和同步状态(即数据)。在现代的前端开发中,尤其是在单页应用(SPA)中,状态管理尤为重要,因为它们通常需要处理复杂的用户界面和大量的交互。

以下是状态管理的一些关键点:

  1. 状态(State)

    • 状态是应用在任何给定时间点的信息集合,它可以包括用户界面的状态、应用程序的配置、用户数据等。
  2. 状态的不可变性(Immutability)

    • 在状态管理中,状态被视为不可变的,这意味着状态一旦被设置,就不能被直接改变。任何状态的改变都通过产生新的状态来实现。
  3. 状态的集中管理(Centralized State Management)

    • 集中管理状态意味着所有的状态都被存储在一个单一的地方(如Vuex、Redux等状态管理库),这有助于避免状态分散在组件树中,使得状态的跟踪和调试变得更加困难。
  4. 状态的可预测性(Predictability)

    • 状态管理的目标之一是使状态的变化可预测。这意味着状态的变化应该是可追踪和可重现的。
  5. 状态的响应性(Reactivity)

    • 在Vue等框架中,状态管理通常与响应式系统结合使用,这意味着当状态发生变化时,依赖这些状态的UI会自动更新。
  6. 状态管理库

    • 有许多库和框架提供了状态管理的解决方案,如Redux(与React一起使用)、Vuex(与Vue一起使用)、MobX等。
  7. 状态的生命周期(State Lifecycle)

    • 状态管理还涉及到状态的生命周期,包括状态的初始化、更新、删除等。
  8. 副作用(Side Effects)

    • 在状态管理中,副作用指的是那些不直接影响状态,但可能会引起外部变化的操作,如API调用、路由跳转等。这些副作用通常需要被管理,以确保状态的一致性和应用的稳定性。
  9. 模块化(Modularization)

    • 状态管理通常支持模块化,允许开发者将状态分割成更小的部分,每个部分管理自己的状态,这有助于保持代码的可维护性和可扩展性。

状态管理是构建大型、复杂前端应用的关键,它有助于提高应用的可维护性、可测试性和可扩展性。

二、Vuex

在Vue项目中实现状态管理,通常会使用Vuex作为状态管理库,尤其是对于大型应用。Vuex是Vue的官方状态管理库,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。以下是在Vue项目中使用Vuex实现状态管理的基本步骤:

1. 安装Vuex

如果你的项目中还没有安装Vuex,可以通过npm或yarn来安装:

npm install vuex@next --save  # 对于Vue 3项目

2. 创建Vuex Store

在项目的 src 目录下创建一个 store 目录,并在其中创建 index.js 文件:

// src/store/index.js
import { createStore } from 'vuex';const store = createStore({state() {return {count: 0};},getters: {doubleCount(state) {return state.count * 2;}},mutations: {increment(state) {state.count++;}},actions: {increment(context) {context.commit('increment');}}
});export default store;

3. 在Vue应用中使用Store

src/main.js 中引入并使用store:

// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';const app = createApp(App);app.use(store);app.mount('#app');

4. 在组件中使用状态

在Vue组件中,你可以通过mapStatemapGettersmapMutationsmapActions辅助函数来使用store中的状态和方法:

<template><div><p>{{ count }}</p><p>{{ doubleCount }}</p><button @click="increment">Increment</button></div>
</template><script>
import { mapState, mapGetters, mapActions } from 'vuex';export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapActions(['increment'])}
};
</script>

5. 模块化Store

对于大型应用,你可能需要将store分割成模块。在Vuex中,你可以使用模块来逻辑划分和管理状态:

// src/store/modules/counter.js
export default {namespaced: true,state() {return {count: 0};},getters: {doubleCount(state) {return state.count * 2;}},mutations: {increment(state) {state.count++;}},actions: {increment(context) {context.commit('increment');}}
};// src/store/index.js
import { createStore } from 'vuex';
import counter from './modules/counter';const store = createStore({modules: {counter}
});export default store;

在组件中使用模块化的状态和方法:

<script>
import { mapState, mapGetters, mapActions } from 'vuex';export default {computed: {...mapState('counter', ['count']),...mapGetters('counter', ['doubleCount'])},methods: {...mapActions('counter', ['increment'])}
};
</script>

通过这些步骤,你可以在Vue项目中实现状态管理,使得状态的维护和更新变得更加集中和有序。

三、Vuex应用示例

以下是一个使用Vue 3和Vite创建的项目的示例,它展示了如何使用Vue的组合式API(Composition API)和Vuex 4来实现状态管理。

1. 创建项目

假设你已经使用Vite创建了一个Vue 3项目:

npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install

2. 安装Vuex

在项目中安装Vuex:

npm install vuex@next

3. 设置Vuex Store

src 目录下创建一个 store 目录,并在其中创建 index.js 文件:

// src/store/index.js
import { createStore } from 'vuex';export default createStore({state() {return {count: 0,todos: [{ id: 1, text: 'Learn Vue', done: true },{ id: 2, text: 'Use Vuex', done: false },],};},getters: {doneTodos(state) {return state.todos.filter(todo => todo.done);},},mutations: {increment(state) {state.count++;},addTodo(state, todo) {state.todos.push(todo);},toggleTodo(state, todoId) {const todo = state.todos.find(todo => todo.id === todoId);if (todo) {todo.done = !todo.done;}},},actions: {increment(context) {context.commit('increment');},addTodo(context, todo) {context.commit('addTodo', todo);},toggleTodo(context, todoId) {context.commit('toggleTodo', todoId);},},
});

4. 在主项目中使用Store

src/main.js 中引入并使用store:

// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';const app = createApp(App);app.use(store);app.mount('#app');

5. 创建组件

src 目录下创建 components 目录,并在其中创建 Counter.vueTodos.vue 组件:

<!-- src/components/Counter.vue -->
<template><div><button @click="decrement">-</button><span>{{ count }}</span><button @click="increment">+</button></div>
</template><script>
import { computed } from 'vue';
import { useStore } from 'vuex';export default {setup() {const store = useStore();const count = computed(() => store.state.count);function increment() {store.dispatch('increment');}function decrement() {store.commit('increment'); // 注意:这里直接提交mutation,因为不需要进行异步操作}return {count,increment,decrement,};},
};
</script>
<!-- src/components/Todos.vue -->
<template><div><ul><li v-for="todo in todos" :key="todo.id"><input type="checkbox" v-model="todo.done" @change="toggleTodo(todo.id)" /><span>{{ todo.text }}</span></li></ul><button @click="addTodo">Add Todo</button><div>Done Todos: {{ doneTodos.length }}</div></div>
</template><script>
import { computed } from 'vue';
import { useStore } from 'vuex';export default {setup() {const store = useStore();const todos = computed(() => store.state.todos);const doneTodos = computed(() => store.getters.doneTodos);function addTodo() {store.dispatch('addTodo', { id: Date.now(), text: 'New Todo', done: false });}function toggleTodo(todoId) {store.dispatch('toggleTodo', todoId);}return {todos,doneTodos,addTodo,toggleTodo,};},
};
</script>

6. 更新App.vue

src/App.vue 中使用这些组件:

<template><div id="app"><Counter /><Todos /></div>
</template><script>
import Counter from './components/Counter.vue';
import Todos from './components/Todos.vue';export default {name: 'App',components: {Counter,Todos,},
};
</script>

7. 运行项目

现在,你可以运行项目来查看状态管理的效果:

npm run dev

访问 http://localhost:3000 来查看应用,你将看到一个计数器和一个待办事项列表,它们的状态都由Vuex管理。

这个示例展示了如何在Vue 3项目中使用Vuex和组合式API来实现状态管理。你可以根据需要添加更多的状态和方法来扩展这个项目。

四、pinia

Pinia 是 Vue.js 的新一代状态管理库,专为 Vue 3 设计,并且也兼容 Vue 2。以下是 Pinia 的一些核心特点和简介:

  1. 轻量级:Pinia 是一个轻量级的状态管理库,体积非常小(大约1kb),几乎不会增加项目体积。

  2. 直观的 API:Pinia 的 API 设计简洁直观,类似于定义组件的方式定义 store,易于上手。

  3. TypeScript 支持:Pinia 提供了完整的 TypeScript 支持,使得在编写状态管理代码时能够获得更好的类型安全性和开发体验。

  4. 去除 Mutations:与 Vuex 不同,Pinia 没有 mutations,只有 state、getters 和 actions,actions 支持同步和异步操作。

  5. Vue Devtools 支持:Pinia 支持 Vue Devtools,提供更好的开发体验,可以在开发工具中查看和调试状态变化。

  6. 模块化设计:Pinia 鼓励将状态分割成多个 store,每个 store 都可以独立管理和维护,支持模块化和命名空间。

  7. 插件系统:Pinia 提供了一个插件系统,可以通过插件扩展功能,例如状态持久化、日志记录等。

  8. 状态持久化:通过 pinia-plugin-persistedstate 插件,可以轻松实现状态的持久化,将状态保存到浏览器的 localStorage 或 sessionStorage 中。

  9. 服务端渲染支持:Pinia 支持服务端渲染,可以在服务端渲染的 Vue 应用中方便地使用状态管理。

  10. 兼容性:虽然专为 Vue 3 设计,但也可以在 Vue 2 项目中使用(通过 pinia-compat)。

Pinia 的设计理念是将状态管理的复杂性降到最低,同时保持灵活性和可扩展性,使其成为 Vue 3 环境下的理想选择。

五、Pinia 与 Vuex 的区别

Pinia 作为 Vue 3 的新一代状态管理库,相较于 Vuex 有以下几个主要优势:

  1. 轻量级:Pinia 的体积非常小,压缩后大约只有 1KB,这使得它在性能上更加高效,尤其是在打包体积上更为精简。

  2. 简化的 API:Pinia 去除了 Vuex 中的 mutations,只保留了 stategettersactions,这简化了状态管理的流程,减少了样板代码。

  3. 组合式 API 风格:Pinia 与 Vue 3 的 Composition API 无缝集成,提供了更灵活的使用方式,使得状态的组织和复用更加简洁明了。

  4. 模块化设计:Pinia 提倡每个 Store 作为独立实体,自然支持模块化,不再需要像 Vuex 中通过 modules 配置来组织不同状态域,这简化了大型应用的状态管理架构。

  5. TypeScript 支持:Pinia 从一开始就对 TypeScript 提供了良好的支持,它的 API 设计考虑了 TypeScript 的使用,使得类型推断更加准确,减少了手动编写类型定义的需求。

  6. 性能优化:得益于其轻量级的设计和对 Vue 3 的深度优化,Pinia 在处理响应式数据时更为高效,特别是在使用 Composition API 时,性能表现得更加优异。

  7. 易用性提升:Pinia 的 API 设计围绕简洁和直观展开,降低了学习曲线,使得状态管理变得更加平易近人,即便是初学者也能快速上手并有效管理应用状态。

  8. 版本适应性:Pinia 专为 Vue 3 量身打造,充分利用 Vue 3 的最新特性和优化,为 Vue 3 应用提供最适配的状态管理方案。

  9. 支持插件功能:Pinia 支持插件来扩展自身功能,如状态持久化、日志记录等。

  10. 服务端渲染支持:Pinia 支持服务端渲染,可以在服务端渲染的 Vue 应用中方便地使用状态管理。

这些优势使得 Pinia 成为现代 Vue 开发的理想状态管理工具,尤其是在 Vue 3 项目中。

六、Pinia yiet

创建一个使用Vite、TypeScript、Vue 3组合式API(Composition API)和Pinia进行状态管理的完整项目示例,可以按照以下步骤进行:

步骤 1: 创建项目

首先,确保你已经安装了Node.js和npm/yarn。然后,使用Vite创建一个新的Vue 3项目,并选择TypeScript模板:

# 使用npm
npm create vite@latest my-vue-app --template vue-ts# 或者使用yarn
yarn create vite my-vue-app --template vue-ts

进入项目目录:

cd my-vue-app

步骤 2: 安装依赖

安装Pinia:

npm install pinia
# 或者
yarn add pinia

步骤 3: 设置Pinia

src目录下创建一个stores目录,并在其中创建一个Pinia store文件,例如useCounterStore.ts

// src/stores/counter.ts
import { defineStore } from 'pinia';export const useCounterStore = defineStore('counter', {state: () => ({count: 0,}),actions: {increment() {this.count++;},decrement() {this.count--;},},
});

步骤 4: 创建组件

src目录下创建一个新的组件,比如Counter.vue,并使用组合式API和Pinia store:

<template><div><button @click="decrement">-</button><span>{{ count }}</span><button @click="increment">+</button></div>
</template><script lang="ts">
import { defineComponent } from 'vue';
import { useCounterStore } from '@/stores/counter';export default defineComponent({name: 'Counter',setup() {const counterStore = useCounterStore();return {count: counterStore.count,increment: counterStore.increment,decrement: counterStore.decrement,};},
});
</script>

步骤 5: 在主应用中使用组件

编辑src/App.vue文件,引入并使用Counter组件:

<template><div id="app"><Counter /></div>
</template><script lang="ts">
import { defineComponent } from 'vue';
import Counter from './components/Counter.vue';export default defineComponent({name: 'App',components: {Counter,},
});
</script>

步骤 6: 运行项目

使用以下命令启动开发服务器:

npm run dev
# 或者
yarn dev

现在,你应该能够访问http://localhost:3000看到你的应用。

步骤 7: 构建项目

当你准备好将项目部署到生产环境时,运行以下命令:

npm run build
# 或者
yarn build

这将构建你的应用,并生成可以在生产环境中部署的文件。

总结

这个简单的项目示例展示了如何使用Vite、Vue 3、TypeScript和Pinia来创建一个基本的Web应用。你可以根据需要添加更多的组件、路由、API调用等。Pinia 提供了一种简洁直观的方式来管理应用状态,使得代码更加模块化和可重用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/1700.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赤店商城系统点餐小程序多门店分销APP共享股东h5源码saas账号独立版全插件全开源

代码介绍 后端编程语言采用&#xff1a;PHP yii2.0框架 前端代码采用&#xff1a;UNIAPP框架环境要求 推荐选择服务器配置&#xff1a;2核4G内存3M带宽 linux操作系统 控制面板&#xff1a;宝塔面板 运行环境&#xff1a;PHP7.2MYSQL5.7 赤店商城系统是一款集点餐小程序、多门…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>优美的排列

题目&#xff1a; 解析&#xff1a; 部分决策树&#xff1a; 代码设计&#xff1a; 代码&#xff1a; private int count;private boolean[] check;public int countArrangement(int n) {check new boolean[n1];dfs(n,1);return count;} private void dfs(int n, int pos){…

【C++图论 拓扑排序】2392. 给定条件下构造矩阵|1960

本文涉及知识点 C图论 拓扑排序 LeetCode2392. 给定条件下构造矩阵 给你一个 正 整数 k &#xff0c;同时给你&#xff1a; 一个大小为 n 的二维整数数组 rowConditions &#xff0c;其中 rowConditions[i] [abovei, belowi] 和 一个大小为 m 的二维整数数组 colConditions…

Anaconda安装(2024最新版)

安装新的anaconda需要卸载干净上一个版本的anaconda&#xff0c;不然可能会在新版本安装过程或者后续使用过程中出错&#xff0c;完全卸载干净anaconda的方法&#xff0c;可以参考我的博客&#xff01; 第一步&#xff1a;下载anaconda安装包 官网&#xff1a;Anaconda | The O…

SSE部署后无法连接问题解决

1. 问题现象 通过域名访问 https://api-uat.sfxs.com/sse/subscribe?tokenBearer%20eyJUxMiJ9.eyJhY2NvdW50IjoiYWRtaWZ0NvZGUiOiIwMDEiLCJyb2xidXNlcm5hbWUiOiLotoXnuqfnrqHnkIblkZgifQ.tlz9N61Y4 一直无法正常连接 2. 问题解决 nginx.conf进行配置 server {location /ss…

【优选算法篇】:分而治之--揭秘分治算法的魅力与实战应用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.什么是分治算法1.分治算法的基本概念2.分治算法的三个步…

Unreal Engine 5 C++ Advanced Action RPG 八章笔记

第八章 Boss Enemy 2-Set Up Boss Character 创建Boss敌人流程 起始的数据UI战斗能力行为树 这集新建Boss敌人的蓝图与动画蓝图和混合空间,看看就行巨人在关卡中,它的影子被打破,更改当前项目中的使用的阴影贴图就可以解决 从虚拟阴影贴图更改为阴影贴图即可 3-Giant Start…

C#,图论与图算法,输出无向图“欧拉路径”的弗勒里(Fleury Algorithm)算法和源程序

1 欧拉路径 欧拉路径是图中每一条边只访问一次的路径。欧拉回路是在同一顶点上开始和结束的欧拉路径。 这里展示一种输出欧拉路径或回路的算法。 以下是Fleury用于打印欧拉轨迹或循环的算法&#xff08;源&#xff09;。 1、确保图形有0个或2个奇数顶点。2、如果有0个奇数顶…

day08_Kafka

文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列&#xff08;了解&#xff09;**为什么消息队列就像是“数据的快递员”&#xff1f;****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…

Vue3组件设计模式:高可复用性组件开发实战

Vue3组件设计模式:高可复用性组件开发实战 一、前言 在Vue3中&#xff0c;组件设计和开发是非常重要的&#xff0c;它直接影响到应用的可维护性和可复用性。本文将介绍如何利用Vue3组件设计模式来开发高可复用性的组件&#xff0c;让你的组件更加灵活和易于维护。 二、单一职责…

《使用人工智能心脏磁共振成像筛查和诊断心血管疾病》论文精读

Screening and diagnosis of cardiovascular disease using artificial intelligence-enabled cardiac magnetic resonance imaging 心脏磁共振成像 (CMR) 是心脏功能评估的黄金标准&#xff0c;在诊断心血管疾病 (CVD) 中起着至关重要的作用。然而&#xff0c;由于 CMR 解释的…

幂次进近

数学题。 令n-m^k的绝对值最小&#xff0c;即n-m^k0&#xff0c;此时mn^(1/k)。 据题意要求&#xff0c;m只能取到正整数&#xff0c;那么&#xff0c;n^(1/k)结果恰为整时&#xff0c;其值即为答案&#xff0c;否则&#xff0c;答案为该值临近的两个整数中的一个&#xff0c…

RuoYi-Vue-Plus 加入 GitCode:驱动多租户后台管理创新发展

在当今数字化进程持续推进的时代背景下&#xff0c;企业对后台管理系统的要求不断攀升&#xff0c;高效、安全、灵活与可拓展性成为关键要素。近日&#xff0c;RuoYi-Vue-Plus 正式加入 GitCode&#xff0c;为多租户后台管理领域带来全新动力与机遇&#xff0c;有力推动行业技术…

STM32入门教程-示例程序(按键控制LED光敏传感器控制蜂鸣器)

1. LED Blink&#xff08;闪烁&#xff09; 代码主体包含&#xff1a;LED.c key.c main.c delay.c&#xff08;延时防按键抖动&#xff09; 程序代码如下&#xff08;涉及RCC与GPIO两个外设&#xff09;&#xff1a; 1.使用RCC使能GPIO时钟 RCC_APB2PeriphClockC…

数据挖掘实训:天气数据分析与机器学习模型构建

随着气候变化对各行各业的影响日益加剧&#xff0c;精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键&#xff0c;例如农业、交通和灾害预警等领域。本文将通过机器学习方法&#xff0c;利用历史天气数据预测明天是否会下雨&#xff0c;具体内容包括数据预处理、…

Python在Excel工作表中创建数据透视表

在数据处理和分析工作中&#xff0c;Excel作为一个广泛使用的工具&#xff0c;提供了强大的功能来管理和解析数据。当面对大量复杂的数据集时&#xff0c;为了更高效地总结、分析和展示数据&#xff0c;创建数据透视表成为一种不可或缺的方法。通过使用Python这样的编程语言与E…

SpringBoot配置文件

大家好&#xff0c;我是小帅今天我来学习Web开发中的配置文件。 文章目录 1. 配置⽂件作⽤2. 配置⽂件入门3. 配置⽂件的格式4. properties 配置⽂件说明4.1 properties 基本语法4.2 读取配置⽂件&#xff08;Value 注解&#xff09;4.3 properties 缺点分析 5. yml 配置⽂件说…

FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )

以Xilinx 公司Virtex-II 系列FPGA 为例&#xff0c;其基本结构由下图所示。它是主要由两大部分组成&#xff1a;可编程输入/输出&#xff08;Programmable I/Os&#xff09;部分和内部可配置&#xff08;Configurable Logic&#xff09;部分。 可编程输入/输出&#xff08;I/Os…

day10_Structured Steaming

文章目录 Structured Steaming一、结构化流介绍&#xff08;了解&#xff09;1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型&#xff08;掌握&#xff09;1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…

mybatisPlus(条件构造器API)

文章目录 目录一、mybatisPlus的介绍二、mybatisPlus的基础使用配置BaseMapper的基本CURD&#xff08;增删改查&#xff09; 三、wrapper&#xff08;条件构造器&#xff09;条件构造器&#xff08;wrapper&#xff09;通用API基础条件判断&#xff1a;进阶条件判断&#xff08…