目次
Vueの応答性
LocalStorage関数を書き直します
Vueで依存関係を収集する方法
LocalStorageと呼んだトラック
思考実験の終わり
ホームページ ウェブフロントエンド CSSチュートリアル VueでLocalStorageをリアクティブにする方法

VueでLocalStorageをリアクティブにする方法

Apr 04, 2025 am 10:16 AM

Vue.JSのレスポンシブシステムは、その中心的な強みの1つですが、その根底にあるメカニズムを理解していない人には神秘的に感じるかもしれません。たとえば、なぜオブジェクトや配列で動作しますが、LocalStorageのような他のものでは機能しませんか?この記事では、この質問に答えて、VueのレスポンシブシステムをLocalStorageで動作させる方法を示します。

VueでLocalStorageをリアクティブにする方法

次のコードを実行すると、カウンターが静的値として表示され、LocalStorageの間隔の変化のために予想どおりに変更されないことがわかります。

新しいVue({
  EL:「#counter」、
  データ:()=>({
    カウンター:localStorage.getItem( "counter")
  })、
  計算:{
    平() {
      this.counter%2 == 0を返します。
    }
  }、
  テンプレート: `<div>
    <div>カウンター:{{counter}}</div>
    <div>カウンターは{{偶数? 「偶数」:「奇妙な '}}</div>
  </div>`
});
ログイン後にコピー
 // some-other-file.js
setInterval(()=> {
  const counter = localstorage.getitem( "counter");
  localStorage.setItem( "counter"、counter 1);
}、1000);
ログイン後にコピー

Vueインスタンス内のcounterプロパティは応答性がありますが、LocalStorageでソースを変更したからといって変更されません。

この問題を解決するには多くの方法があり、最良の方法はおそらくVuexを使用して、LocalStorageと同期して保存された値を維持することです。しかし、この例のように単純なソリューションが必要な場合はどうでしょうか? Vueのレスポンシブシステムがどのように機能するかを深く理解する必要があります。

Vueの応答性

Vueがコンポーネントインスタンスを初期化すると、 dataオプションが観察されます。これは、 data内のすべてのプロパティを反復し、 Object.definePropertyを使用してGetter/Setterに変換することを意味します。各プロパティにカスタムセッターを設定することにより、Vueはプロパティがいつ変更されるかを知ることができ、変更に対応する必要がある依存関係に通知することができます。どの依存関係が特定のプロパティに依存するかをどのようにして知っていますか?ゲッターを活用することにより、計算されたプロパティ、オブザーバー関数、またはレンダリング関数アクセスデータプロパティをレンダリングすると登録できます。

 // core/instance/state.js
関数initdata(){
  // ...
  観察(データ)
}
ログイン後にコピー
 // core/observer/index.js
エクスポート関数監視(値){
  // ...
  新しいオブザーバー(価値)
  // ...
}

クラスオブザーバーをエクスポートする{
  // ...
  Constructor(value){
    // ...
    this.walk(value)
  }

  walk(obj){
    const keys = object.keys(obj)
    for(i = 0; i <keys.length i defineteactive><p>それでは、なぜLocalStorageは反応がないのですか?<strong>属性を持つオブジェクトではないからです。</strong></p>
<p>しかし、待ってください。アレイを備えたゲッターとセッターを定義することはできませんが、Vueでは、アレイは依然として応答します。これは、アレイがVueの特別なケースであるためです。レスポンシブな配列を持つために、Vueは舞台裏の配列メソッドを書き直し、Vueのレスポンシブシステムと統合しました。</p>
<p> LocalStorageに似たことをすることはできますか?</p>
<h3 id="LocalStorage関数を書き直します"> LocalStorage関数を書き直します</h3>
<p>まず、LocalStorageメソッドをオーバーライドして、どのコンポーネントインスタンスがLocalStorageプロジェクトを要求したかを追跡することにより、最初の例を修正できます。</p>
<p> // LocalStorage Project Keyとそれに依存するVueインスタンスのリストの間のマップconst storeitemsubscribers = {};</p>
<p> const getItem = window.localStorage.getItem; localStorage.getItem =(key、target)=> {console.info( "gething"、key);</p>
<p> //依存するVUEインスタンスを収集する場合(!storeItemsubscribers [key])storeItemsubscribers [key] = []; if(target)storeItemsubscribers [key] .push(target);</p>
<p> //元の関数を呼び出してくださいgetItem.call(localStorage、key); };</p>
<p> const setItem = window.localStorage.setItem; localStorage.setItem =(key、value)=> {console.info( "siting"、key、value);</p>
<p> // if(storeitemsubscribers [key]){storeitemsubscribers [key] .foreach((dep)=> {if(dep.hasownProperty(key))dep [key] = value;}); }</p>
<p> //元の関数setItem.call(localStorage、key、value)を呼び出します。 };</p>
<p> // ...(コードの残りの部分は元のテキストと同じです)</p>
<p>この例では、 <code>getItem</code>と<code>setItem</code>を再定義して、LocalStorageプロジェクトに依存するコンポーネントを収集および通知しました。新しい<code>getItem</code>では、どのコンポーネントがどのアイテムを要求するかを記録し、 <code>setItem</code>では、アイテムを要求してデータプロパティを書き換えるすべてのコンポーネントに連絡します。</p>
<p>上記のコードが機能するためには、コンポーネントインスタンスへの参照を<code>getItem</code>に渡す必要があります。矢印機能はもう使用できません。そうしないと、 <code>this</code>の正しい値はありません。</p>
<p>私たちがもっとうまくやりたいなら、私たちはより深く掘り下げる必要があります。たとえば、依存関係を明示的に渡さずにどのように依存関係を追跡するのですか?</p>
<h3 id="Vueで依存関係を収集する方法"> Vueで依存関係を収集する方法</h3>
<p>インスピレーションのために、Vueのレスポンシブシステムに戻ることができます。その前に、データプロパティにアクセスすると、データプロパティのgetterは、そのプロパティをさらに変更するために発信者を購読しています。しかし、誰が電話をかけたのかをどのようにして知っていますか?データ属性を取得すると、そのゲッター機能には、発信者が誰であるかについての入力がありません。ゲッター機能には入力がありません。誰が依存関係として登録するかをどのようにして知っていますか?</p>
<p>各データ属性は、 <code>Dep</code>クラスで反応する必要がある依存関係のリストを維持します。このクラスをより深く掘り下げると、依存関係が登録されるたびに、依存関係自体が既に静的ターゲット変数で定義されていることがわかります。この目標は、これまでに神秘的な<code>Watcher</code>クラスによって設定されています。実際、データプロパティが変更されると、これらのオブザーバーは、コンポーネントの再レンダリングまたは計算プロパティの再計算を開始することを実際に通知されます。</p>
<p>しかし、繰り返しますが、彼らは誰ですか?</p>
<p> Vueがデータオプションを観察可能にすると、各コンポーネントインスタンスのすべての観測関数(Watcherクラスと混同しないでください)とすべての観測関数( <code>Watcher</code>クラスと混同しないでください)と同様に、各コンポーネントインスタンスのレンダリング関数も作成します。オブザーバーは、これらの機能の仲間のようなものです。彼らは2つの主なことをします:</p>
<ol>
<li>
<strong>作成時に機能を評価します。</strong>これにより、依存関係のコレクションがトリガーされます。</li>
<li>
<strong>彼らが依存している値が変化したことを通知されると、彼らは彼らの機能を再実行します。</strong>これにより、最終的に計算されたプロパティが再計算されるか、コンポーネント全体が再レンダリングされます。</li>
</ol>
<p>オブザーバーが責任のある関数を呼び出す前に重要なステップが発生します。<strong>彼らは<code>Dep</code>クラスの静的変数のターゲットとして自分自身を設定します。</strong>これにより、応答性のあるデータ属性にアクセスされると、依存関係として登録されます。</p>
<h3 id="LocalStorageと呼んだトラック"> LocalStorageと呼んだトラック</h3>
<p>Vueの内部メカニズムにアクセスできないため、これは完全にはできません。ただし、VUEのアイデアを使用して、責任のある関数を呼び出す前に、観察者が静的プロパティにターゲットを設定できるようにすることができます。 LocalStorageを呼び出す前に、コンポーネントインスタンスへの参照を設定できますか?</p>
<p>データオプションを設定するときにLocalStorageが呼び出されると仮定した場合、フック<code>beforeCreate</code>して<code>created</code>ことができます。これらの2つのフックは、データオプションの初期化の前後に発射されるため、現在のコンポーネントインスタンスを参照してターゲット変数を設定してからクリアできます(ライフサイクルフックでアクセスできます)。次に、カスタムゲッターでは、この目標を依存関係として登録できます。</p>
<p>最後にしなければならないことは、これらのライフサイクルフックをすべてのコンポーネントの一部にすることです。これをプロジェクト全体でグローバルミックスインを使用して行うことができます。</p>
<p> // ...(コードの残りの部分は元のテキストと同じです)</p>
<p>ここで、最初の例を実行すると、1秒あたりの数を増やすカウンターが表示されます。</p>
<p> // ...(コードの残りの部分は元のテキストと同じです)</p>
<h3 id="思考実験の終わり">思考実験の終わり</h3>
<p>最初の問題を解決しましたが、これは主に思考実験であることを忘れないでください。削除されたプロジェクトやアンインストールされたコンポーネントインスタンスの処理など、いくつかの機能がありません。また、コンポーネントインスタンスのプロパティ名は、LocalStorageに保存されているプロジェクト名と同じである必要があるなど、いくつかの制限があります。とはいえ、主な目標は、Vue Responsiveシステムが舞台裏でどのように機能し、それを最大限に活用するかをよりよく理解することです。</p></keys.length>
ログイン後にコピー

以上がVueでLocalStorageをリアクティブにする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Googleフォント変数フォント Googleフォント変数フォント Apr 09, 2025 am 10:42 AM

Google Fontsが新しいデザイン(ツイート)を展開したようです。最後の大きな再設計と比較して、これははるかに反復的です。違いをほとんど伝えることができません

HTML、CSS、JavaScriptを使用してアニメーションカウントダウンタイマーを作成する方法 HTML、CSS、JavaScriptを使用してアニメーションカウントダウンタイマーを作成する方法 Apr 11, 2025 am 11:29 AM

プロジェクトにカウントダウンタイマーが必要だったことはありますか?そのようなことのために、プラグインに手を伸ばすのは自然なことかもしれませんが、実際にはもっとたくさんあります

HTMLデータ属性ガイド HTMLデータ属性ガイド Apr 11, 2025 am 11:50 AM

HTML、CSS、およびJavaScriptのデータ属性について知りたいと思っていたことはすべて。

CSSを介してファーストクラスの名前アイテムを使用して子要素を選択する方法は? CSSを介してファーストクラスの名前アイテムを使用して子要素を選択する方法は? Apr 05, 2025 pm 11:24 PM

要素の数が固定されていない場合、CSSを介して指定されたクラス名の最初の子要素を選択する方法。 HTML構造を処理するとき、あなたはしばしば異なる要素に遭遇します...

フレックスレイアウト内の紫色のスラッシュ領域が誤って「オーバーフロー空間」と見なされるのはなぜですか? フレックスレイアウト内の紫色のスラッシュ領域が誤って「オーバーフロー空間」と見なされるのはなぜですか? Apr 05, 2025 pm 05:51 PM

フレックスレイアウトの紫色のスラッシュ領域に関する質問フレックスレイアウトを使用すると、開発者ツールなどの混乱する現象に遭遇する可能性があります(D ...

SASSをより速くするための概念の証明 SASSをより速くするための概念の証明 Apr 16, 2025 am 10:38 AM

新しいプロジェクトの開始時に、SASSコンピレーションは瞬く間に起こります。これは、特にbrowsersyncとペアになっている場合は素晴らしい気分です。

SVGでタータンパターンを生成する静的サイトを作成する方法 SVGでタータンパターンを生成する静的サイトを作成する方法 Apr 09, 2025 am 11:29 AM

タータンは、スコットランド、特にファッショナブルなキルトに通常関連する模様のある布です。 Tartanify.comでは、5,000を超えるTartanを集めました

See all articles