| import { ref, Ref, isRef, watch as vueWatch } from "vue"; const storage = sessionStorage; const defaultOptions = {     watch: true } /**  * 获取数据类型  * @param defaultValue  * @returns  */ const getValueType = (defaultValue) => {   return defaultValue == null     ? "any"     : typeof defaultValue === "boolean"     ? "boolean"     : typeof defaultValue === "string"     ? "string"     : typeof defaultValue === "object"     ? "object"     : Array.isArray(defaultValue)     ? "object"     : !Number.isNaN(defaultValue)     ? "number"     : "any"; }; /**  * 按照类型格式数据的常量Map  */ const TypeSerializers = {   boolean: {     read: (v) => (v != null ? v === "true" : null),     write: (v) => String(v),   },   object: {     read: (v) => (v ? JSON.parse(v) : null),     write: (v) => JSON.stringify(v),   },   number: {     read: (v) => (v != null ? Number.parseFloat(v) : null),     write: (v) => String(v),   },   any: {     read: (v) => (v != null && v !== "null" ? v : null),     write: (v) => String(v),   },   string: {     read: (v) => (v != null ? v : null),     write: (v) => String(v),   }, }; /**  * 缓存操作  */ const useSessionStorage = (key, initialValue, options) => {   const { watch } = { ...defaultOptions, ...options };   const data = ref(null);   try {     if (initialValue !== undefined) {       data.value = isRef(initialValue) ? initialValue.value : initialValue;     } else {       data.value = JSON.parse(storage.getItem(key) || "{}");     }   } catch (error) {     console.log(error, "useLocalStorage初始化失败");   }   const type = getValueType(data.value);   // 判断类型取格式化方法   let serializer = TypeSerializers[type];   const setStorage = () => storage.setItem(key, serializer.write(data.value));   // 状态监听   if (watch) {     vueWatch(       data,       (newValue) => {         if (newValue === undefined || newValue === null) {           storage.removeItem(key);           return;         }         setStorage();       },       {         deep: true,       }     );   }   setStorage();   return data; }; export default useSessionStorage; |