简易化解vue3中store存储与使用的响应式问题
今日在写网站的时候遇见一个大坑,在使用vue3渲染数据的时候发现,在先取store后,又有了修改store中的数据时出现的没有预想的响应式更改
那么我有了一下步骤
-
从存储段设置log,探查是否真正存储到了数据(因为网页版的vue插件有一些bug,不能全靠它来观察数据变化)
-
发现存储没有问题,再次探查数据获取端,发现获取端的数据为空,但是存在
反思:确实有创建此数据,经此发现store并无大问题
3.反思一下逻辑,整个逻辑确实出现了先获取数据再修改数据的问题
那么思路清晰了,就是解决获取端的数据相应问题嘛
先说结论:
无非获取的是响应式数据,我们确保store中使用ref或 reactive 来创建数据对象后
在获取端只使用 storeToRefs解构出数据,然后用computed解决计算数据的响应式化问题即可
本次错误的代码
store:
import { defineStore } from "pinia"
import {ref} from "vue"
export const useCartStore=defineStore("cart",()=>{
const cartList=ref([])
const cartListAdd=(data)=>{
const item = cartList.value.find((item)=>data.skuId==item.skuId)
if(item!=null&&item!=""){
item.count+=data.count;
}else{
cartList.value.push(data)
console.log("eye",cartList.value);
}
}
return{
cartList,cartListAdd
}
})
获取端:
<script setup>
// import {getCategoryAPI} from "/src/apis/layout.js"
import {ref, onMounted } from "vue"
import { useCategoryStore } from "@/stores/category";
import { storeToRefs } from "pinia";
import { useCartStore } from "@/stores/cart";
const {dataList}=storeToRefs(useCategoryStore());
const num=ref(0)
const cartStore =(useCartStore());
if(cartStore!=null&&cartStore.cartList.value.length!=null&&cartStore.cartList.value.length!=""){
num.value=storeToRefs(cartStore.cartList.value.length);
}else{
num.value=0
}
onMounted(()=>{
})
现象是num和cartStore中的都没有响应式化
解决办法:
针对cartStore中的cartList,他在store中是有定义的,我们用storeToRefs来解决响应式化的问题
针对num他是计算得来的,我们用computed来进行响应式计算
<script setup>
// import {getCategoryAPI} from "/src/apis/layout.js"
import {ref, onMounted,computed } from "vue"
import { useCategoryStore } from "@/stores/category";
import { storeToRefs } from "pinia";
import { useCartStore } from "@/stores/cart";
const {dataList}=storeToRefs(useCategoryStore())
const {cartList} =storeToRefs(useCartStore());
const num = computed(() => cartList.value.length);
onMounted(()=>{
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了