六、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
英文地址,請注明出處:http://en.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不配置應該也是可以的&#…