Vue3:使用 Composition API 不需要 Pinia

在 Vue.js 開發的動態環境中,在單個組件中處理復雜的業務邏輯可能會導致笨重的文件和維護噩夢。雖然 Pinia 提供集中式狀態管理,但僅依賴它來處理復雜的業務邏輯可能會導致代碼混亂。本文探討了使用 Composition API 的替代方法,說明開發人員如何將數據和邏輯封裝在自定義 hooks 中以實現高效的狀態管理。

駕馭復雜的業務邏輯

在日常開發中,經常會出現功能變得過于復雜而無法限制在單個 Vue.js 組件中的情況。分解組件是合乎邏輯的解決方案,但這帶來了在組件之間共享數據和業務邏輯的挑戰。雖然 Pinia 在這方面很受歡迎,但如果廣泛用于所有復雜的業務邏輯,它就會變得不堪重負。

擁抱 Composition API 和自定義 Hook

一個引人注目的替代方案是利用 Composition API 將數據和業務邏輯封裝在自定義 hooks 中。這些鉤子(以 useStore 函數為例)成為狀態定義、更新和特定業務邏輯的中心。反過來,組件只需要與這些鉤子公開的狀態和方法進行交互,從而抽象出內部的復雜性。

// 使用 Composition API 自定義 hook
import { computed, ref } from "vue";// 在 useStore 函數外部定義 count 變量
const count = ref(0);
const doubleCount = computed(() => {return count.value * 2;
});export const useStore = () => {function increment() {count.value = count.value + 1;}function decrement() {count.value = count.value - 1;}return {count,doubleCount,increment,decrement,};
};

孤立的 Hook 調用的陷阱

CountValueCountBtn 等組件在其 setup 函數中獨立調用 useStore 掛鉤時,就會出現挑戰。本文揭示了每次調用時創建 count 變量的獨立實例的陷阱,從而導致組件之間的狀態更新不一致。

// CountValue.vue component
<template><p>count's value is {{ count }}</p><p>doubleCount's value is {{ doubleCount }}</p>
</template><script setup lang="ts">
import { useStore } from "./store";// 對 useStore 的獨立調用創建獨立的 count 實例
const { count, doubleCount } = useStore();
</script>// CountBtn.vue component
<template><button @click="decrement">count--</button><button @click="increment">count++</button>
</template><script setup lang="ts">
import { useStore } from "./store";// 對 useStore 的獨立調用創建獨立的 count 實例
const { decrement, increment } = useStore();
</script>

協調組件之間的狀態

為了克服這一挑戰,一種優化方法是將 count 變量的定義重新定位到 useStore 函數之外。這可確保調用 useStore hook 的所有組件共享 count 變量的同一實例,從而促進同步狀態管理。

// 將計數定義移至 useStore 函數之外
import { computed, ref } from "vue";const count = ref(0);
const doubleCount = computed(() => {return count.value * 2;
});export const useStore = () => {function increment() {count.value = count.value + 1;}function decrement() {count.value = count.value - 1;}return {count,doubleCount,increment,decrement,};
};

在 Pinia 似乎難以應對復雜業務邏輯的各個方面的情況下,Composition API 提供了一個干凈、有組織的替代方案。通過將數據和邏輯封裝在自定義鉤子中,開發人員可以在 Vue.js 應用程序中的模塊化和高效狀態管理之間取得平衡。

本文強調了 Composition API 在構建 Vue.js 解決方案中的多功能性,以最大限度地提高靈活性和可維護性。通過采用自定義鉤子,開發人員可以編寫符合 Vue.js 原則的有組織、可讀的代碼。


原文:https://blog.stackademic.com/vue-3-you-dont-need-pinia-in-some-scenarios-with-the-composition-api-79fc4ff6ab8f

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫表 索引

目錄 一、索引的分類 1、按存儲形式: 1&#xff09;B-TREE索引&#xff1a; 2&#xff09;位圖索引&#xff1a; 3&#xff09;反向鍵索引&#xff1a; 4&#xff09;基于函數的索引&#xff1a; 2、按唯一性&#xff1a; 1&#xff09;唯一索引&#xff1a; 3、按列的個數…

代碼隨想錄算法訓練營第八天

344. 反轉字符串 方法&#xff1a; 方法一&#xff1a; 直接用reverse函數 注意&#xff1a; 代碼&#xff1a; class Solution { public:void reverseString(vector<char>& s) {return reverse(s.begin(), s.end());} };運行結果&#xff1a; 方法&#xff1…

解釋前端路由的概念,以及單頁應用(SPA)和多頁應用(MPA)的區別

前端路由是現代Web應用中的一種設計模式&#xff0c;它允許用戶在單個網頁應用程序&#xff08;SPA&#xff09;內部通過改變URL而無需重新加載整個頁面來切換不同的視圖或內容。在傳統的多頁應用&#xff08;MPA&#xff09;中&#xff0c;每訪問一個新頁面&#xff0c;瀏覽器…

搜索算法(算法競賽、藍橋杯)--雙向DFS+二分查找

1、B站視頻鏈接&#xff1a;B26 雙向DFS 送禮物_嗶哩嗶哩_bilibili #include <bits/stdc.h> using namespace std; int n,m; int g[46];//存儲所有物品的質量 int w[1<<23];//存儲所有能湊出來的重量 int ans,cnt;//w的個數是cnt//搜索第u個數&#xff0c;和為s; …

Geeker Admin添加若以分離版本的后臺作為后臺

添加驗證碼 下載若依賴前后端分離版本&#xff0c;配置好自己數據庫&#xff0c;redis連接地址 登錄添加驗證碼 配置自己的若依后端連接地址 添加驗證碼請求方法 登錄頁面登錄輸入框添加驗證碼&#xff0c;uuid,調用的驗證碼刷新方法 注意&#xff1a;這里要用響應式定義驗證…

5_怎么看原理圖之協議類接口之NAND Flash筆記

NAND Flash原理圖&#xff1a; 由NAND Flash的原理圖可以看出&#xff0c;做為一個存儲芯片&#xff0c;只有I/O引腳&#xff0c;并沒有地址引腳&#xff0c;怎么傳地址&#xff1f;遵循一定的規范&#xff0c;先通過LDATA把地址傳出去&#xff0c;再傳數據。具體的需要查看芯片…

vue前端數據轉換顯示

<el-table-column label"項目模板名稱" align"center" prop"tempName" width"180" :formatter"templFormat" /> :formatter"templFormat" // 模板名單 optionTempls: [], // datas value templFormat(row,…

HTTP Cookie 你了解多少?

Cookie是什么&#xff1f; 先給大家舉個例子&#xff0c;F12 打開瀏覽器的頁面之后&#xff0c;我們能在 Response Headers 的字段里面看到一個header 叫做 Set-Cookie&#xff0c;如下所示 圖中包含的 Set-Cookie 為 Set-Cookie:uuid_tt_dd10_20293537580-1709432565344-232…

Transformer模型分布式并行通信量淺析

1.數據并行DP&#xff08;樸素數據并行&#xff0c;Zero數據并行之后補充&#xff09; O ( h 2 ? l ) O(h^2*l) O(h2?l) 每臺機器做完自己的梯度后需要做一次All reduce操作來累積梯度&#xff0c;故一個batch計算發送的數據量為每層梯度大小 h 2 h^2 h2乘以層數 l l l 優點…

【李沐論文精讀】Resnet精讀

論文地址&#xff1a;Deep Residual Learning for Image Recognition 參考&#xff1a;撐起計算機視覺半邊天的ResNet【論文精讀】、ResNet論文逐段精讀【論文精讀】、【李沐論文精讀系列】 一、導論 深度神經網絡的優點&#xff1a;可以加很多層把網絡變得特別深&#xff0c;…

力扣周賽387

第一題 代碼 package Competition.The387Competitioin;public class Demo1 {public static void main(String[] args) {}public int[] resultArray(int[] nums) {int ans[]new int[nums.length];int arr1[]new int[nums.length];int arr2[]new int[nums.length];if(nums.leng…

Linux系統Docker部署RStudio Server

文章目錄 前言1. 安裝RStudio Server2. 本地訪問3. Linux 安裝cpolar4. 配置RStudio server公網訪問地址5. 公網遠程訪問RStudio6. 固定RStudio公網地址 前言 RStudio Server 使你能夠在 Linux 服務器上運行你所熟悉和喜愛的 RStudio IDE&#xff0c;并通過 Web 瀏覽器進行訪問…

第二十四章 :Docker 部署 SpringBoot

第二十四章 :Docker SpringBoot 配置文件容器外加載部署 Docker version 25.0.3, build 4debf41 ,Docker Compose version v2.24.2容器運行后,若需修改配置文件,只需修改宿主機的application-prod.yml ,重啟容器即可。 Springboot 2.x 版本 部署規劃 服務器IP192.168.92…

4. 編寫app組件

1. 代碼 main.ts // 引入createApp用于創建應用 import {createApp} from "vue"// 引入App根組件 import App from ./App.vue createApp(App).mount(#app) App.vue <!-- vue文件可以寫三種標簽1. template標簽&#xff0c;寫html結構2. script 腳本標簽&…

判斷docker 鏡像啟動成功 shell腳本

要編寫一個Shell腳本來判斷Docker鏡像是否啟動成功&#xff0c;你可以使用docker ps命令來檢查容器是否在運行狀態。以下是一個簡單的Shell腳本示例&#xff0c;用于判斷Docker鏡像是否成功啟動&#xff1a; #!/bin/bash# 指定要檢查的容器名稱或ID CONTAINER_NAME"your_c…

風險評估是什么意思?與等保測評有什么區別?

最近看到不少小伙伴在問&#xff0c;風險評估是什么意思&#xff1f;與等保測評有什么區別&#xff1f;這里我們就來簡單聊聊。 風險評估是什么意思&#xff1f; 風險評估是指對某個特定領域或項目進行全面分析和評估&#xff0c;以確定可能存在的潛在風險和危害&#xff0c;并…

2023全球軟件開發大會-上海站:探索技術前沿,共筑未來軟件生態(附大會核心PPT下載)

隨著信息技術的迅猛發展&#xff0c;全球軟件開發大會&#xff08;QCon&#xff09;已成為軟件行業最具影響力的年度盛會之一。2023年&#xff0c;QCon再次來到上海&#xff0c;匯聚了眾多業界精英、技術領袖和開發者&#xff0c;共同探討軟件開發的最新趨勢和實踐。 一、大會…

服務器感染了.ma1x0勒索病毒,如何確保數據文件完整恢復?

引言&#xff1a; 網絡安全成為至關重要的議題。.ma1x0勒索病毒是當前網絡威脅中的一種惡意軟件&#xff0c;它的出現給用戶帶來了極大的困擾。然而&#xff0c;正如任何挑戰一樣&#xff0c;我們也有方法來面對并克服.ma1x0勒索病毒。本文將全面介紹這種病毒的特點&#xff0…

MB85RC鐵電 FRAM驅動(全志平臺linux)

測試幾天發現一個bug&#xff0c;就是無法一次讀取32個字節的數據&#xff0c;1-31,33,128,512都試過了&#xff0c;唯獨無法讀取32個字節&#xff0c;驅動未報錯&#xff0c;但是讀取的都是0&#xff0c;找不到原因&#xff0c;估計應該是全志iic驅動的問題&#xff0c;暫時沒…

leetcode - 2095. Delete the Middle Node of a Linked List

Description You are given the head of a linked list. Delete the middle node, and return the head of the modified linked list. The middle node of a linked list of size n is the ?n / 2?th node from the start using 0-based indexing, where ?x? denotes th…