在Vue 3中,监听sessionStorage的变化可以通过几种方式实现,但值得注意的是,原生sessionStorage事件并不直接支持变化监听。这意味着你不能直接像监听window.localStorage那样使用storage事件来监听sessionStorage的变化。不过,你可以通过轮询(polling)或者使用Proxy对象来间接实现监听。
方法1:使用轮询(Polling)
轮询是一种简单的方法,通过定期检查sessionStorage的内容是否发生变化来实现。
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const checkSessionStorage = () => {
const initialData = sessionStorage.getItem('yourKey');
const interval = setInterval(() => {
const currentData = sessionStorage.getItem('yourKey');
if (currentData !== initialData) {
// 执行你的逻辑
console.log('sessionStorage changed!');
initialData = currentData; // 更新初始值
}
}, 1000); // 检查频率,例如每秒检查一次
onUnmounted(() => {
clearInterval(interval);
});
}
onMounted(() => {
checkSessionStorage();
});
</script>方法2:使用Proxy对象
另一种更现代的方法是使用Proxy对象来创建一个代理,该代理可以捕获对sessionStorage的任何更改。然而,这种方法有其局限性,因为Proxy不能直接代理全局的sessionStorage对象,但你可以创建一个包装器来模拟这一行为。
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const proxySessionStorage = new Proxy({}, {
get(target, prop) {
return sessionStorage.getItem(prop);
},
set(target, prop, value) {
const oldValue = sessionStorage.getItem(prop);
if (value !== oldValue) {
sessionStorage.setItem(prop, value);
// 执行你的逻辑
console.log('sessionStorage changed!');
}
return true; // 表示成功设置值
}
});
onMounted(() => {
// 现在你可以通过proxySessionStorage来访问和监听sessionStorage的变化
proxySessionStorage.yourKey = 'newValue'; // 示例设置值并触发监听
});
</script>方法3:使用 window.addEventListener 监听 storage 事件
<template>
<!-- existing template code -->
</template>
<script setup>
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { session } from '@/utils/storage'
const basketStore = ref(session.get('basket') || [])
const isCart = computed(() => basketStore.value.length > 0)
const rowConfig = {
useKey: true,
isCurrent: true,
isHover: true,
}
const columnConfig = {
resizable: true,
}
const treeConfig = {
transform: true,
rowField: 'id',
parentField: 'parentId',
showLine: true,
expandAll: true,
}
const tableData = [
// existing table data
]
const addToCart = row => {
const updatedBasket = [...basketStore.value, row]
session.set('basket', updatedBasket)
basketStore.value = updatedBasket
}
const handleStorageChange = event => {
if (event.key === 'basket') {
basketStore.value = JSON.parse(event.newValue) || []
}
}
onMounted(() => {
window.addEventListener('storage', handleStorageChange)
})
onUnmounted(() => {
window.removeEventListener('storage', handleStorageChange)
})
</script>
<style lang="scss" scoped>
/* existing style code */
</style>在这个示例中,我们使用 ref 来存储 basketStore,并在组件挂载时添加 storage 事件监听器,在组件卸载时移除监听器。这样,当 sessionStorage 中的 basket 发生变化时,basketStore 会自动更新。
