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


    1.storeToRefs 

    在Count.vue文件中 

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

     

     补充:

    为什么不用ToRefs呢?

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


     2.getters的使用

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

    1.在count.ts文件增添getters

    第二种写法:

    1.简化写法

    2.将up的xiaoli转换成大写

     或者

     

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

    count.ts文件代码:

    1. import {defineStore} from 'pinia'
    2. export const useCountStore = defineStore('count',{
    3. // actions里面放置的是一个一个的方法,用于响应组件中的“动作”
    4. actions:{
    5. increment(value:number){
    6. console.log('increment被调用了',value)
    7. if( this.sum < 10){
    8. // 修改数据(this是当前的store)
    9. this.sum += value,
    10. this.up ='xiaoli',
    11. this.message='欢迎来看我的博客,别忘了点赞噢,谢谢'
    12. }
    13. }
    14. },
    15. // 真正存储数据的地方
    16. state(){
    17. return {
    18. sum:6,
    19. up:'xxx',
    20. message:'xxxxxxxx'
    21. }
    22. },
    23. getters:{
    24. bigSum:state=>state.sum*10,//通过回调来简化写法
    25. upperUp():String{//这里的state可以用this表示
    26. return this.up.toUpperCase()//有this不能用回调!!!
    27. }
    28. }
    29. })

    Conunt.vue文件代码:

    1. <script setup lang="ts" name="Count">
    2. import { ref,reactive } from "vue";
    3. import {useCountStore} from '@/store/count'
    4. import { storeToRefs } from "pinia";
    5. import{toRefs} from 'vue'
    6. const countStore = useCountStore()
    7. const{sum,up,message,bigSum,upperUp} = toRefs(countStore)
    8. // 数据
    9. let n = ref(1) // 用户选择的数字
    10. // 方法
    11. function add(){
    12. //第一种修改方式
    13. // countStore.sum = 8888888,
    14. // countStore.up='小李同学',
    15. // countStore.message='欢迎来看我的博客,别忘了点赞噢,谢谢'
    16. //第二种修改方式
    17. // countStore.$patch({
    18. // sum:666,
    19. // up:'小李同学',
    20. // message:'欢迎来看我的博客,别忘了点赞噢,谢谢'
    21. // })
    22. // 第三种修改方式
    23. countStore.increment(n.value)
    24. }
    25. function minus(){
    26. countStore.sum -= n.value
    27. }
    28. script>
    29. <style scoped>
    30. .count {
    31. background-color: skyblue;
    32. padding: 10px;
    33. border-radius: 10px;
    34. box-shadow: 0 0 10px;
    35. }
    36. select,button {
    37. margin: 0 5px;
    38. height: 25px;
    39. }
    40. style>

    3.$subscribe

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

    loveTalk.ts文件代码:

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

     LoveTalk.vue文件代码:

    1. <script setup lang="ts" name="LoveTalk">
    2. import {useTalkStore} from '@/store/loveTalk'
    3. import { storeToRefs } from "pinia";
    4. const talkStore = useTalkStore()
    5. const {talkList} = storeToRefs(talkStore)
    6. talkStore.$subscribe((mutate,state)=>{
    7. console.log('talkStore里面保存的数据发生了变化',mutate,state)
    8. localStorage.setItem('talkList',JSON.stringify(state.talkList))
    9. })
    10. // 方法
    11. function getLoveTalk(){
    12. talkStore.getATalk()
    13. }
    14. script>
    15. <style scoped>
    16. .talk {
    17. background-color: orange;
    18. padding: 10px;
    19. border-radius: 10px;
    20. box-shadow: 0 0 10px;
    21. }
    22. style>

    展示: 


    4.store的组合式写法 

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

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

    换成组合式写法 :

    loveTalk代码: 

    1. import {defineStore} from 'pinia'
    2. import axios from 'axios'
    3. import {nanoid} from 'nanoid'
    4. //选项式写法
    5. /* export const useTalkStore = defineStore('talk',{
    6. actions:{
    7. async getATalk(){
    8. // 发请求,下面这行的写法是:连续解构赋值+重命名
    9. let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
    10. // 把请求回来的字符串,包装成一个对象
    11. let obj = {id:nanoid(),title}
    12. // 放到数组中
    13. this.talkList.unshift(obj)
    14. }
    15. },
    16. // 真正存储数据的地方
    17. state(){
    18. return {
    19. talkList:JSON.parse(localStorage.getItem('talkList') as string) || []
    20. }
    21. }
    22. })
    23. */
    24. //组合式写法
    25. import {reactive} from 'vue'
    26. export const useTalkStore = defineStore('talk',()=>{
    27. // talkList就是state
    28. const talkList = reactive(
    29. JSON.parse(localStorage.getItem('talkList') as string) || []
    30. )
    31. // getATalk函数相当于action
    32. async function getATalk(){
    33. // 发请求,下面这行的写法是:连续解构赋值+重命名
    34. let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
    35. // 把请求回来的字符串,包装成一个对象
    36. let obj = {id:nanoid(),title}
    37. // 放到数组中
    38. talkList.unshift(obj)
    39. }
    40. return {talkList,getATalk}
    41. })

  • 相关阅读:
    多重背包问题
    Linux Day12 ---进程间通信
    网课没有摄像头,手机如何变成电脑摄像头?
    [环境搭建]OpenHarmony开发环境搭建
    淘宝详情接口
    [kruskal]Darnassus 2022杭电多校第8场 1007
    Android之CompletableFuture一异步编程常用方法
    python3数学计算(四则运算、数学函数)整除、取余、幂运算、平方根、阶乘、对数、三角函数、平均值、标准差、积分、微分等、python数学计算
    配置设备远程管理—eNSP
    yocto meta-st-stm32mp conf文件夹分析
  • 原文地址:https://blog.csdn.net/LHY537200/article/details/137403217