呀呼!呀呼! 2023-04-02 21:22 采纳率: 77.3%
浏览 30
已结题

关于小程序数据缓存数据读取不一致的问题

关于小程序数据缓存的问题:
使用cart:uni.getStorageSync('cart')去读取缓存。使用uni.setStorageSync('cart', JSON.stringify(state.cart))去存储数据,
发现读出来的数据和存储的数据不一样?
起因是我通过点击多选框,去改变cart数组里面某一项(数组里的每一项都是一个对象)里的goods_state的值,
改变了之后就存储起来。
代码(这里把无关紧要的代码删了没有贴出来):
vue文件:

import {
        mapState,
        mapActions,
        mapGetters
    } from 'vuex'
    export default {
        data() {
            return {

            };
        },
        methods: {
            ...mapActions('m_cart', ['addToCart', 'removeToCart',"saveToStorage"]),
            radioChangeHandler(item){
                item.goods_state=!item.goods_state;
                this.saveToStorage(item);
            },
        },
        computed: {
            // 将 m_cart 模块中的 cart 数组映射到当前页面中使用
            ...mapState('m_cart', ['cart']),
            ...mapGetters('m_cart', ['totalPrice',"checkedCount","total"]),
        }
    }

store里的.js文件:

export default {
    namespaced: true,
    state: () => ({
        // 每个对象,都包含如下 6 个属性:
        // { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
        cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
        defaultPic: "https://img3.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png"
    }),
    actions: {
        saveToStorage(context, value) {
            console.log(value,"saveToStorage");
            context.commit("SAVETOSTORAGE", value);
        }
    },
    mutations: {
        SAVETOSTORAGE(state) {
            console.log(state.cart,"SAVETOSTORAGE");
            uni.setStorageSync('cart', JSON.stringify(state.cart))
            console.log(state.cart,"SAVETOSTORAGE2");
        }
    },

}

初始状态:

img


goods_state的值为true,多选框被勾选。

当我点击多选框,去改变goods_state的值的时候,

img


我们可以看到cart数组里的第一项的goods_state也成功被改变了变成了false,同时多选框也没有选上。
控制台查看本地存储storeage的结果:

img


也没有问题,goods_state也是false。
然后我重新编译,因为cart数组是通过uni.getStorageSync('cart')去读取缓存的,所以我想理应的结果是保存上图的状态,多选框没有被选上,而且goods_state的值为false。
但是结果是:

img


多选框被选上了,查看appData里cart里goods_state也是true,但是好神奇的就是我再次查看缓存storage,
发现里面的cart数组里的goods_state是false,这是为什么?我cart数据就是从缓存里读出来的吗?为什么两边的数据不一样

img


我怎么才能达到我想要的效果?

感觉问题有点神奇,使用我在下面贴出完整代码,如看上述代码已有结论请忽略下述代码。


vue文件:

<template>
    <view>
        
        <view class="" v-if="cart.length !== 0">
        <myAddress/>
    
        <view class="shopIcons">
            <uni-icons type="shop-filled" size="30" class="iconsImage"></uni-icons>
            <text class="iconsText">购物车</text>
        </view>
        <view class="shopGoods">
            <view class="shopGoodItem" v-for="(item,index) in cart" :key="index">
                <view class="goods-item-left">
                    <radio-group >
                        <radio :checked="item.goods_state" color="#C00000" @click="radioChangeHandler(item)"></radio>
                    </radio-group>
                    <image class="goods-pic" :src="item.goods_small_logo || defaultPic"></image>
                </view>
                <view class="goods-item-right">
                    <view class="goods-info-box">
                        <view class="goods-name">
                            {{item.goods_name}}
                        </view>
                        
                        <view class="goods-price">{{item.goods_price}}</view>
                        
                        <uni-number-box :min="1" class="numBox" @change="(value) => changeToCart(value,item,index)"
                            :value="item.goods_count"></uni-number-box>
                    </view>
                </view>
            </view>
        </view>
        <view class="bottomArea">
            <view class="allRadio">
                <radio :checked="allRadioSelect" color="#C00000" @click="allRadioChangeHandler">全选</radio>
            </view>
            <view class="totalPrice">
                <text>合计:</text>
                <text>{{totalPrice}}</text>
            </view>
            <button type="warn" class="orderButton">结算</button>
        </view>
        </view>
        
        <view class="empty-cart" v-else>
                <image src="/static/cart_empty@2x.png" class="empty-img"></image>
                <text class="tip-text">空空如也~</text>
              </view>
    </view>
    
</template>

<script>
    import {
        mapState,
        mapActions,
        mapGetters
    } from 'vuex'
    import badgeMix from '../../mixins/tabbar-badge.js'
    export default {
        mixins: [badgeMix],
        data() {
            return {

            };
        },
        methods: {
            ...mapActions('m_cart', ['addToCart', 'removeToCart',"saveToStorage"]),
            changeToCart(value, item, index) {
                console.log(value, item, index);
                console.log(value, this.$store.state.m_cart.cart[index].goods_count, item, index);
                if (value > this.$store.state.m_cart.cart[index].goods_count) {
                    this.addToCart(item)
                } else {
                    this.removeToCart(item);
                }
            },
            radioChangeHandler(item){
                item.goods_state=!item.goods_state;
                this.saveToStorage(item);
            },
            allRadioChangeHandler(){
                this.cart.forEach((e,index,array)=>{
                    e.goods_state=!e.goods_state;
                })
            },
            goToMyAddress(){
                uni.navigateTo({
                    url:"/subpkg/myAddress/myAddress"
                })
            }
        },
        onShow() {
            console.log(this.checkedCount,"!!!");
            this.setBadge();
        },
        computed: {
            // 将 m_cart 模块中的 cart 数组映射到当前页面中使用
            ...mapState('m_cart', ['cart']),
            ...mapGetters('m_cart', ['totalPrice',"checkedCount","total"]),
            allRadioSelect(){
                let flag=true
                this.cart.forEach((element, index, array)=>{
                    if(!element.goods_state){
                        flag=false;
                    }
                }
                )
                
                return flag;
                // return this.total === this.checkedCount
            },
        },
    }
</script>

export default {
    namespaced: true,
    state: () => ({
        cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
        defaultPic: "https://img3.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png"
    }),
    actions: {
        addToCart(context, value) {
            context.commit("ADDTOCART", value);
        },
        removeToCart(context,val){
            context.commit("REMOVETOCART",val);
        },
        saveToStorage(context, value) {
            console.log(value,"saveToStorage");
            context.commit("SAVETOSTORAGE", value);
        }
    },

    mutations: {
        ADDTOCART(state, value) {

            const findResult = state.cart.find((x) => x.goods_id === value.goods_id);
            console.log(findResult);
            if (findResult) {
                findResult.goods_count++;
            } else {
                state.cart.push(value)
            }
            uni.$showMsg("成功加入购物车!")

            this.commit('m_cart/SAVETOSTORAGE')

        },
        REMOVETOCART(state,val){
            const findResult=state.cart.find((x)=>x.goods_id===val.goods_id)
            console.log(findResult,val,"@@");
            if(findResult.goods_count>=1){
                findResult.goods_count--;
            }else{
                state.cart=state.cart.filter(item => item != findResult);
            }
            this.commit('m_cart/SAVETOSTORAGE')
            
        },
        SAVETOSTORAGE(state) {
            console.log(state.cart,"SAVETOSTORAGE");
            uni.setStorageSync('cart', JSON.stringify(state.cart))
            console.log(state.cart,"SAVETOSTORAGE2");
        }
    },

    getters: {
        total(state) {
            let c = 0
            state.cart.forEach(goods => c += goods.goods_count)
            return c
        },
        totalPrice(state){
            const totalPrice=state.cart.reduce((prev,cur,index,arr)=>{
                return cur.goods_count*cur.goods_price + prev;
            },0)
            console.log(totalPrice);
            return totalPrice;
        },
        checkedCount(state){
            let c=0;
            state.cart.forEach(goods =>{
                if(goods.goods_state=true){
                    c++;
                }
            })
            return c;
        }
    },

}
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-03 04:43
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月3日
  • 创建了问题 4月2日

悬赏问题

  • ¥30 数字信号处理实验报告
  • ¥15 ensp路由器启动不了一直报#
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要
  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥20 nao机器人语音识别问题
  • ¥15 怎么生成确定数目的泊松点过程