Vue3从入门到实战:掌握状态管理库pinia(下部分)

news2025/1/21 10:17:39

1.storeToRefs 

在Count.vue文件中 

 显的冗余了,如何更加优雅简化代码。用storeToRefs 

 

 补充:

为什么不用ToRefs呢?

使用的话会将所有数据都用ref引用包裹,其实方法等是没必要包裹的,具有一定风险


 2.getters的使用

概念:当state中的数据,需要经过处理后再使用时,可以使用getters配置。

1.在count.ts文件增添getters

第二种写法:

1.简化写法

2.将up的xiaoli转换成大写

 或者

 

追加getters配置并从组件中读取数据 。

count.ts文件代码:

import {defineStore} from 'pinia'

export const useCountStore = defineStore('count',{
   // actions里面放置的是一个一个的方法,用于响应组件中的“动作”
   actions:{
    increment(value:number){
      console.log('increment被调用了',value)
      if( this.sum < 10){
        // 修改数据(this是当前的store)
        this.sum += value,
        this.up ='xiaoli',
        this.message='欢迎来看我的博客,别忘了点赞噢,谢谢'
      }
    }
  },
  // 真正存储数据的地方
  state(){
    return {
      sum:6,
      up:'xxx',
      message:'xxxxxxxx'
    }
  },
  getters:{
    bigSum:state=>state.sum*10,//通过回调来简化写法


    upperUp():String{//这里的state可以用this表示
      return this.up.toUpperCase()//有this不能用回调!!!
    }
  }

})

Conunt.vue文件代码:

<template>
  <div class="count">
    <h2>当前求和为:{{ sum }},扩大十倍后: {{bigSum}}</h2>
    <h3>博主:{{up}},转换大写后:{{ upperUp }}</h3>
    <h4>他想说的话:{{ message }}</h4>
    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add">加</button>
    <button @click="minus">减</button>
  </div>
</template>

<script setup lang="ts" name="Count">
  import { ref,reactive } from "vue";
  import {useCountStore} from '@/store/count'
  import { storeToRefs } from "pinia";
  import{toRefs} from 'vue'

  const countStore = useCountStore()
 const{sum,up,message,bigSum,upperUp} = toRefs(countStore)

  // 数据
  let n = ref(1) // 用户选择的数字
  // 方法

  
  function add(){
    //第一种修改方式
    //  countStore.sum = 8888888,
    //  countStore.up='小李同学',
    //  countStore.message='欢迎来看我的博客,别忘了点赞噢,谢谢'

    //第二种修改方式
    // countStore.$patch({
    //   sum:666,
    //   up:'小李同学',
    //   message:'欢迎来看我的博客,别忘了点赞噢,谢谢'
    // })


     // 第三种修改方式
     countStore.increment(n.value)

  }


  function minus(){
    countStore.sum -= n.value
  }
</script>

<style scoped>
  .count {
    background-color: skyblue;
    padding: 10px;
    border-radius: 10px;
    box-shadow: 0 0 10px;
  }
  select,button {
    margin: 0 5px;
    height: 25px;
  }
</style>

3.$subscribe

通过 store 的 $subscribe() 方法侦听 state 及其变化还可以实现刷新后仍保留数据

loveTalk.ts文件代码:

import {defineStore} from 'pinia' // 引入 pinia 的 defineStore 方法,用于定义状态管理仓库  
import axios from 'axios' // 引入 axios 库,用于发送 HTTP 请求  
import {nanoid} from 'nanoid' // 引入 nanoid 库,用于生成唯一的 ID  
  
// 导出名为 useTalkStore 的状态管理仓库  
export const useTalkStore = defineStore('talk',{  
  // 定义 actions,用于包含异步操作或批量修改状态的操作  
  actions:{  
    // 定义一个异步方法 getATalk,用于获取一条随机的土味情话语录  
    async getATalk(){  
      // 发送 GET 请求到指定的 URL,并等待响应结果  
      // 使用连续解构赋值和重命名的方式获取响应数据中的 content 字段,并将其重命名为 title  
      let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')  
        
      // 创建一个新的对象 obj,包含使用 nanoid 生成的唯一 ID 和上面获取的 title  
      let obj = {id:nanoid(),title}  
        
      // 将新创建的对象 obj 插入到 talkList 数组的开头  
      this.talkList.unshift(obj)  
    }  
  },  
  // 定义 state,用于返回组件或应用的初始状态  
  state(){  
    // 尝试从 localStorage 中获取 'talkList' 键对应的值,并解析为 JavaScript 对象或数组  
    // 如果解析失败或获取不到值,则返回一个空数组作为 talkList 的默认值  
    return {  
      talkList:JSON.parse(localStorage.getItem('talkList') as string) || []  
    }  
  }  
})

 LoveTalk.vue文件代码:

<template>
  <div class="talk">
    <button @click="getLoveTalk">获取一句土味情话</button>
    <ul>
      <li v-for="talk in talkList" :key="talk.id">{{talk.title}}</li>
    </ul>
  </div>
</template>

<script setup lang="ts" name="LoveTalk">
  import {useTalkStore} from '@/store/loveTalk'
  import { storeToRefs } from "pinia";

  const talkStore = useTalkStore()
  const {talkList} = storeToRefs(talkStore)

  talkStore.$subscribe((mutate,state)=>{
    console.log('talkStore里面保存的数据发生了变化',mutate,state)
    localStorage.setItem('talkList',JSON.stringify(state.talkList))
  })
  
  // 方法
  function getLoveTalk(){
    talkStore.getATalk()
  }
</script>

<style scoped>
  .talk {
    background-color: orange;
    padding: 10px;
    border-radius: 10px;
    box-shadow: 0 0 10px;
  }
</style>

展示: 


4.store的组合式写法 

这种组合式写法的优势在于它提供了更好的代码组织和复用性。通过将逻辑封装在单独的函数中,使用 setup 函数和组合式 API 的其他函数(如 reactive),可以更灵活地控制组件的状态和行为。 

之前我们这样写就是选项式的写法 

换成组合式写法 :

loveTalk代码: 

import {defineStore} from 'pinia'
import axios from 'axios'
import {nanoid} from 'nanoid'

//选项式写法
/* export const useTalkStore = defineStore('talk',{
  actions:{
    async getATalk(){
      // 发请求,下面这行的写法是:连续解构赋值+重命名
      let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
      // 把请求回来的字符串,包装成一个对象
      let obj = {id:nanoid(),title}
      // 放到数组中
      this.talkList.unshift(obj)
    }
  },
  // 真正存储数据的地方
  state(){
    return {
      talkList:JSON.parse(localStorage.getItem('talkList') as string) || []
    }
  }
})
 */


//组合式写法
import {reactive} from 'vue'
export const useTalkStore = defineStore('talk',()=>{
  // talkList就是state
  const talkList = reactive(
    JSON.parse(localStorage.getItem('talkList') as string) || []
  )

  // getATalk函数相当于action
  async function getATalk(){
    // 发请求,下面这行的写法是:连续解构赋值+重命名
    let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
    // 把请求回来的字符串,包装成一个对象
    let obj = {id:nanoid(),title}
    // 放到数组中
    talkList.unshift(obj)
  }
  return {talkList,getATalk}
})

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

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

相关文章

SSM 项目学习(Vue3+ElementPlus+Axios+SSM)

文章目录 1 项目介绍1.1 项目功能/界面 2 项目基础环境搭建2.1 创建项目2.2 项目全局配置 web.xml2.3 SpringMVC 配置2.4 配置 Spring 和 MyBatis , 并完成整合2.5 创建表&#xff0c;使用逆向工程生成 Bean、XxxMapper 和 XxxMapper.xml2.6 注意事项和细节说明 3 实现功能 01-…

jvm基础三——类加载器

类加载器 在Java中&#xff0c;类加载器&#xff08;Class Loader&#xff09;是Java虚拟机&#xff08;JVM&#xff09;的一部分&#xff0c;负责将类文件&#xff08;.class文件&#xff09;加载到JVM中&#xff0c;使得程序能够使用这些类。类加载器在Java中具有重要的作用&…

Mysql启动失败解决过程

报错内容如下&#xff1a; Mar 05 18:40:49 VM-0-12-centos systemd[1]: Failed to start MySQL Server. Mar 05 18:40:49 VM-0-12-centos systemd[1]: Unit mysqld.service entered failed state. Mar 05 18:40:49 VM-0-12-centos systemd[1]: mysqld.service failed. Mar 05…

人工智能数据分析Python常用库 04 matplotlib库

文章目录 一、matplotlib库的作用与环境配置1、环境配置示例2、改变绘图风格3、保存图片 二、绘制二维图形1、折线图&#xff08;1&#xff09;示例&#xff08;2&#xff09;调整线条颜色&#xff1a;&#xff08;3&#xff09;调整线条风格&#xff08;4&#xff09;调整线宽…

非关系型数据库------------Redis的安装和部署

目录 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.2.1非关系型数据库产生背景 1.3关系型非关系型区别 1.4客户访问时&#xff0c;关系型数据库与redis的工作过程 二、Redis 2.1redis简介 2.2Redis命中机制和淘汰机制 2.3Redis 具有以下优…

解决VScode中matplotlib图像中文显示问题

一、更改配置文件 参考这个文件路径找到自己Python环境下的matplotlibrc文件并用记事本打开。 用ctrl F寻找下面的这两行并将前面的#删除&#xff0c;保存并退出。 font.family: sans-serif font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, N…

Nature正刊重磅!热带雨林正接近临界温度阈值:气候变化可能会使热带森林太热而无法进行光合作用

2023年8月23日&#xff0c;美国北亚利桑那大学生态信息学Doughty, Christopher E. 副教授及其研究组人员在国际知名学术期刊《Nature》发表了一项题为“Tropical forests are approaching critical temperature thresholds”的研究。提出了热带雨林正接近临界温度阈值的新见解。…

Hadoop-入门

资料来源&#xff1a;尚硅谷-Hadoop 一、Hadoop 概述 1.1 Hadoop 是什么 1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题。 3&#xff09;广义上来说&#xff0c;Hadoop…

状态优先级

文章目录 状态优先级1. 进程状态1.1 进程状态查看1.2 僵尸进程1.3 孤儿进程 2.进程优先级2.1 基本概念2.2 查看系统进程2.3 PRI and NI2.4 PRI vs NI 3. 查看进程优先级的命令3.1 top命令更改nice3.2 其他概念 状态优先级 1. 进程状态 看看Linux内核源代码怎么说 为了弄明白…

2024.4.3-[作业记录]-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

每天五分钟深度学习:深度学习中数据样本和标签的符号化表示

本文重点 在深度学习的研究与应用中&#xff0c;数据样本和标签的符号化表示是至关重要的一环。通过合理的符号化表示&#xff0c;我们可以将现实世界中的数据转化为计算机能够理解和处理的形式&#xff0c;从而为后续的模型训练和推理提供基础。本文将对深度学习中数据样本和…

Github 2024-04-05Java开源项目日报Top9

根据Github Trendings的统计,今日(2024-04-05统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目1OpenAPI 生成器:基于规范自动生成API工具 创建周期:2155 天开发语言:Java协议类型:Apache License 2.0Star数量:1…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--初尝php

初尝php 打开你下载的wordpress文件夹&#xff0c;如果你用的xampp那它就在xampp安装的文件夹–htdocs文件夹–你可以新建一个test文件夹–新建一个test.php文件 <html><head><title>First attempt at PHP</title></head><body><?ph…

深入浅出 -- 系统架构之分布式系统底层的一致性

在分布式领域里&#xff0c;一致性成为了炙手可热的名词&#xff0c;缓存、数据库、消息中间件、文件系统、业务系统……&#xff0c;各类分布式场景中都有它的身影&#xff0c;因此&#xff0c;想要更好的理解分布式系统&#xff0c;必须要理解“一致性”这个概念。 其实关于…

4.双向循环链表的模拟实现

1.双向链表的实现 1.1双向链表节点的结构声明 typedef int LTDataType;typedef struct ListNode {struct ListNode* prev; // 指向该节点的前一个节点struct ListNode* next; // 指向该节点的后一个节点LTDataType data; // 该节点中存储的数据 }LTNode; // 将这…

QT-QPainter

QT-QPainter 1.QPainter画图  1.1 概述  1.1 QPainter设置  1.2 QPainter画线  1.3 QPainter画矩形  1.4 QPainter画圆  1.5 QPainter画圆弧  1.6 QPainter画扇形 2.QGradient  2.1 QLinearGradient线性渐变  2.2 QRadialGradient径向渐变  2.3 QConicalGr…

关于怎么在github上查看到历史版本信息

最近在跟着教程实践&#xff0c;会不断往项目里写内容&#xff0c;想保留每次实践的效果&#xff0c;所以每次完成后&#xff0c;会commit并push到github中&#xff0c;下面说明一下怎么查看历史版本二信息。 以我的这篇仓库为例&#xff08;SpringCloudDemo&#xff09; 步骤…

linux使用supervisor部署springboot

supervisor 美&#xff1a;[suːpərvaɪzər ] n.监督人;主管人;指导者; Supervisor是一个进程控制系统工具&#xff0c;用于在Linux系统上管理和监控其他进程。它可以启动、停止、重启和监控应用程序或服务&#xff0c;并在其异常退出时自动重启它们。Supervisor通过提供一个…

Python深度学习车辆特征分析系统(V2.0),附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

LeetCode-79. 单词搜索【数组 字符串 回溯 矩阵】

LeetCode-79. 单词搜索【数组 字符串 回溯 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;回溯 回溯三部曲。这里比较关键的是给board做标记&#xff0c;防止之后搜索时重复访问。解题思路二&#xff1a;回溯算法 dfs,直接看代码,很容易理解。visited哈希&#xff0c;防止…