利用vue3提供的hooks实现响应式的全局状态共享

本文介绍了一个使用Vue.js的useCart.ts Hooks来实现全局响应式购物车的状态共享。通过引入vue的reactive方法,确保购物车数据变化时页面能实时更新。在app.vue中,利用onBeforeMount生命周期钩子初始化购物车数据,并在窗口关闭前保存到本地缓存,实现购物车数据的持久化。
摘要由CSDN通过智能技术生成

1.下面时useCart.ts这个hooks中的代码,其实挺简单的,用原生js也可以实现全局状态共享。但是使用原生的var或let,const声明的购物车变量由于数据不是响应式的,导致购物车数据发生改变页面不会响应式的变化。这里与原生的唯一的区别就是,只不过使用了vue提供的reactive方法将购物车变量转变为响应式的,当购物车发生变化时,页面也会随之响应式的发生改变

具体实现参考下面代码

useCart.ts中的代码

import { reactive } from "vue";

interface goodsType{
    id:number,
    name:string,
    prodAddr:string,
    price:string
}
type carListType=Array<goodsType>

var carList:carListType=reactive([]) //购物车列表,注意一定要是响应式。不然购物车内数据发生改变无法实现页面响应式变化




export default function useCart(){
          

    //添加购物车
    function addCartList(goods:goodsType){
        carList.push({...goods})
    }

    //获取购物车
    function getCartList(){
        return carList
    }
    
    //初始化购物车数据,这个在项目初始化时从缓存中获取之前存取在里面的数据
    function initCartList(){
        var  oldCarList= JSON.parse(window.sessionStorage.getItem('carList')??JSON.stringify([]))
        
        if(oldCarList&&oldCarList.length>0){
            
            carList.push(...(oldCarList as Array<goodsType>))
        }
    }
    
    //保存购物车数据,在项目销毁,也就是监听项目窗口关闭之前将购物车中的数据存储在缓存中。
    function saveCartList(){

        window.sessionStorage.setItem('carList',JSON.stringify(carList))
    }

    return {
        addCartList,
        getCartList,
        initCartList,
        saveCartList
   }
    
}

app.vue中的代码

由于项目初始化时,会首先加载app.vue,所以我们在app.vue页面的onBeforeMount声明周期,作为整个项目初始化的声明周期(当然你也可以在main.ts中初始化购物车,因为项目一旦加载肯定会加载main.ts),然后在此时可以初始化购物车,也就是从缓存中拿到之前存储在其中的购物车数据。

<template>
  <div id="nav">
   apppage
  </div>
  <router-view/>
</template>


<script lang="ts" setup>
import { onBeforeMount, onBeforeUnmount, onMounted, onUnmounted } from "@vue/runtime-core";
import useCart from './hooks/useCart'
var cart =useCart()

//当app页面进入onBeforeMount生命周期时,从本地缓存中拿到之前存储在里面的商品
onBeforeMount(()=>{
cart.initCartList()
})


//监听窗口关闭,也就是项目关闭时,将购物车中的数据保存在本地缓存中
window.addEventListener('beforeunload', ()=>{
      cart.saveCartList()
   })

</script>


<style >
  

</style>

//以上就是实现了购物车响应式的全局状态共享功能,需要在其他页面使用则直接引入useCart方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值