pinia使用过程中遇到的问题和疑问

1、pinia初始化为空

使用pinia时,如果仓库中state一开始存储的数据为空,那么我们直接使用仓库数据则会报错导致页面刷新为空。可以通过可选链运算符?.解决

使用案例

import { defineStore } from "pinia";
import { reqHospitalDetail } from "@/api/hospital";
let useDetailStore = defineStore("detail", {
  state: () => {
    return {
      hospitalInfo: {},
    };
  },
  actions: {
    async getHospital(hoscode: string) {
      let res = await reqHospitalDetail(hoscode);
      if (res.code === 200) {
        this.hospitalInfo = res.data;
      }
    },
  },
  getters: {},
});
export default useDetailStore;

在页面中使用

<template>
    <div class="title">{{ hosname }}</div>
</template>

<script setup>
import { computed } from 'vue'
import useDetailStore from "@/store/modules/hospitalDetail.ts"
let detailStore = useDetailStore()
let hosname = computed(() => {
    return detailStore.hospitalInfo.hospital?.hosname
})
</script>

hospitalInfo.hospital?.hosname注意是在第一个没有的属性的属性前才用?.

当然我们可以在仓库的state的hospitalInfo对象中预先配置上我们需要的属性,值为空,这样直接用也不会保存

2、pinia解构数据保持响应式

共有两种方式:1、使用计算属性。2、使用storeToRefs将state中变量解构出来使用

使用计算属性

上面初始化为空中已经使用到了计算属性

storeToRefs

<template>
    <div class="title">{{ hosname }}</div>
</template>

<script setup>
import { computed } from 'vue'
import useDetailStore from "@/store/modules/hospitalDetail.ts"
import { storeToRefs } from 'pinia';
let detailStore = useDetailStore()
let {hosname}=storeToRefs(detailStore )
</script>

这种方式使用时不要带.value。并且解构出来只用于读值,也就是不要直接给解构出来的变量赋值

如果需要对仓库中state的变量进行修改。第一种可以通过在actions中的方法去操作state的变量。第二种仓库.state的变量=我们要赋的值

3.本地持久化存储

// 用户相关的仓库
import { defineStore } from "pinia";
import { reqUserLogin } from "@/api/hospital/index.ts";

const useUserStore = defineStore("User", {
  state: () => {
    return {
      // 组件刚加载时,本地可能没有存储过用户信息,那么要给一个空对象
      // 当我们刷新页面时,如果已经登录了直接从本地读取,
      // 如果没有登录,就通过登录触发登录事件userLogin去获取用户信息
      userInfo: JSON.parse(localStorage.getItem("USERINFO")) || {},
    };
  },
  actions: {
    // 用户登录
    async userLogin(loginParams) {
      let res: any = await reqUserLogin(loginParams);
      console.log("用户登录", res);
      if (res.code == 200) {
        this.userInfo = res.data;
        // 本地存储持久化存储用户信息
        localStorage.setItem("USERINFO", JSON.stringify(this.userInfo));
        return "ok";
      } else {
        return Promise.reject(new Error(res.message));
      }
    },
  },
  getters: {},
});
export default useUserStore;

说明userInfo为什么给空对象,因为空对象.属性返回undefined,如果不给空对象那就是null.属性,null无法读取属性直接报错

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Pinia,getter函数类似于Vue的计算属性,可以进行一些计算或处理。如果需要在getter函数传递参数,需要做一些特殊处理。一个例子如下所示: ```html <template> <div> <!-- 在页面使用getter函数时,需要进行传参 --> 你好,我是pinia--{{ userStore.getAddAge(100) }} <button @click="add">1</button> </div> </template> ``` 在上面的代码片段,我们可以看到在页面使用getter函数时,我们可以通过传递参数给getter函数来实现特定的计算或处理。在这个例子,`getAddAge`是一个getter函数,它接受一个参数100,并返回一个计算后的值。所以在页面使用`userStore.getAddAge(100)`可以得到相应的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [2023 年更新,Vue3 + TS 仿知乎专栏企业级项目(升级版14章)](https://download.csdn.net/download/u011063343/87881422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [pinia 核心模块 --- getter](https://blog.csdn.net/qq_63358859/article/details/128920657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值