序文ローカルストレージはフロントエンド開発でよく使われる技術ですが、公式APIは使いにくく、有効期限の設定など一部の機能では対応するAPIが提供されていません。この記事は、ローカル ストレージの概念に関連する知識を紹介することを目的としているのではなく、TypeScript を使用して便利なローカル ストレージ クラスをカプセル化することを目的としています。 ローカルストレージの使用シナリオ
使用上の問題
解決上記の問題に対する解決策はクラスにカプセル化され、直接呼び出すためのシンプルなインターフェースを通じてユーザーに公開されます。 このクラスは次の機能をカプセル化します。
機能性// ストレージ.ts 列挙型ストレージタイプ{ l = 'ローカルストレージ', s = 'セッションストレージ' } クラスMyStorage { ストレージ: ストレージ コンストラクター(型: StorageType) { this.storage = type === StorageType.l ? window.localStorage : window.sessionStorage } セット( キー: 文字列、 値: 任意 ){ 定数データ = JSON.stringify(値) this.storage.setItem(キー、データ) } get(キー: 文字列) { 定数値 = this.storage.getItem(キー) if (値) { JSON.parse(値)を返す } 削除(キー: 文字列) { this.storage.removeItem(キー) } クリア() { this.storage.clear() } } const LStorage = 新しい MyStorage(StorageType.l) const SStorage = 新しい MyStorage(StorageType.s) エクスポート { LStorage、SStorage } 上記のコードは、ローカルストレージの基本的な機能を単純に実装し、アクセス時に内部でデータ型の変換操作を完了します。使用方法は次のとおりです。 './storage' から { LStorage, SStorage } をインポートします ... LStorage.set('data', { name: 'zhangsan' }) LStorage.get('data') // { 名前: 'zhangsan' } 有効期限を追加有効期限を設定するアイデアは次のとおりです。設定時に、データにexpiresフィールドを追加して、データの保存時間を記録します。取得時に、取得したexpiresを現在の時刻と比較します。現在の時刻がexpiresより大きい場合は、有効期限が切れていることを意味します。この時点で、データレコードをクリアし、nullを返します。expires型は、ブール型と数値型にすることができます。デフォルトはfalse、つまり有効期限は設定されていません。ユーザーがtrueに設定すると、デフォルトの有効期限は1年になります。ユーザーが特定の値に設定すると、有効期限はユーザーが設定した値になります。コードは次のように実装されます。 インターフェースIStoredItem{ 値: 任意 有効期限: 数値 } ... セット( キー: 文字列、 値: 任意、 有効期限: ブール値 | 数値 = false、 ){ const ソース: IStoredItem = { 値: null } (期限切れ)の場合{ // デフォルトの有効期限は1年ですが、実際の状況に応じて調整できます。source.expires = 新しい日付().getTime() + (有効期限 === true ? 1000 * 60 * 60 * 24 * 365 : 有効期限) } ソース.値 = 値 const データ = JSON.stringify(ソース) this.storage.setItem(キー、データ) } get(キー: 文字列) { 定数値 = this.storage.getItem(キー) if (値) { 定数ソース: IStoredItem = JSON.parse(値) const 有効期限 = source.有効期限 const now = 新しい Date().getTime() if (有効期限 && 現在 > 有効期限) { this.delete(キー) nullを返す } ソース値を返す } } データ暗号化を追加する暗号化には crypto-js パッケージが使用されます。2 つのプライベート メソッド encrypt と decrypt がクラスにカプセル化され、データの暗号化と復号化を処理します。もちろん、ユーザーは暗号化フィールドを使用してデータを暗号化するかどうかを設定することもできます。デフォルトは true で、暗号化がデフォルトで有効になっていることを意味します。また、現在の環境は process.env.NODE_ENV を通じて取得できます。開発環境の場合は、開発とデバッグを容易にするために暗号化されません。コードは次のように実装されています。 'crypto-js' から CryptoJS をインポートします。 定数SECRET_KEY = 'nkldsx@#45#VDss9' 定数 IS_DEV = process.env.NODE_ENV === '開発' ... クラスMyStorage { ... プライベート暗号化(データ: 文字列) { CryptoJS.AES.encrypt(data, SECRET_KEY).toString() を返します。 } プライベート復号化(データ: 文字列) { 定数バイト = CryptoJS.AES.decrypt(データ、SECRET_KEY) bytes.toString(CryptoJS.enc.Utf8) を返します } セット( キー: 文字列、 値: 任意、 有効期限: ブール値 | 数値 = false、 暗号化 = true ){ const ソース: IStoredItem = { 値: null } (期限切れ)の場合{ ソース.有効期限 = 新しい日付().getTime() + (有効期限 === true ? 1000 * 60 * 60 * 24 * 365 : 有効期限) } ソース.値 = 値 const データ = JSON.stringify(ソース) this.storage.setItem(キー、IS_DEV? データ: 暗号化? this.encrypt(データ): データ ) } get(キー: 文字列、暗号化 = true) { 定数値 = this.storage.getItem(キー) if (値) { 定数ソース: IStoredItem = JSON.parse(値) const 有効期限 = source.有効期限 const now = 新しい Date().getTime() if (有効期限 && 現在 > 有効期限) { this.delete(キー) nullを返す } IS_DEVを返す ? ソース値 : 暗号化 ? this.decrypt(ソース.値) : ソース.値 } } } 命名規則を追加するプロジェクト名_バージョン番号_キー型の複合キーなど、キーの前にプレフィックスを追加することで、命名を標準化できます。この命名規則は、定数または package.json で名前とバージョンを連結することで自由に設定できます。コードは次のとおりです。 const config = require('../../package.json') const PREFIX = config.name + '_' + config.version + '_' ... クラスMyStorage { // キーを合成 プライベート合成キー(キー: 文字列) { PREFIX + キーを返す } ... セット( キー: 文字列、 値: 任意、 有効期限: ブール値 | 数値 = false、 暗号化 = true ){ ... this.storage.setItem() は、 this.synthesisKey(キー)、 IS_DEV ? データ: 暗号化? this.encrypt(data): データ ) } get(キー: 文字列、暗号化 = true) { 定数値 = this.storage.getItem(this.synthesisKey(key)) ... } } 完全なコード'crypto-js' から CryptoJS をインポートします const config = require('../../package.json') 列挙型ストレージタイプ{ l = 'ローカルストレージ'、 s = 'セッションストレージ' } インターフェースIStoredItem{ 値: 任意 有効期限: 数値 } 定数SECRET_KEY = 'nkldsx@#45#VDss9' const PREFIX = config.name + '_' + config.version + '_' 定数 IS_DEV = process.env.NODE_ENV === '開発' クラスMyStorage { ストレージ: ストレージ コンストラクター(型: StorageType) { this.storage = タイプ === StorageType.l ? window.localStorage : window.sessionStorage } プライベート暗号化(データ: 文字列) { CryptoJS.AES.encrypt(data, SECRET_KEY).toString() を返します。 } プライベート復号化(データ: 文字列) { 定数バイト = CryptoJS.AES.decrypt(データ、SECRET_KEY) bytes.toString(CryptoJS.enc.Utf8) を返します } プライベート合成キー(キー: 文字列) { PREFIX + キーを返す } セット( キー: 文字列、 値: 任意、 有効期限: ブール値 | 数値 = false、 暗号化 = true ){ const ソース: IStoredItem = { 値: null } (期限切れ)の場合{ ソース.有効期限 = 新しい日付().getTime() + (有効期限 === true ? 1000 * 60 * 60 * 24 * 365 : 有効期限) } ソース.値 = 値 const データ = JSON.stringify(ソース) this.storage.setItem() は、 this.synthesisKey(キー)、 IS_DEV ? データ: 暗号化? this.encrypt(data): データ ) } get(キー: 文字列、暗号化 = true) { 定数値 = this.storage.getItem(this.synthesisKey(key)) if (値) { 定数ソース: IStoredItem = JSON.parse(値) const 有効期限 = source.有効期限 const now = 新しい Date().getTime() if (有効期限 && 現在 > 有効期限) { this.delete(キー) nullを返す } IS_DEVを返す ? ソース値 : 暗号化 ? this.decrypt(ソース.値) : ソース.値 } } 削除(キー: 文字列) { this.storage.removeItem(this.synthesisKey(キー)) } クリア() { this.storage.clear() } } const LStorage = 新しい MyStorage(StorageType.l) const SStorage = 新しい MyStorage(StorageType.s) エクスポート { LStorage、SStorage } 要約するTypescript を使用してローカル ストレージをカプセル化する方法については、これで終わりです。Typescript のカプセル化ローカル ストレージに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 |
<<: HTML の表の行と列を結合する問題の解決策の詳細な説明
1. フォルダを削除する例: rm -rf /usr/java /usr/javaディレクトリとその...
背景会社のコードは第三者に提供され、利用されます。ソースコードが完全に漏洩しないようにするには、提供...
今日、CSDN の Q&A セクションで友人が質問をしているのを見ました。彼は 1 次元配列...
<br />ウェブサイトを科学的にデザインする: アイトラッキング研究から学ぶ 23 の...
justify-content:space-betweenレイアウトを使用する場合、要素の最後の行に...
シナリオ 1: サーバーの制限により、外部に開かれているポートは 1 つだけですが、別の外部ネットワ...
目次01 JavaScript(略称:js) js は 3 つの部分に分かれています。 JavaSc...
純粋なCSS3で蝶が羽ばたく様子を再現。まずはその効果をご覧ください どうですか?効果はかなりいいで...
過去の経験から言うと、タスクを完了した後にメモを取るのは良い習慣です。インストール環境はUbuntu...
最近、業務上のボタンの増加により、ページレイアウトにボタンが多すぎて、ページが美しくなく、ユーザーエ...
目次序文1. カプセル化の重要性2. どのようにカプセル化しますか? 1. アイデア2. 準備2. ...
ある達人がかつて、自分の妻のことを知るのと同じくらい、自分が管理するデータベースのことを知るべきだと...
目次1. はじめに2. 初期ビュー(I) Vueの概念を理解する(II) MVVMアーキテクチャ(I...
みなさんこんにちは。私と同じように混乱している方はいらっしゃいませんか。CSS は簡単に始められます...
ステップ: 1. 仮想マシンディレクトリに新しいdocker-compose.ymlファイルを作成し...