六、vue3后台项目系列——页面自适应设计+pinia,vuex的使用

前言:在页面加入自适应是提高用户体验的一种形式,甚至有时候是手机用户,我们就需要做一个自适应处理,其中肯定会涉及一些状态条件的判断,而这些关键的条件就是我们用来切换样式的关键,所以我们需要使用状态管理工具vuex或者pinia进行存储这些状态,方便可以根据这些状态来控制显示和隐藏。

项目的使用:因为我们搭建的是vue3项目,推荐使用pinia,当然我也会简单介绍下vuex。

一、基本思路

1.显示页面:是由layout组件控制,则对这个组件进行自适应化。

2.在组件中设置一些状态通过v-if来控制某个组件的显示和隐藏,比如当设备过小时,隐藏侧边栏,使用一个小小的展开图标代替。

3.状态通过pinia来管理。

4.在组件挂载之前在window对象上加上resize方法监听页面的变化,再根据不同的变化配合pinia设置不同的状态并存储。

5.样式使用scss,样式做全局声明,变量化,方便统一修改和配置。

6.根据不同的设备尺寸变化设置、加载、切换不同的css样式。

二、vuex与pinia

Vuex 和 Pinia 都是 Vue 生态中用于状态管理的工具,简单说就是用来管理组件之间共享的数据(比如用户信息、购物车数据等)。它们解决的核心问题是:当多个组件需要使用同一数据时,如何让数据变更更清晰、更易维护。

2.1 Vuex(“老大哥”,Vue 2 时代主流)

Vuex 是 Vue 官方早期推出的状态管理库,主要用于 Vue 2,虽然也能在 Vue 3 中使用,但现在更推荐 Pinia。

1. 核心概念(必须掌握)

Vuex 的状态管理遵循 “单向数据流”,核心结构包含 5 个部分:

  • State:存储共享数据的地方(类似组件的 data)。

    // 示例:store/index.js
    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)const store = new Vuex.Store({state: {count: 0, // 共享的计数器user: null // 共享的用户信息}
    })
    
  • Mutations:唯一能修改 state 的地方,必须是同步函数(类似组件的 methods,但只能修改状态)。

    mutations: {increment(state) {state.count++ // 只能通过 mutation 修改 state},setUser(state, userInfo) {state.user = userInfo // 可以接收参数}
    }
    
  • Actions:处理异步操作(比如请求接口),最终通过调用 mutations 修改 state(不能直接改 state)。

    actions: {// 异步登录login(context, { username, password }) {return new Promise((resolve) => {// 模拟接口请求setTimeout(() => {const user = { id: 1, name: username }context.commit('setUser', user) // 调用 mutation 修改状态resolve(user)}, 1000)})}
    }
    
  • Getters:类似组件的 computed,用于对 state 进行加工处理(比如筛选、计算)。

    getters: {doubleCount(state) {return state.count * 2 // 计算 count 的两倍},isLogin(state) {return !!state.user // 判断用户是否登录}
    }
    
  • Modules:当状态太多时,拆分模块(比如拆成 user 模块、cart 模块)。

    modules: {user: {namespaced: true, // 开启命名空间,避免冲突state: { name: '' },mutations: { setName(state, name) { state.name = name } }}
    }
    
2. 如何在组件中使用?
  • 读取 state 或 getters

    <template><div>计数:{{ $store.state.count }}两倍计数:{{ $store.getters.doubleCount }}</div>
    </template>
    
  • 调用 mutations 或 actions

    <script>
    export default {methods: {add() {this.$store.commit('increment') // 调用 mutation},async login() {await this.$store.dispatch('login', { username: 'admin' }) // 调用 action}}
    }
    </script>
    
  • 简化写法(推荐):用 mapStatemapActions 等辅助函数:

    <script>
    import { mapState, mapActions } from 'vuex'
    export default {computed: {...mapState(['count']) // 映射 state.count 到组件的 count},methods: {...mapActions(['login']) // 映射 action login 到组件方法}
    }
    </script>
    
3. 优缺点
  • 优点:成熟稳定,文档丰富,适合大型项目,支持严格模式(禁止直接修改 state)。
  • 缺点
    • 写法繁琐,需要定义 mutationsactions 等,模板代码多。
    • 对 TypeScript 支持差,类型推断不友好。
    • 必须通过 this.$store 访问,不够灵活。
2.2 Pinia(“新宠”,Vue 3 官方推荐)

Pinia 是 Vue 官方推出的新一代状态管理库,由 Vuex 作者开发,现在是 Vue 3 推荐的状态管理方案,也支持 Vue 2。

1. 核心概念(比 Vuex 简单)

Pinia 简化了 Vuex 的设计,取消了 mutations,只有 3 个核心概念:

  • Store:一个存储状态的容器,每个模块对应一个 store(类似 Vuex 的 modules,但更灵活)。
  • State:存储数据的地方(和 Vuex 的 state 类似)。
  • Actions:处理同步 / 异步操作,并直接修改 state(合并了 Vuex 的 mutations 和 actions)。
  • Getters:类似 Vuex 的 getters,用于计算状态。
2. 基本使用步骤

步骤 1:安装

npm install pinia --save

步骤 2:创建 Pinia 实例并挂载

在 main.js 中:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const app = createApp(App)
app.use(createPinia()) // 挂载 Pinia
app.mount('#app')

步骤 3:定义一个 Store(比如 store/counter.js

import { defineStore } from 'pinia'// 定义一个 store,命名规范:useXXXStore
export const useCounterStore = defineStore('counter', {// 状态(类似 data)state: () => ({count: 0,user: null}),// 计算属性(类似 computed)getters: {doubleCount: (state) => state.count * 2,isLogin: (state) => !!state.user},// 方法(同步/异步都可以,类似 methods)actions: {increment() {this.count++ // 直接修改 state(不需要 mutation)},// 异步操作async login(username, password) {// 模拟接口请求const user = await new Promise((resolve) => {setTimeout(() => resolve({ id: 1, name: username }), 1000)})this.user = user // 直接修改 state}}
})
3. 在组件中使用
<template><div>计数:{{ counterStore.count }}两倍计数:{{ counterStore.doubleCount }}<button @click="counterStore.increment">+1</button><button @click="handleLogin">登录</button></div>
</template><script setup>
import { useCounterStore } from '@/store/counter'// 获取 store 实例
const counterStore = useCounterStore()// 调用异步 action
const handleLogin = async () => {await counterStore.login('admin', '123456')
}
</script>
4. 高级用法
  • 修改状态的其他方式

    // 方式1:直接修改
    counterStore.count = 10// 方式2:批量修改(适合多个状态同时更新)
    counterStore.$patch({count: 10,user: { name: 'new name' }
    })// 方式3:通过函数修改(复杂逻辑)
    counterStore.$patch((state) => {state.count += 10state.user.name = 'new name'
    })
    
  • 模块化:直接创建多个 store 文件即可(比如 userStore.jscartStore.js),无需像 Vuex 那样用 modules 嵌套。

  • 持久化:配合 pinia-plugin-persistedstate 插件,轻松实现状态持久化(刷新页面不丢失):

    npm install pinia-plugin-persistedstate --save
    
    // 在 store 中开启持久化
    export const useUserStore = defineStore('user', {state: () => ({ user: null }),persist: true // 开启持久化,默认存储到 localStorage
    })
    

5. 优缺点
  • 优点
    • 写法简洁,取消了 mutations,直接在 actions 中修改状态。
    • 完美支持 TypeScript,类型推断友好。
    • 支持 Vue 2 和 Vue 3,迁移成本低。
    • 无需 this.$store,直接导入 store 实例使用,更灵活。
    • 内置模块化,无需额外配置。
  • 缺点
    • 相对较新,某些老项目可能还在使用 Vuex。
    • 生态不如 Vuex 成熟(但主流功能都有替代方案)。

三、Vuex vs Pinia 核心区别

特性VuexPinia
核心概念State、Mutations、Actions、Getters、ModulesState、Actions、Getters(无 Mutations,Modules 被 Store 替代)
异步操作必须在 Actions 中处理,通过 Mutations 修改状态直接在 Actions 中处理并修改状态
TypeScript 支持优秀
写法简洁度繁琐(需定义 Mutations)简洁(直接修改状态)
模块化需要 modules 配置每个 Store 就是一个模块
适用版本Vue 2 为主,Vue 3 兼容Vue 3 推荐,Vue 2 兼容

四、如何选择?

  • 新项目(尤其是 Vue 3 + TypeScript):优先用 Pinia,写法简单,未来趋势。
  • 老项目(Vue 2):如果已用 Vuex,继续维护即可;如果新开发,也可以用 Pinia(支持 Vue 2)。
  • 团队熟悉 Vuex:如果团队对 Vuex 更熟练,且项目稳定,无需强制迁移。

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

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

相关文章

视频讲解|Python用ResNet残差神经网络在大脑出血CT图像描数据预测应用

全文链接&#xff1a;https://tecdat.cn/?p43843 原文出处&#xff1a;拓端抖音号拓端tecdat 分析师&#xff1a;Zikun Zhang 视频讲解Python用ResNet残差神经网络在大脑出血CT图像描数据预测在临床医疗影像诊断中&#xff0c;大脑出血的快速准确识别直接关系到患者的救治效率…

Mysql中有那些锁

按照锁的力度分&#xff1a;1.行级锁2.表级锁3.全局锁4.页级锁innodb不支持页锁全局锁全局锁指的是对整个数据库实例加锁&#xff0c;一般用于数据库的表级锁表锁 是对整张表进行加锁。表级锁还有以下几种&#xff1a;意向锁&#xff1a;意向锁是指&#xff0c;我们在事务请求表…

基于 CoT 思维链协调多 MCP 工具:依托亚马逊云科技服务打造全流程智能的 Amazon Redshift 运维体系

基于 CoT 思维链协调多 MCP 工具&#xff1a;依托亚马逊云科技服务打造全流程智能的 Amazon Redshift 运维体系 新用户可获得高达 200 美元的服务抵扣金 亚马逊云科技新用户可以免费使用亚马逊云科技免费套餐&#xff08;Amazon Free Tier&#xff09;。注册即可获得 100 美元的…

手机群控平台的智能管控技术深度解析

手机群控平台作为数字化运营的核心工具&#xff0c;正在重塑移动设备管理的技术边界。其核心价值在于通过集中化控制实现批量化操作&#xff0c;同时借助智能化算法提升管控效率。本文将深入探讨其技术架构与实现方案。平台架构与核心技术手机群控平台采用分布式架构设计&#…

Spring Boot 生命周期与核心扩展点全解析(含实操案例)

在Spring Boot开发中,理解应用的生命周期是实现优雅启动、资源管理与故障处理的关键。不同于传统Spring框架需要繁琐的XML配置,Spring Boot通过自动配置简化了开发流程,但其生命周期的底层逻辑仍延续并增强了Spring的核心机制。本文将从“生命周期阶段划分”“核心扩展点原理…

69-SQLite应用

1. SQLite操作 1.1了解数据库1.2 操作数据库步骤# -*- coding: utf-8 -*- """ Project : 01-python-learn File : 03_SQLite3添加数据.py IDE : PyCharm Author : 刘庆东 Date : 2025/9/15 14:05 """ # 1. 导入模块 import sqlite3 …

Nginx - 正向vs反向代理

参考: https://blog.csdn.net/william_n/article/details/127387009 AI问答​​ Nginx 正向代理 vs 反向代理详解​​ ​​1. 正向代理&#xff08;Forward Proxy&#xff09;​​ ​​定义​​ ​​客户端主动配置​​的代理服务器&#xff0c;代表客户端向外部服务器发送请…

装饰器模式在Spring中的案例

设计模式-装饰器模式 装饰器模式所解决的问题是&#xff0c;在不改变原来方法代码的情况下对方法进行修饰&#xff0c;从而丰富方法功能。 Spring架构中的装饰器模式 在Spring架构中&#xff0c;以线程池进行举例。 线程池 线程池是一个对线程集中管理的对象&#xff0c;集中管…

云原生与 AI 驱动下的数据工程新图景——解读 DZone 2025 数据工程趋势报告【附报告下载】

在 AI 技术从“实验性”走向“企业级落地”的关键阶段&#xff0c;数据工程作为底层支撑的重要性愈发凸显。近日&#xff0c;DZone 发布的《2025 数据工程趋势报告》&#xff08;Scaling Intelligence with the Modern Data Stack&#xff09;通过对全球 123 位 IT 专业人士的调…

9.5 机器翻译与数据集

语言模型是自然语言处理的关键&#xff0c;而机器翻译是语言模型最成功的基准测试&#xff0c;因为机器翻译正是将输入序列转换成输出序列的序列转换模型的核心问题。序列转码模型在各类现代人工智能应用中国呢发挥着至关重要的作用&#xff0c;因此我们将其作为本章剩余部分和…

Linux 内核镜像与启动组件全解析:从 vmlinux 到 extlinux.conf

&#x1f9e0; Linux 内核镜像与启动组件全解析&#xff1a;从 vmlinux 到 extlinux.conf 在嵌入式 Linux 系统中&#xff0c;启动流程涉及多个关键文件和机制。不同的镜像格式和配置文件承担着不同的职责&#xff0c;从内核编译到 bootloader 加载&#xff0c;再到系统启动。本…

【系统分析师】2024年下半年真题:论文及解题思路

更多内容请见: 备考系统分析师-专栏介绍和目录 文章目录 试题一:论devops在企业信息系统开发中的应用 试题二:论系统业务流程分析方法及应用 试题三:论软件测试方法及应用 试题四:论信息系统运维管理 试题一:论devops在企业信息系统开发中的应用 1、概要叙述你参与管理和…

AI GEO 实战:借百度文小言优化,让企业名称成搜索热词

在当今数字化浪潮中&#xff0c;企业的线上曝光度和搜索可见性至关重要。百度作为国内占据主导地位的搜索引擎&#xff0c;其推出的大模型文小言蕴含着巨大的潜力。通过巧妙运用 AI GEO&#xff08;生成式引擎优化&#xff09;策略&#xff0c;企业完全有可能让自己的公司名称成…

文件操作知识点总结

目录 1.为什么使用文件 2.什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名 3.二进制文件和文本文件 4.文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 4.3.1 fopen函数 4.3.2 fclose函数 5.文件的顺序…

oracle认证有哪几种?如何选择

Oracle&#xff08;甲骨文&#xff09;不仅是全球领先的数据库软件巨头&#xff0c;更是企业级数据管理的代名词&#xff0c;获得Oracle认证&#xff0c;证明可从事Oracle数据库服务器的数据操作和管理等工作。下面给大家详细其主要认证类型及其在职业发展中的含金量&#xff0…

AppTest邀请测试测试流程

相比AppGallery邀请测试&#xff0c;AppTest邀请测试具备以下全新能力&#xff1a;若您同时发布了多个测试版本&#xff0c;AppTest支持测试版本自动升级到最新的测试版本。您可以选择将当前最新在架版本的应用介绍截图展示给测试人员&#xff0c;视觉效果更好&#xff0c;提升…

硬件 - oring多电源切换

目录 一、ORing电路 1.1 ORING 电路 1.2 ORING 电路关键部分 二、多电源切换 2.1 主要思路 2.2 适用场景 一、ORing电路 1.1 ORING 电路 中文常称 “或环电路” 或 “并联冗余电路”是一种电源并联冗余拓扑结构 核心功能&#xff1a;将多路独立电源的输出 “并联整合”&a…

Qt多语言翻译实战指南:常见陷阱与动态切换解决方案

问题背景 在Qt项目国际化过程中&#xff0c;开发者经常会遇到各种翻译逻辑问题&#xff0c;特别是需要实现运行时语言动态切换功能时。一个典型场景是&#xff1a;程序默认英文显示&#xff0c;加载中文翻译文件后界面变为中文&#xff0c;但再次切换回英文时却失败。本文将深入…

机器人要增加力矩要有那些条件和增加什么

机器人要增加力矩要有那些条件和增加什么进行详细讲解 好的&#xff0c;这是一个非常专业且重要的问题。为机器人增加力矩&#xff08;通常指提升关节输出扭矩&#xff09;不是一个简单的部件替换&#xff0c;而是一个涉及动力链、结构、控制和散热的系统性工程。 以下将详细讲…

spring集成aes加密、rsa加密

文章目录spring集成对称加密spring集成rsa加密spring集成对称加密 encrypt:key: aaabbb # 只配置这个参数就实现了对称加密salt: 333444 # 这个可以不配置spring集成rsa加密 例如apollo&#xff0c;如果没有配置encrypt.key&#xff0c;那么apollo不配置应该也是可以的&#…