Vue3.3指北(六)

news2024/12/27 13:23:35

Vue3.3指北

  • 1、Vue3状态管理-Pinia
    • 1.1、什么是Pinia
    • 1.2、安装
    • 1.3、Pinia基础使用
    • 1.4、getters实现
    • 1.5、action异步实现
    • 1.6、storeToRefs函数
    • 1.7、Pinia的调试
    • 1.8、总结
    • 1.9、Pinia持久化插件

视频参考教程: 2021年Vue3.0全家桶全系列精讲
随笔记源码: 逍遥的人儿 / KuangStudyVue3
在这里插入图片描述

1、Vue3状态管理-Pinia

1.1、什么是Pinia

Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品

在这里插入图片描述

  • 官方文档:安装 | Pinia 中文文档 (web3doc.top)

1.2、安装

  1. 使用命令行构建项目引入 Pinia 即可
npm init vue@latest

在这里插入图片描述

1.3、Pinia基础使用

  1. stores/counter.js初始化如下代码:
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'

// defineStore('counter') 定义了一个模块 counter
export const useCounterStore = defineStore('counter', () => {
  // 定义数据(state) 相当于Vuex中的 state: {count: 0}
  const count = ref(0)

  // 计算属性
  const doubleCount = computed(() => count.value * 2)

  // 定义修改数据的方法(action)
  const increment = () => {
    count.value++
  }

  return {
    count,
    doubleCount,
    increment
  }
})
  1. 在其他组件中使用
<template>
  <div>
    <h1>count的值为:{{counterStore.count}}</h1>
    <h1>2*count:{{counterStore.doubleCount}}</h1>
    <button @click="counterStore.increment">+1</button>
  </div>
</template>

<script setup>
// 1.导入
import {useCounterStore} from './store/counter.js'
// 2.执行方法得到 store 实例对象
const counterStore = useCounterStore()
</script>

<style scoped>

</style>

1.4、getters实现

Pinia中的 getters 直接使用 computed函数 进行模拟, 组件中需要使用需要把 getters return出去

// 定义数据(state)
const count = ref(0)

// 计算属性
const doubleCount = computed(() => count.value * 2)

相当于 Vuex 中的

getters: {
    doubleCount(state) {
        return state.count * 2
    }
}

1.5、action异步实现

异步action函数的写法和组件中获取异步数据的写法完全一致

需求:在Pinia中获取频道 channels 列表数据并把数据渲染App组件的模板中

  • src/stores/counter.js 中定义异步actions
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import axios from "axios";

const API_URL = 'http://geek.itheima.net/v1_0/channels'


// defineStore('counter') 定义了一个模块 counter
export const useCounterStore = defineStore('counter', () => {
  // 定义数据(state)
  const count = ref(0)

  // 计算属性
  const doubleCount = computed(() => count.value * 2)

  // 定义修改数据的方法(同步action)
  const increment = () => {
    count.value++
  }

  // 定义异步action的方法
  const list = ref([])
  const getList = async () => {
    const res = await axios.get(API_URL)
    list.value = res.data.data.channels
  }

  return {
    count,
    doubleCount,
    increment,
    list,
    getList
  }
})

在其他组件中调用:

<template>
  <div>
    <ul>
      <li v-for="item in counterStore.list" :key="item.id">{{item.name}}</li>
    </ul>
  </div>
</template>

<script setup>
// 1.导入
import {useCounterStore} from '../stores/counter.js'
import {onMounted} from "vue";
// 2.执行方法得到 store 实例对象
const counterStore = useCounterStore()

onMounted(()=> {
  counterStore.getList()
})

</script>


<style>

</style>

1.6、storeToRefs函数

直接解构的写法会让响应式丢失:

<template>
  <div>
    
    <!--<h1>count的值为:{{counterStore.count}}</h1>-->
    <!--<h1>2*count:{{counterStore.doubleCount}}</h1>-->
    <!-- 直接解构不使用counterStore.xxx -->
    <h1>count的值为:{{count}}</h1>  
    <h1>2*count:{{doubleCount}}</h1> 
     
    <!-- 方法解构 -->  
    <button @click="increment">+1</button>  
  </div>
</template>

<script setup>
// 1.导入
import {useCounterStore} from '../stores/counter.js'
// 2.执行方法得到 store 实例对象
const counterStore = useCounterStore()

// 3.解构赋值(丢失响应式)
const {count,doubleCount} = counterStore


// 4.解构赋值(方法直接解构)
const {increment} = counterStore
</script>

上述写法会使得响应式失效,正确写法如下:

<template>
  <div>
    
    <!--<h1>count的值为:{{counterStore.count}}</h1>-->
    <!--<h1>2*count:{{counterStore.doubleCount}}</h1>-->
    <!-- 直接解构不使用counterStore.xxx -->
    <h1>count的值为:{{count}}</h1>  
    <h1>2*count:{{doubleCount}}</h1> 
    <button @click="increment">+1</button>    
  </div>
</template>

<script setup>
// 1.导入
import {useCounterStore} from '../stores/counter.js'
// 2.执行方法得到 store 实例对象
const counterStore = useCounterStore()

// 3.解构赋值(保持数据响应式)
const {count,doubleCount} = storeToRefs(counterStore)

// 4.解构赋值(方法直接解构)
const {increment} = counterStore

</script>

storeToRefs 函数只对数据的响应式保持有效,方法可以直接解构赋值

1.7、Pinia的调试

Vue官方的 dev-tools 调试工具 对 Pinia直接支持,可以直接进行调试

在这里插入图片描述

1.8、总结

  1. Pinia 是用来做什么的?

集中状态管理工具,新一代的vuex

  1. Pinia中还需要 mutation 吗?

不需要,action 既支持同步也支持异步

  1. Pinia如何实现 getter?

computed 计算属性函数

  1. Pinia 产生的 Store 如何解构赋值保持响应式?

storeToRefs 函数

1.9、Pinia持久化插件

官方文档:快速开始 | pinia-plugin-persistedstate (prazdevs.github.io)

  • 持久化插件是为了持久化数据,也就是将项目的 Store 数据进行持久化存储。

开始:

  1. 安装
npm i pinia-plugin-persistedstate
  1. 将插件添加到 pinia 实例上
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)
  1. 创建 Store 时,将 persist 选项设置为 true
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import axios from "axios";

const API_URL = 'http://geek.itheima.net/v1_0/channels'


// defineStore('counter') 定义了一个模块 counter
export const useCounterStore = defineStore('counter', () => {
  // 定义数据(state)
  const count = ref(0)

  // 计算属性
  const doubleCount = computed(() => count.value * 2)

  // 定义修改数据的方法(同步action)
  const increment = () => {
    count.value++
  }

  // 定义异步action的方法
  const list = ref([])
  const getList = async () => {
    const res = await axios.get(API_URL)
    list.value = res.data.data.channels
  }

  return {
    count,
    doubleCount,
    increment,
    list,
    getList
  }
},{
  // 持久化配置
  persist: true
})

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

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

相关文章

Karate轻松实现自动API测试

如果您想做自动API测试&#xff0c;但没有编程背景&#xff0c;那么你必须要给Karate一个机会&#xff01; Karate由Intuit作为开源工具发布。该工具旨在用于自动API测试&#xff0c;并具有使API测试变得轻而易举且实际上令人愉快的所有必需功能。 与需要大量编码的其他自动化…

Linux常用命令——chkconfig命令

在线Linux命令查询工具 chkconfig 检查或设置系统的各种服务 补充说明 chkconfig命令检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序&#xff0c;它可查询操作系统在每一个执行等级中会执行哪些系统服务&#xff0c;其中包括各类常驻服务。谨记chkconf…

CCS3列表和超链接样式

在默认状态下&#xff0c;超链接文本显示为蓝色、下画线效果&#xff0c;当鼠标指针移过超链接时显示为手形&#xff0c;访问过的超链接文本显示为紫色&#xff1b;而列表项目默认会缩进显示&#xff0c;并在左侧显示项目符号。在网页设计中&#xff0c;一般可以根据需要重新定…

通用管理后台项目笔记 - Vue3+Vite安装环境、封装路由

概述 从0打造通用的后台管理系统&#xff0c;系列的第一篇博客&#xff0c;开发环境NodeYarnVite的开发环境&#xff0c;这是记录的学习笔记。 Node环境 本地使用的是Node v18.18.2&#xff0c;npm v9.8.1,安装脚手架工具&#xff0c;npm、cnpm、yarn3种方式&#xff0c;如果…

Linux玩物志:好玩却无用的软件探秘

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 我们已经学习了yum指令&#xff0c;可以在Linux中安装一些软件的指令。下面我们就盘点一些可玩性很高但是却没有什么用的软件&#xff0c;在枯燥的学习中增添一丝乐趣&#xff01; For…

常见排序算法之堆排序

堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或索引总是小于&#xff08;或者大于&#xff09;它的父节点。 需要注意的是排升序要建大堆&#xff0c;排降序建小堆…

虚拟机克隆

linux系统的组成&#xff1b; 主根目录和根目录; 所有的根目录都包含在主根目录中&#xff1b; 根目录&#xff1a; /root /home/xxx,yyy,zzz;主根目录&#xff1b;/ 一个重要的子目录&#xff1a;etc passwd, 保存了所有的三类用户信息&#xff1b;bashrc, 可以设置别名 及…

kafka基本原理详解

Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本&#xff08;replica&#xff09;&#xff0c;基于zookeeper协 调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&am…

模块化时代的必备工具:Webpack详解,为你的项目注入新活力

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

好书分享 | 千万富翁是怎么炼成的?

这是好书分享系列的第1篇&#xff0c;如果觉得对你有帮助&#xff0c;欢迎分享给你的朋友或家人。如果想继续收到本系列推文&#xff0c;请点击下方公众号关注我。 最近在微信读书的新书榜里&#xff0c;看到一本之前在国外网站看到别人推荐的书&#xff0c;《邻家的百万富翁》…

软件开发分享:从瀑布模式到水母模式——ChatGPT如何赋能软件研发全流程

文章目录 &#x1f4cb;前言&#x1f3af;ChatGPT如何赋能软件研发全流程&#x1f3af;ChatGPT和软件开发如何相辅相成&#x1f525;文末送书&#x1f9e9;专家推荐&#x1f9e9;内容介绍&#x1f9e9;作者介绍——陈斌 &#x1f525;参与方式 &#x1f4cb;前言 计算机技术的…

阿里云推出通义千问App,提供全方位的协助

&#x1f989; AI新闻 &#x1f680; 阿里云推出通义千问App&#xff0c;提供全方位的协助 摘要&#xff1a;阿里云旗下大模型通义千问App登陆各大安卓应用市场&#xff0c;具有超大规模预训练模型&#xff0c;可在创意文案、办公助理、学习助手、趣味生活等方面协助用户。功…

asp.net平面设计运营管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

asp.net平面设计运营管理系统 1.绪论 1.1编写的目的 3DA平面设计运营管理系统是为了提供本司经营模式拥有一个更便易管理职员工作的系统。目标是让职员工作更信息化&#xff0c;明确化&#xff1b;方便本司管理员能一站式解决工作中产生的数据进行统一汇总&#xff0c;提升管理…

镭神16线激光雷达跑SC-LeGo-LOAM算法

link 一、运行环境 环境&#xff1a;ubutu18.04ros:melodicpcl:1.8gtsammetis 环境配置&#xff1a; Eigen 3.3.4PCL 1.8.1 &#xff08;1.11不能用&#xff09;ceres 2.0.0gtsam 4.0.0 雷达参数&#xff1a; 二、下载编译运行 已修改配置的源码文件&#xff0c;下载catkin_ma…

【idea】生成banner.txt

Spring Boot banner在线生成工具&#xff0c;制作下载英文banner.txt&#xff0c;修改替换banner.txt文字实现自定义&#xff0c;个性化启动banner-bootschool.netSpring Boot banner工具实现在线生成banner&#xff0c;轻松修改替换实现自定义banner&#xff0c;让banner.txt文…

谈API接入必须了解的各大API调用电商API应用场景

哪些业务场景可以使用API接口&#xff1f; &#xff08;1&#xff09;爬虫业务&#xff1a;在爬虫业务中&#xff0c;使用API接口可以帮助解决IP限制、反爬虫策略等问题&#xff0c;提高爬取数据的效率和稳定性。 &#xff08;2&#xff09;网络安全&#xff1a;在网络安全领…

CB2-2CARD的openSUSE远程SSH登录提示优化

CB2-2CARD的openSUSE远程SSH登录提示优化 1. 源由2. 优化内容2.1 去掉Password/banner前后的prompts提示语句2.2 增加logo登录界面2.3 增加系统运行情况简单汇报2.4 增加banner 3. 优化效果 1. 源由 之前运行的CB2-2CARD的openSUSE安装&NAS环境配置服务器已经运行也有段时…

POI实现省市级联(二级下拉框)

POI实现省市级联&#xff08;二级下拉框&#xff09; POI级联下拉框 直接上代码测试结果参考文章 POI级联下拉框 业务上经常会用到POI做Excel的导出&#xff0c;有时导出需求比较复杂&#xff0c;这里记录一下自己参考网上大神的水月境的博文完成的一个导出Excel省市级连下拉…

语雀故障与反思,顺便再领半年会员!

23 日语雀的故障相信大部分人都已经知道了&#xff0c;官方发布的公告是这样的&#xff1a; 10 月 23 日语雀出现重大服务故障&#xff0c;且持续 7 个多小时才完全恢复&#xff0c;给用户使用造成极大不便&#xff0c;对此我们深感抱歉。经过复盘&#xff0c;我们在这里向大家…

电脑数据文件恢复工具easyrecovery14中文版

当不小心将回收站的文件删除了怎么办&#xff1f;想找回但是不知道怎么找回需要的数据文件&#xff1f;别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具&#xff0c;easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件&#xff0c;这款软件功能…