日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何優雅地觀察 Vue.js 3 中 localStorage 的變化?

來源: 責編: 時間:2023-12-12 17:03:00 314觀看
導讀為什么要這樣做?原生 localStorage 只能監聽同源跨不同頁面的變化。然而,對于單頁面應用程序來說,這種方式并不實用。因此,我打算創建一個自定義鉤子來監視 localStorage 中的變化。方法我們需要重寫 localStorage 下的所

為什么要這樣做?

原生 localStorage 只能監聽同源跨不同頁面的變化。然而,對于單頁面應用程序來說,這種方式并不實用。因此,我打算創建一個自定義鉤子來監視 localStorage 中的變化。SP228資訊網——每日最新資訊28at.com

方法

我們需要重寫 localStorage 下的所有方法,以便無論何時使用它們都可以被觀察到。這就需要一個事件機制來進行消息傳遞。SP228資訊網——每日最新資訊28at.com

由于 Vue 3 刪除了和emit 事件接口,我們可以使用 mitt 或 tiny-emitter 等第三方庫來實現此功能。SP228資訊網——每日最新資訊28at.com

不過,我打算使用自己實現的中介模式作為通信方法。SP228資訊網——每日最新資訊28at.com

解決方案

使用中介者模式的實現解決方案。SP228資訊網——每日最新資訊28at.com

// mediator.tsexport interface MediatorProps {  uuid?: number;  publish?: (topic: string, ...args: unknown[]) => void;  subscribe?: (topic: string, callback: (...args: unknown[]) => void) => void;}const mediator = (function () {  let topics = [],    uuid = 0;  function subscribe(topic: string, callback: (...args: unknown[]) => void) {    uuid++;    topics[topic] = topics[topic]      ? [...topics[topic], { callback, uuid }]      : [{ callback, uuid }];  }  function publish(topic: string, ...args: unknown[]) {    if (topics[topic]) {      topics[topic].map((item) => item.callback(...args));    }  }  return {    install: function (obj: MediatorProps) {      obj.uuid = uuid;      obj.publish = publish;      obj.subscribe = subscribe;      return obj;    },  };})();export default mediator;

然后我重寫 localStorage 函數。SP228資訊網——每日最新資訊28at.com

// localStorage.tsimport mediator from "./mediator";const keys: string[] = [];const createMediator = () => mediator.install({});const sub = createMediator();export const $localStorage = {  getItem: (key: string) => {    return window.localStorage.getItem(key);  },  setItem: (key: string, value: any) => {    // 防止重復發布    if (!keys.includes(key)) keys.push(key);    // 發布事件(如果已修改)    sub.publish(key, value);        window.localStorage.setItem(key, value);  },  clear: () => {    // 為每個鍵清除時發布一個事件    keys.map((key) => sub.publish(key, undefined));    // 發布后,清除記錄鍵值的數組    keys.length = 0;    window.localStorage.clear();  },  removeItem: (key: string) => {    keys.splice(keys.indexOf(key), 1);    // 刪除時,發布undefined    sub.publish(key, undefined);    window.localStorage.removeItem(key);  },  key: window.localStorage.key,  length: window.localStorage.length,};

第三,我實現了 useStorage 鉤子SP228資訊網——每日最新資訊28at.com

// useStorage.tsimport { ref } from "vue";import mediator from "./mediator";const createMediator = () => mediator.install({}); export const useStorage = (key: string) => {    const string = ref(null);  const sub = createMediator();  sub.subscribe(key, (value) => string.value = value);  return string;};

第四,我寫的測試代碼是這樣的:SP228資訊網——每日最新資訊28at.com

// One.vue// use localStorageimport { watch } from "vue";import { useStorage } from "./hook";const key = useStorage("imodd");watch([key], (a) => console.log(a));// Two.vue// Observe localStorage

然后,結果是這樣的SP228資訊網——每日最新資訊28at.com

圖片圖片SP228資訊網——每日最新資訊28at.com

好了,這就是全部了。希望這篇文章能給你帶來一點幫助。SP228資訊網——每日最新資訊28at.com

https://javascript.plainenglish.io/how-to-elegantly-observe-localstorage-changes-in-vue-3-a42fcf9c82caSP228資訊網——每日最新資訊28at.com

SP228資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-43332-0.html如何優雅地觀察 Vue.js 3 中 localStorage 的變化?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 測試左移與提測流水線的應用實踐

下一篇: Python編程進階,輕松掌握多線程和多進程

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 诏安县| 普洱| 大同县| 平塘县| 苗栗县| 高雄市| 马山县| 卢湾区| 突泉县| 都兰县| 丽水市| 枣强县| 绥阳县| 易门县| 安多县| 丰县| 扬州市| 兴宁市| 小金县| 连山| 通河县| 齐齐哈尔市| 三河市| 平和县| 阿城市| 吉水县| 深圳市| 东源县| 湘潭市| 红河县| 龙门县| 吉林省| 喀喇| 遂溪县| 乾安县| 大竹县| 安丘市| 平利县| 沂水县| 溧水县| 东源县|