快速入門vue3新特性和新的狀態管理庫pinia

(創作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡)

目錄

Vue3.3新特性

defineOptions

defineModel

pinia?

介紹

與 Vuex 3.x/4.x 的比較?

安裝

核心概念

定義 Store

Option Store?

Setup Store

storeToRefs?

State?

Getter?

Action

pinia-plugin-persistedstate

概述

安裝?

用法?


Vue3.3新特性

defineOptions

背景說明:
<script setup> 之前,如果要定義 props, emits 可以輕而易舉地添加一個與 setup 平級的屬性。
但是用了 <script setup> 后,就沒法這么干了 setup 屬性已經沒有了,自然無法添加與其平級的屬性。
為了解決這一問題,引入了 defineProps defineEmits 這兩個宏。但這只解決了 props emits 這兩個屬性。
如果我們要定義組件的 name 或其他自定義的屬性,還是得回到最原始的用法——再添加一個普通的 <script> 標簽。
這樣就會存在兩個 <script> 標簽。讓人無法接受
所以在 Vue 3.3 中新引入了 defineOptions 宏。顧名思義,主要是用來定義 Options API 的選項。可以用 defineOptions 定義任意的選項, props, emits, expose, slots 除外(因為這些可以使用 defineXXX 來做到)

?

defineModel

Vue3 中,自定義組件上使用 v-model, 相當于傳遞一個 modelValue 屬性,同時觸發 update:modelValue 事件

我們需要先定義 props,再定義 emits 。其中有許多重復的代碼。如果需要修改此值,還需要手動調用 emit 函數。

?新的defineModel宏的使用。宏會自動注冊一個Props,并返回一個可以直接突變的引用:

?注意:直接使用 defineModel 宏會報錯,需要開啟。

pinia?

介紹

Pinia 是 Vue 的最新狀態管理工具,是vuex的替代品

與 Vuex 相比,Pinia 提供了一個更簡單的 API,具有更少的規范,提供了 Composition-API 風格的 API,最重要的是,在與 TypeScript 一起使用時具有可靠的類型推斷支持。

與 Vuex 3.x/4.x 的比較?

Pinia API 與 Vuex ≤4 有很大不同,即:

  • mutations?不再存在。他們經常被認為是?非常?冗長。他們最初帶來了 devtools 集成,但這不再是問題。
  • 無需創建自定義復雜包裝器來支持 TypeScript,所有內容都是類型化的,并且 API 的設計方式盡可能利用 TS 類型推斷。
  • 不再需要注入、導入函數、調用函數、享受自動完成功能!
  • 無需動態添加 Store,默認情況下它們都是動態的,您甚至都不會注意到。請注意,您仍然可以隨時手動使用 Store 進行注冊,但因為它是自動的,您無需擔心。
  • 不再有?modules?的嵌套結構。您仍然可以通過在另一個 Store 中導入和?使用?來隱式嵌套 Store,但 Pinia 通過設計提供平面結構,同時仍然支持 Store 之間的交叉組合方式。?您甚至可以擁有 Store 的循環依賴關系
  • 沒有?命名空間模塊。鑒于 Store 的扁平架構,“命名空間” Store 是其定義方式所固有的,您可以說所有 Store 都是命名空間的。

安裝

1.使用vite創建一個空的vue3項目

npm create vue@latest

2.用你喜歡的包管理器安裝pinia:?

yarn add pinia
# 或者使用 npm
npm install pinia

?3.創建一個 pinia 實例 (根 store) 并將其傳遞給應用:

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

核心概念

定義 Store

在深入研究核心概念之前,我們得知道 Store 是用?defineStore()?定義的,它的第一個參數要求是一個獨一無二的名字:

import { defineStore } from 'pinia'// 你可以對 `defineStore()` 的返回值進行任意命名,但最好使用 store 的名字,同時以 `use` 開頭且以 `Store` 結尾。(比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一個參數是你的應用中 Store 的唯一 ID。
export const useAlertsStore = defineStore('alerts', {// 其他配置...
})

這個名字?,也被用作?id?,是必須傳入的, Pinia 將用它來連接 store 和 devtools。為了養成習慣性的用法,將返回的函數命名為?use...?是一個符合組合式函數風格的約定。

defineStore()?的第二個參數可接受兩類值:Setup 函數或 Option 對象。?

Option Store?

與 Vue 的選項式 API 類似,我們也可以傳入一個帶有?stateactions?與?getters?屬性的 Option 對象

export const useCounterStore = defineStore('counter', {state: () => ({ count: 0 }),getters: {double: (state) => state.count * 2,},actions: {increment() {this.count++},},
})

你可以認為?state?是 store 的數據 (data),getters?是 store 的計算屬性 (computed),而?actions?則是方法 (methods)。

Setup Store

?與 Vue 組合式 API 的 setup 函數相似,我們可以傳入一個函數,該函數定義了一些響應式屬性和方法,并且返回一個帶有我們想暴露出去的屬性和方法的對象。

export const useCounterStore = defineStore('counter', () => {const count = ref(0)function increment() {count.value++}return { count, increment }
})

在?Setup Store?中:

  • ref()?就是?state?屬性
  • computed()?就是?getters
  • function()?就是?actions

storeToRefs?

請注意,store?是一個用?reactive?包裝的對象,這意味著不需要在 getters 后面寫?.value,就像?setup?中的?props?一樣,如果你寫了,我們也不能解構它:?

<script setup>
const store = useCounterStore()
// ? 這將不起作用,因為它破壞了響應性
// 這就和直接解構 `props` 一樣
const { name, doubleCount } = store 
name // 將始終是 "Eduardo" 
doubleCount // 將始終是 0 
setTimeout(() => {store.increment()
}, 1000)
// ? 這樣寫是響應式的
// 💡 當然你也可以直接使用 `store.doubleCount`
const doubleValue = computed(() => store.doubleCount)
</script>

?為了從 store 中提取屬性時保持其響應性,你需要使用?storeToRefs()。它將為每一個響應式屬性創建引用。當你只使用 store 的狀態而不調用任何 action 時,它會非常有用。請注意,你可以直接從 store 中解構 action,因為它們也被綁定到 store 上:

<script setup>
import { storeToRefs } from 'pinia'
const store = useCounterStore()
// `name` 和 `doubleCount` 是響應式的 ref
// 同時通過插件添加的屬性也會被提取為 ref
// 并且會跳過所有的 action 或非響應式 (不是 ref 或 reactive) 的屬性
const { name, doubleCount } = storeToRefs(store)
// 作為 action 的 increment 可以直接解構
const { increment } = store
</script>

State?

在大多數情況下,state 都是你的 store 的核心。人們通常會先定義能代表他們 APP 的 state。在 Pinia 中,state 被定義為一個返回初始狀態的函數。這使得 Pinia 可以同時支持服務端和客戶端。

import { defineStore } from 'pinia'const useStore = defineStore('storeId', {// 為了完整類型推理,推薦使用箭頭函數state: () => {return {// 所有這些屬性都將自動推斷出它們的類型count: 0,name: 'Eduardo',isAdmin: true,items: [],hasChanged: true,}},
})

默認情況下,你可以通過?store?實例訪問 state,直接對其進行讀寫。

const store = useStore()store.count++

Getter?

Getter 完全等同于 store 的 state 的計算值。可以通過?defineStore()?中的?getters?屬性來定義它們。推薦使用箭頭函數,并且它將接收?state?作為第一個參數:

export const useStore = defineStore('main', {state: () => ({count: 0,}),getters: {doubleCount: (state) => state.count * 2,},
})

?然后你可以直接訪問 store 實例上的 getter 了:

<script setup>
import { useStore } from './counterStore'
const store = useStore()
</script>
<template><p>Double count is {{ store.doubleCount }}</p>
</template>

Action

Action 相當于組件中的?method。它們可以通過?defineStore()?中的?actions?屬性來定義,并且它們也是定義業務邏輯的完美選擇。

export const useCounterStore = defineStore('main', {state: () => ({count: 0,}),actions: {increment() {this.count++},randomizeCounter() {this.count = Math.round(100 * Math.random())},},
})

?類似?getter,action 也可通過?this?訪問整個 store 實例,并支持完整的類型標注(以及自動補全)不同的是,action?可以是異步的,你可以在它們里面?await?調用任何 API,以及其他 action!下面是一個使用?Mande?的例子。請注意,你使用什么庫并不重要,只要你得到的是一個Promise,你甚至可以 (在瀏覽器中) 使用原生?fetch?函數:

import { mande } from 'mande'const api = mande('/api/users')export const useUsers = defineStore('users', {state: () => ({userData: null,// ...}),actions: {async registerUser(login, password) {try {this.userData = await api.post({ login, password })showTooltip(`Welcome back ${this.userData.name}!`)} catch (error) {showTooltip(error)// 讓表單組件顯示錯誤return error}},},
})

?Action 可以像函數或者通常意義上的方法一樣被調用:

<script setup>
const store = useCounterStore()
// 將 action 作為 store 的方法進行調用
store.randomizeCounter()
</script>
<template><!-- 即使在模板中也可以 --><button @click="store.randomizeCounter()">Randomize</button>
</template>

pinia-plugin-persistedstate

概述

本插件兼容?pinia^2.0.0,在使用之前請確保你已經?安裝 Pinia。?pinia-plugin-persistedstate?豐富的功能可以使 Pinia Store 的持久化更易配置:

安裝?

1.用你喜歡的包管理器安裝依賴

  • pnpm:
    pnpm i pinia-plugin-persistedstate
  • npm:
    npm i pinia-plugin-persistedstate
  • yarn:
    yarn add pinia-plugin-persistedstate

?2.將插件添加到 pinia 實例上

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

用法?

創建 Store 時,將?persist?選項設置為?true

使用組合式 Store 語法:?

import { defineStore } from 'pinia'export const useStore = defineStore('main',() => {const someState = ref('你好 pinia')return { someState }},{persist: true,}
)

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

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

相關文章

前饋神經網絡多分類任務

pytorch深度學習的套路都差不多&#xff0c;多看多想多寫多測試&#xff0c;自然就會了。主要的技術還是在于背后的數學思想和數學邏輯。 廢話不多說&#xff0c;上代碼自己看。 import torch import numpy as np import torch.nn as nn import torchvision import torchvisi…

【騰訊云Cloud Studio實戰訓練營】使用Cloud Studio社區版快速構建React完成點餐H5頁面還原

陳老老老板&#x1f9b8; &#x1f468;?&#x1f4bb;本文專欄&#xff1a;生活&#xff08;主要講一下自己生活相關的內容&#xff09; &#x1f468;?&#x1f4bb;本文簡述&#xff1a;生活就像海洋,只有意志堅強的人,才能到達彼岸。 &#x1f468;?&#x1f4bb;上一篇…

成集云 | 用友U8采購請購單同步釘釘 | 解決方案

源系統成集云目標系統 方案介紹 用友U8是中國用友集團開發和推出的一款企業級管理軟件產品。具有豐富的功能模塊&#xff0c;包括財務管理、采購管理、銷售管理、庫存管理、生產管理、人力資源管理、客戶關系管理等&#xff0c;可根據企業的需求選擇相應的模塊進行集…

什么是原子交換?

安全地在各個區塊鏈網絡之間傳輸資產對于釋放被困流動性并吸引更多用戶進入這一領域至關重要&#xff0c;同時也保持 Web3 的信任最小化核心價值。原子交換是一種讓兩個人在不依賴于中介來促成交易的情況下&#xff0c;在不同的區塊鏈網絡之間交換通證資產的方式。這為 DeFi 用…

Linux硬鏈接和軟連接

1、硬鏈接 硬連接指通過索引節點來進行連接。在 Linux 的文件系統中&#xff0c;保存在磁盤分區中的文件不管是什么類型都給它分配一個編號&#xff0c;稱為索引節點號(Inode Index)。在 Linux 中&#xff0c;多個文件名指向同一索引節點是存在的。比如&#xff1a;A 是 B 的硬…

數據結構之隊列詳解(包含例題)

一、隊列的概念 隊列是一種特殊的線性表&#xff0c;特殊之處在于它只允許在表的前端&#xff08;front&#xff09;進行刪除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;進行插入操作&#xff0c;和棧一樣&#xff0c;隊列是一種操作受限制的線性表。進行插入操…

【Windows 常用工具系列 5 -- Selenium IDE的使用方法 】

文章目錄 Selenium 介紹Selenium IDE 介紹 Selenium IDE安裝Chrome 瀏覽器安裝Selenium IDE使用 Selenium 介紹 Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作一樣。 Selenium家庭成員有三個&#xff0c;分別是S…

Ubuntu 20.04 與 ROS noetic安裝 gtsam 編譯 LIO-SAM 的適配版本

Ubuntu 20.04 基于 ROS noetic安裝 gtsam&#xff0c; 編譯 LIO-SAM 的適配版本 摘要安裝GTSAM(ros-noetic-gtsam版本)編譯LIO-SAM的適配版本 摘要 本文簡介在 Ubuntu 20.04 下以 ROS noetic 為基礎安裝 GTSAM 并成功編譯 LIO-SAM 的適配版本。 安裝GTSAM(ros-noetic-gtsam版…

騰訊云國際站代充-阿里云ECS怎么一鍵遷移到騰訊云cvm?

今天主要來介紹一下如何通過阿里云國際ECS控制臺一鍵遷移至騰訊云國際CVM。騰訊云國際站云服務器CVM提供全面廣泛的服務內容。無-需-綁-定PayPal&#xff0c;代-充-值騰訊云國際站、阿里云國際站、AWS亞馬遜云、GCP谷歌云&#xff0c;官方授權經銷商&#xff01;靠譜&#xff0…

視頻匯聚集中存儲EasyCVR平臺調用iframe地址視頻無法播放,該如何解決?

安防監控視頻匯聚平臺EasyCVR基于云邊端一體化架構&#xff0c;具有強大的數據接入、處理及分發能力&#xff0c;可提供視頻監控直播、云端錄像、視頻云存儲、視頻集中存儲、視頻存儲磁盤陣列、錄像檢索與回看、智能告警、平臺級聯、云臺控制、語音對講、AI算法中臺智能分析無縫…

【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口

1. ApplicationRunner接口 用法&#xff1a; 類型&#xff1a; 接口 方法&#xff1a; 只定義了一個run方法 使用場景&#xff1a; springBoot項目啟動時&#xff0c;若想在啟動之后直接執行某一段代碼&#xff0c;就可以用 ApplicationRunner這個接口&#xff0c;并實現接口…

vue3+elementUI-plus實現select下拉框的虛擬滾動

網上查了幾個方案&#xff0c;要不就是不兼容&#xff0c;要不就是不支持vue3, 最終找到一個合適的&#xff0c;并且已上線使用&#xff0c;需要修改一下樣式&#xff1a; 代碼如下&#xff1a; main.js里引用 import vue3-virtual-scroller/dist/vue3-virtual-scroller.css; …

xollam勒索病毒數據恢復|金蝶、用友、管家婆、OA、速達、ERP等軟件數據庫恢復

引言&#xff1a; 數字時代的繁榮與便捷&#xff0c;也孕育著各種網絡安全威脅。其中&#xff0c;.xollam勒索病毒以其毒害性和隱蔽性引發了廣泛關注。本文91數據恢復將為您深入解析.xollam勒索病毒的威脅&#xff0c;探討解密方法&#xff0c;同時分享預防.xollam勒索病毒的關…

Python入門教程23:math模塊的用法

**math是Python 的一個內置模塊&#xff0c;它提供了許多數學函數和常量&#xff0c;用于進行數學計算。**以下是一些常用的math模塊中的函數和常量&#xff1a; math.pi&#xff1a;圓周率π的近似值&#xff0c;約等于3.14159。 math.e&#xff1a;自然對數的底數e的近似值…

【Tomcat】(Tomcat 下載Tomcat 啟動Tomcat 簡單部署 基于Tomcat進行網站后端開發)

文章目錄 Tomcat下載Tomcat啟動Tomcat簡單部署 基于Tomcat進行網站后端開發 Tomcat Tomcat 是一個 HTTP 服務器.HTTP 協議就是 HTTP 客戶端和 HTTP 服務器之間的交互數據的格式. HTTP 服務器我們可以通過 Java Socket 來實現. 而 Tomcat 就是基于 Java 實現的一個開源免費,也是…

Python爬蟲:如何使用Python爬取網站數據

更新&#xff1a;2023-08-13 15:30 想要獲取網站的數據&#xff1f;使用Python爬蟲是一個絕佳的選擇。Python爬蟲是通過自動化程序來提取互聯網上的信息。本文章將會詳細介紹Python爬蟲的相關技術。 一、網絡協議和請求 在使用Python爬蟲之前&#xff0c;我們需要理解網絡協…

Synopsys EDA數字設計與仿真

搭建EDA環境 參考如下博文安裝Synopsys EDA開發工具 https://blog.csdn.net/tugouxp/article/details/132255002?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132255002%22%2C%22source%22%3A%22tugouxp%22%7D Synopsys ED…

【Git】本地搭建Gitee、Github環境

本地 &#xff08;Local&#xff09; 1、使用命令生成公鑰&#xff08;pub文件&#xff09; 1. $ ssh-keygen -t rsa -C "xxxxxxxemail.com" -f "github_id_rsa" 2. $ ssh-keygen -t rsa -C "xxxxxxxemail.com" -f "gitee_id_rsa" …

配置pyqt5開發環境

安裝庫 pip install pyqt5 -i https://mirrors.aliuyun.com/pypi/simple pip install pyqt5-tools -i https://mirrors.aliuyun.com/pypi/simple pip install PyQt5designer -i https://mirrors.aliuyun.com/pypi/simple配置External Tools Name:QtDesigner Program:C:\Anaco…

常見的 JavaScript 框架比較

以下是10種常見的JavaScript框架的比較&#xff1a; React&#xff1a;是由Facebook開發和維護的開源JavaScript庫&#xff0c;用于構建用戶界面。它允許你使用組件來構建復雜的UI&#xff0c;并專注于每個組件的內部邏輯&#xff0c;而不必擔心管理整個應用程序的狀態。WebBu…