在vue3使用Pinia

2023-10-30

今年到今天已經過了一大半了,又有新的技術需要學習了。這次由於vue3的到來vuex也被官方deprecated , 隨之取代的則是Pina。

本篇紀錄學習Pina的相關筆記!

定義 一個 store

為什麼是一個呢?這是因為在pinia中可以將store模塊化, 所以可以有多個store,而每個store都是獨立的

安裝完pinia後新建一個stores的資料夾,然後在底下新增index.js

這裡要注意的是main作為第一個參數表達的是id的意思,只能是唯一,不可重複的

從下面的代碼中可以看到結構和vuex是相似的,最大的區別則是少了mutation.

// store/indxe.js
import { defineStore } from 'pinia'

// useStore 可以是 useUser、useCart 之类的任何东西
// 第一个参数是应用程序中 store 的唯一 id
export const useStore = defineStore('main',{
  state:()=>{
    return {}
  },
  getters:{},
  actions:{}
})

在vue3中使用store

這裡看的是當你想要使用哪一個store則引用哪一個store

import { useStore } from '@/stores/counter'

export default {
  setup() {
    const store = useStore()

    return {
      // 可返回整個實例,並在模板中使用它
      store,
    }
  },
}

注意事項

這裡請注意,因為store是用reactive包裹成的對象,當使用解構時其資料將會失去響應式的作用
 

export default defineComponent({
  setup() {
    const store = useStore()
    // ❌ 這不起作用,因為它會破壞響應式
    // 這和從 props 解構是一樣的
    const { name, doubleCount } = store

    name // "eduardo"
    doubleCount // 2

    return {
      // 一直會是 "eduardo"
      name,
      // 一直會是 2
      doubleCount,
      // 這將是響應式的
      doubleValue: computed(() => store.doubleCount),
      }
  },
})

如果一定要使用解構,且只是讀取而不進行操作的時候可以使用pinia內建的storeToRefs來對任何响应式属性创建 refs

import { storeToRefs } from 'pinia'

export default defineComponent({
  setup() {
    const store = useStore()
    // `name` 和 `doubleCount` 是響應式引用
    // 這也會為插件添加的屬性創建引用
    // 但跳過任何 action 或 非響應式(不是 ref/reactive)的屬性
    const { name, doubleCount } = storeToRefs(store)

    return {
      name,
      doubleCount
    }
  },
})

改變數據

接下來可以讀取以後,要做的就是最數據進行修改,與vuex的不同是,vuex修改state時必須透過mutation來進行修改, 而pinia則是可直接對state進行修改, 方便且直觀許多

// store/indxe.js
import { defineStore } from 'pinia'

// useStore 可以是 useUser、useCart 之类的任何东西
// 第一个参数是应用程序中 store 的唯一 id
export const useStore = defineStore('main',{
  state:()=>{
    return {
       counter: 0
    }
  },
  getters:{},
  actions:{}
})


// test.vue
import { useStore } from '@/stores/counter'

export default defineComponent({
  setup() {
    const store = useStore()
    const store = useStore()
    const onBtnClick = () => {
       store.counter++
    }

    return {
      onBtnClick
  },
})

重置狀態: $reset

如果想要回到最初值(在這裡的範例是 0)的話則可使用$reset()

const store = useStore()

store.$reset()

改變狀態: $patch

如果要改變多個數值的時候則可以使用$patch, 那麼這裡跟剛剛提到的直接對state修改看起來結果是一致的,那麼為什麼要使用$patch呢?

$patch 是經過優化的,會加快修改速度,對程序的性能有很大的好處。所以如果是多條條數據同時更新狀態數據,推薦使用$patch方式更新。
const handleClickPatch = () => {
  store.$patch({
    count: store.count + 2,
    text: '我被修改了',
  });
};

不過官方提醒: 

這種語法應用某些突變非常困難或代價高昂:任何集合修改(例如,從數組中推送、刪除、拼接元素)都需要您創建一個新集合。

因此$patch 方法也接受一個函數來批量修改集合內部分對象的情況:

cartStore.$patch((state) => {
  state.items.push({ name: 'shoes', quantity: 1 })
  state.hasChanged = true
})

替換整個state

在pinia也允許替換整個state

store.$state = { counter: 666, name: 'Paimon' }

實施對state的監聽

<template>
  <div>
    {{ baseUrl }}
  </div>
  <div v-show="isShow">
    該我出現了
  </div>
  <button @click="changeData">
    通過actions改變數據
  </button>
</template>
 
<script>
import appStore from "@/store/app"
import {storeToRefs} from "pinia"
import {ref} from "vue"
 
export default {
  name: "PiniaSubscribe",
  setup() {
    const store = appStore()
    const {baseUrl} = storeToRefs(store)
    const afterChangeUrl = 'https://www.taobao.com/'
    let isShow = ref(false)
 
    const subscribe = store.$subscribe((mutation, state) => {
      /*
      * mutation主要包含三個屬性值:
      *   events:當前state改變的具體數據,包括改變前的值和改變後的值等等數據
      *   storeId:是當前store的id
      *   type:用於記錄這次數據變化是通過什麼途徑,主要有三個分別是
      *         “direct” :通過 action 變化的
                ”patch object“ :通過 $patch 傳遞對象的方式改變的
                “patch function” :通過 $patch 傳遞函數的方式改變的
      *
      * */
      // 我們就可以在此處監聽store中值的變化,當變化為某個值的時候,去做一些業務操作之類的
      console.log(mutation)
      console.log(state.baseUrl)
      if (state.baseUrl === afterChangeUrl) isShow.value = true
      else isShow.value = false
    }, {detached: false})  //第二個參數options對象,是各種配置參數
    //detached:布爾值,默認是 false,正常情況下,當訂閱所在的組件被卸載時,訂閱將被停止刪除,
    // 如果設置detached值為 true 時,即使所在組件被卸載,訂閱依然在生效
    //參數還有immediate,deep,flush等等參數 和vue3 watch的參數是一樣的,多的就不介紹了,用到再看文檔吧
 
    // 停止訂閱
    // subscribe()  //調用上方聲明的變量值,示例(subscribe),即可以停止訂閱
 
    function changeData() {
      store.changeState(afterChangeUrl)
    }
 
    return {
      isShow,
      baseUrl,
      changeData
    }
  }
}
</script>

以上不定時更新~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在vue3使用Pinia 的相关文章

  • RTSP SDP RTP/RTCP介绍

    应用层 RTSP SDP 传输层 RTP TCP UDP 网络层 IP SDP 1 SDP Session Description Protocol 是服务器端生成的描述媒体文件的编码信息以及所在服务器的链接等信息的文件 客户端通过它来设置
  • 数竞(非数)

    极限 泰勒公式 麦克劳林公式 导数 求导公式 曲平面在某点处的切平面方程 多元隐函数求导 微分 一阶线性非齐次微分方程通解公式 二阶线性微分方程 二元函数的一阶麦克劳林公式 可微函数取极值的必要条件 驻点 极限存在的充分条件 正定矩阵 拉格
  • React高级指引:高阶组件

    上一节 Fragments React高级指引7 高阶组件 引言 使用高阶组件解决横切关注点问题 不要修改原始组件 使用组合 约定 将不想管的props传递给被包裹的组件 约定 最大化可组合性 约定 包裹显示名称一遍轻松调试 注意事项 不要

随机推荐

  • java 判断参数日期在当年是第多少天工具类

    记录 项目中特定场景使用 public class SolutionUtil 判断参数日期在当年是第多少天 param date return public static int dayOfYear Date date 格式化时间 Simp
  • MySQL备份与恢复

    MySQL备份与恢复 MySQL常用日志介绍 MySQL日志简介 错误日志 1 查看错误日志位置 show variables like log error 2 mysql错误日志默认在MySQL的安装目录下 etc my cnf mysq
  • C++:模拟实现vector以及vector的迭代器失效和拷贝问题

    文章目录 实现的功能 模拟实现 迭代器失效 隐含浅拷贝问题 实现的功能 模拟实现 由于前面实现了string 因此这里实现过程不为重点 重点为关于迭代器失效和拷贝问题 template
  • R语言-数据包络分析法--DEA模型

    2 1介绍 DEA模型又称投入导向模型CCR 它基于规模报酬不变前提 2 2步骤 假设我们要计算一组n个决策单元 DMU 它可能是企业 政府部门 学校或医院等 这n个DMU的技术效率记为DMUj 每一个DMU有m种投入 记为xi 投入权重表
  • C++题目:海伦公式

    海伦公式 题目描述 海伦公式亦称 海伦 秦九韶公式 可以直接用三角形的三条边长来计算出三角形面积 此公式是亚历山大港的海伦发现或记载的 并可在其于公元60年的 Metrica 中找到其证明 亦有人认为更早时阿基米德已经懂得这条公式 而由于
  • 【Python】字符串‘(25, 140, 39, 143)‘如何变为元组(25, 140, 39, 143)?有哪些方法?

    文章目录 一 问题提出 二 解决方法 2 1 tuple 函数 2 2 ast literal eval 函数 一 问题提出 image name cropped 25 140 39 143 obj365 val 000000685822
  • 富文本quill的封装使用(超链接、图片、视频、音频)

    一 添加依赖 npm install quill 1 3 6 二 封装组件 1 editor vue
  • DBC学习(二)

    一 ByteOrder与Startbit 我们知道计算机存储数据是以字节 Byte 为单位的 将某个字节存入某个地址或从某个地址读出某个字节 对于单字节数据 这种处理方式简单直白没有问题 但当处理多字节数据时就会遇到问题 这些字节要按照怎样
  • javaweb后台程序如何查找bug

    方法 1 通过请求分析问题出在前端还是后台 分析请求的url以及参数是否正确 2 如果发生在后台 查看请求的接口 3 调试 可以查看日志记录 异常信息 4 确定错误具体发生的问题 并修改
  • wordpress 靶机渗透

    人过留名 雁过留声 人生天地间 凡有大动静处 必有猪头 环境准备 VMware workstation Pro12 Kali 虚拟机 攻击机IP 10 10 16 133 Wordpress 虚拟机 靶机IP 10 10 16 135 NA
  • window下本地静态IP的设置(及虚拟机和主机网络连接方式——主机模式、桥接模式、NAT模式)

    开始 设置 网络 至此本地静态IP的设置就设置好了 子网掩码 通常是255 255 255 0 它用来指明一个IP地址的哪些位标识的是主机所在的子网 以及哪些位标识的是主机的位掩码 子网掩码不能单独存在 它必须结合IP地址一起使用 子网掩码
  • 04 统计语言模型(n元语言模型)

    博客配套视频链接 https space bilibili com 383551518 spm id from 333 1007 0 0 b 站直接看 配套 github 链接 https github com nickchen121 Pr
  • Centos8上加速git clone

    首先通过命令获取域名对应的IP地址 root ggbond nslookup github global ssl fastly net root ggbond nslookup github com 之后如上获取到的IP地址 以IP 域名的
  • 亚马逊AWS免费云服务实战

    最近AWS推出了一个云服务免费使用一年的优惠 有免费的当然不能浪费咯 赶紧下手 本文重点介绍如何注册AWS的账号 以及申请使用免费云服务ES2 一台位于美国的虚拟机 话说如果是用阿里云在美国的ECS 要188RMB 月 这优惠可是杠杠的 点
  • java 判断文件名合法_java用正则方法验证文件名是否合法

    Java中用到文件操作时 经常要验证文件名是否合法 用File类的createNewFile 方法的确很管用 但当要批量验证时 效率上就会有问题 正则匹配的开销比创建文件少了很多 那么一个合法的文件 Win下 应该符合如下规则 1 文件名不
  • 主成分回归笔记

    关于主成分分析 请参考我之前的文章 主成分回归 PCR 是多元线性回归 MLR 的替代方法 相对于MLR具有许多优势 1 什么是主成分回归 为什么要使用它 主成分回归最初是由肯德尔 Kendall 1957 提出的 前提是使用对回归变量执行
  • 六种方法解决Tomcat启动失败提示Server Tomcat v7.0 Server at localhost failed to start

    Tomcat启动失败提示Server Tomcat v7 0 Server at localhost failed to start 1 把你工作空间按照如下的文件路径打开
  • Timit 数据集中音频无法播放,使用python进行格式转换[附Timit 百度网盘下载地址]

    Timit原始数据虽然是以wav结尾的但是格式却不是wav 而是sphere格式 用python中的sphfile库把他转换成wav import params as hp from sphfile import SPHFile impor
  • masscan扫描结果转成Excel

    coding UTF 8 from openpyxl import Workbook wb Workbook ws wb active row 2 filedir result1 txt result2 txt filedir live x
  • 在vue3使用Pinia

    今年到今天已經過了一大半了 又有新的技術需要學習了 這次由於vue3的到來vuex也被官方deprecated 隨之取代的則是Pina 本篇紀錄學習Pina的相關筆記 定義 一個 store 為什麼是一個呢 這是因為在pinia中可以將st