背景localStorage と sessionStorage という 2 つの API は、日常のフロントエンド開発で強力なストレージ ツールとして役立ちます。私たちは、これらをデータの保存によく使用します。日常的に操作する場合、通常は localStorage と sessionStorage を直接使用します。 ローカルストレージにアイテムを設定します。 セッションストレージ.setItem(xxx, xxx); ローカルストレージのアイテムを取得します。 セッションストレージ.getItem(xxx); あるいは、次のように単純にまとめる学生もいます。 const getItem = (キー) => { const serializedValue = window.localStorage.getItem(key) は any として扱われます。 JSON.parse(serializedValue) を返します。 }; const setItem = (キー、値) => { if (window && window.localStorage) { window.localStorage.setItem(キー、JSON.stringify(値)); } }; これは使用上の大きな問題ではありませんが、コードが十分にエレガントではないと常に感じています。たまたま最近、2 人の兄弟のカプセル化を含む、いくつかの基礎となる基本ライブラリをカプセル化しました。面白いものを見つけました。編集者も皆さんと共有したい新しい経験やアイデアを持っています。 関数
目的localStorage および sessionStorage API をカプセル化して、ストレージの追加、削除、変更、およびチェックを実装します。 アイデアの源Vue2.0 を使用したことがあるなら、Object.defineProperty メソッドを知っているはずです。この API は Vue の応答性の核であり、データの変更を監視するために使用されますが、いくつかの欠点があります。
これらの問題は Vue 3.0 で解決されており、その解決策は ES6 の Proxy メソッドです。 プロキシは、特定の操作のデフォルトの動作を変更するために使用されます。これは、言語レベルで変更を加えることと同等であるため、一種の「メタプログラミング」、つまりプログラミング言語のプログラミングになります。 プロキシは、ターゲット オブジェクトの前に「インターセプション」レイヤーを設定するものと理解できます。オブジェクトへの外部アクセスは、まずこのインターセプション レイヤーを通過する必要があります。したがって、プロキシは外部アクセスをフィルターして書き換えるメカニズムを提供します。プロキシという単語の本来の意味はエージェントです。ここでは、特定の操作の「エージェントとして機能する」という意味で使用されており、「エージェント」と翻訳できます。 Proxy は自然なインターセプターおよびプロキシなので、Proxy を使用して localStorage および sessionStorage の操作をプロキシすることもできます。では、これ以上長々とせずに、すぐにコードを見てみましょう。 成し遂げるvar プロキシストレージ = { /** * @returns ストレージプロキシ * @例 * proxyStorage.getStorageProxy(localStorage, '_') */ getStorageProxy: (ストレージ、プレフィックス) => { if (!ストレージ) false を返します。 const getKey = (prop) => `${prefix}.${String(prop)}`; 新しいプロキシ(新しいオブジェクト(), { /** * ストレージを設定する * @ブール値を返す * @例 * const storageProxy = proxyStorage.getStorageProxy(localStorage, '_'); * ストレージプロキシ.a = 1; */ set(ターゲット、プロパティ、値) { ターゲット[prop] = 値; storage.setItem(getKey(prop), JSON.stringify(value)); true を返します。 }, /** * ストレージを取得する * @ブール値を返す * @例 * const storageProxy = proxyStorage.getStorageProxy(localStorage, '_'); * コンソールログ(storageProxy.a); */ _ を取得します。 JSON.parse(storage.getItem(getKey(prop)) || '') を返します。 }, /** * ストレージを削除する * @ブール値を返す * @例 * const storageProxy = proxyStorage.getStorageProxy(localStorage, '_'); * storageProxy.a を削除します。 */ プロパティを削除します(_, prop) { ストレージからアイテムを削除します(getKey(prop)); true を返します。 }, /** * クリアストレージ * @ブール値を返す * @例 * const storageProxy = proxyStorage.getStorageProxy(localStorage, '_'); * オブジェクト.preventExtensions(ストレージプロキシ); */ 拡張機能を防止(ターゲット) { オブジェクト.preventExtensions(ターゲット); ストレージをクリアします。 true を返します。 }, /** * クエリストレージ * @ブール値を返す * @例 * const storageProxy = proxyStorage.getStorageProxy(localStorage, '_'); * storageProxy 内の 'a'; */ has(ターゲット、プロパティ) { 試す { !!storage.key(prop) を返します。 } キャッチ(エラー){ false を返します。 } } }); }, }; var proxyStorageTest = proxyStorage.getStorageProxy(localStorage, '_'); Proxy を使用して、localStorage および sessionStorage のプロキシ オブジェクトを返します。このプロキシ オブジェクトは、set、get、delete、preventExtensions、in などの操作をハイジャックします。 セットstorage.foo = v や storage['foo'] = v などのオブジェクト プロパティの設定をインターセプトし、ブール値を返します。プロキシ オブジェクトのプロパティに値を割り当て、割り当てをインターセプトし、対応するストレージの setItem を操作すると、対応するストレージに値を直接格納できます。 ストレージ.a = 1; // または ストレージ['a'] = 1; 得るstorage.foo や storage['foo'] などのオブジェクト プロパティの読み取りをインターセプトします。プロキシオブジェクトの属性値を読み取り、取得操作をインターセプトし、対応するキーを取得し、対応するストレージの getItem を操作して、対応するストレージから対応する値を取得します。 コンソールログ(ストレージ.a); // 1 プロパティの削除削除ストレージ[propKey]操作をインターセプトし、ブール値を返します。ここでインターセプトされるのはオブジェクトのデータを削除する操作であり、データを削除するためにストレージに対して内部的にremoveItemの操作が実行されます。 proxyStorageTest.a を削除します。 拡張機能を禁止するObject.preventExtensions(storage) をインターセプトし、ブール値を返します。オブジェクトの拡張不可能な操作をインターセプトし、対応するストレージに対して内部的にクリア操作を実行して、格納されているすべての値をクリアします。 オブジェクト.preventExtensions(プロキシストレージテスト); もっているプロキシ内の propKey の操作とオブジェクトの hasOwnProperty メソッドをインターセプトし、ブール値を返します。オブジェクトの属性を照会する操作をインターセプトし、対応するストレージにキーが存在するかどうかを照会します。 proxyStorageTest の 'a'; 要約するProxy を使用して localStorage および sessionStorage の操作をプロキシし、シンプルなストレージ API をカプセル化します。プロキシを使用して、localStorage、sessionStorage、document.cookie、indexedDB を操作できます。もちろん、Proxy の機能はこれに限定されません。Vue 3.0 での Proxy の使用など、他にも多くの用途があります。この記事の焦点は、単純な API をカプセル化することではなく、このアイデアを誰もが学べるようにガイドすることです。 Vue のアイデアを使用してストレージをカプセル化する方法については、これで終わりです。ストレージをカプセル化するための Vue のアイデアの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 |
<<: Alibaba Cloud サーバーの購入とインストール方法
>>: 制限およびオフセット ページング シナリオを使用すると速度が遅くなるのはなぜですか?
目次フィルター01.とは02. やり方(1)フィルターを定義する(2)使用方法(3)フィルタパラメー...
ページコンテンツ全体を中央に配置する方法と、コンテンツに合わせて高さを自動的に拡大縮小する方法。これ...
この記事では、マウスの動きを追跡するためのJavaScriptの具体的なコードを参考までに紹介します...
信頼性が高く、人気があり、簡単に構成できる Web サーバーである Apache で独自の Web ...
Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...
参考までに、HTMLフォームの使い方を9つの簡単な例で分析します。具体的な内容は次のとおりです。 1...
MySQL でレコードを更新すると、構文は正しいのですが、レコードが更新されません...質問文実行前...
目次Nginx は 2 つの socket.io サーバーをプロキシします。 socket.ioの動...
01. コマンドの概要貼り付けコマンドは各ファイルを列ごとに結合します。これは、2 つの異なるファイ...
<br />原文: http://blog.rexsong.com/?p=1166ウェブ...
NTP は、ネットワーク上で時間を同期するための TCP/IP プロトコルです。通常、クライアントは...
この記事では、参考までに、Vue の具体的なコードで簡単な計算機を実装する方法を紹介します。具体的な...
この記事では、Taobao商品詳細のカルーセルを実現するためのvideojs+swiperの具体的な...
1. 固定幅+適応型期待される効果: 左側は固定幅、右側は適応幅 共通コード: html: <...
1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...