Vue でデータが変更された後にビューを同期的に更新する方法

Vue でデータが変更された後にビューを同期的に更新する方法

序文

少し前に、興味深い問題を目にしました。Vue のデータが変更された後に、ビューを同期的に更新するにはどうすればよいでしょうか? 検索してみましたが、問題の解決策は見つかりませんでした。ソース コードからしか解決策を見つけることができませんでした。

理由

Vue でデータを変更した後、ビューが同期的に更新されないことは誰もが知っています。

vue インスタンスが初期化された後、データはレスポンシブ オブジェクトに設定されます。this.xxx = 1 を実行すると、このレスポンシブ オブジェクトのセッターがトリガーされます。セッターでは、xxx にサブスクライブしているすべてのサブスクライバーに通知するための更新がトリガーされます。ただし、このトリガー更新は同期的ではなく、すべてのウォッチャーをキューに追加し、nextTick 後にビューを更新します。

そのため、vue はビューを同期的に更新できません。

回避策

原因がわかれば、必ず解決策を見つけることができます。

ビューは nextTick で更新されるため、このときにビューを更新するメソッドを実行する必要があります。データが変更されたときにこのメソッドを手動で実行すれば、ビューを同期的に更新するという目的を達成できます。

ソース コードを理解すると、実行されるメソッドは watcher.run() であることがわかります。では、このメソッドを取得するにはどうすればよいのでしょうか。

これをすぐに理解したい場合は、Vue.js Technology Unveiledを読むことをお勧めします。

これをコンソールに出力してみましょう

run メソッドは _watcher オブジェクトのプロトタイプで見つかるため、問題は解決します。

 xxx = 1;
 this._watcher.run()

上記のコードを実行し、データを更新した後にビューを手動で更新して、同期効果を実現します。

より良い解決策

ビューを同期更新したいときに、毎回 this._watcher.run() を追加するのは面倒です。そこで、this.xxx = 1 以降のビューの同期更新をサポートするプラグインを作成しました。

このプラグインの原理は非常にシンプルです。コンポーネント オプションに、データに似たオプション syncData を追加します。次に、それをデータに配置します。create フックが呼び出されると、この部分のデータが再びハイジャックされます。syncData のデータが変更されると、_watch.run() が自動的にトリガーされ、ビューが同期的に更新されます。

プラグインアドレス: GitHubアドレス

追記

正直に言うと、このプラグインは役に立たないと思います。理論的には、このプラグインが解決できる問題はすべて $nextTick で解決できます。

Vue でデータ変更後にビューを同期する方法についての記事はこれで終わりです。Vue ビュー同期更新の関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueでデータが変更されてもビューを更新できない問題を解決する
  • Vueでオブジェクトのプロパティが変更されてもビューが更新されない問題を解決する
  • Vueビューが更新されない状況の詳細な説明

<<:  Centos7 に Nginx 統合 Lua サンプル コードをインストール

>>:  MySQL をデプロイするときに発生する「テーブル mysql.plugin が存在しません」という問題の解決方法

推薦する

Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します

Nginx は同じドメイン名で構成されており、http と https の両方でアクセスできます。証...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...

CSS で「プラス記号」効果を実装するためのサンプルコード

以下に示すプラス記号の効果を実現するには: この効果を実現するには、div 要素だけが必要です。 b...

Vueのコンポーネント値の転送から始まるオブザーバーモードの詳細な説明

目次オブザーバーパターンVue パス値最初のステップは、main.jsにバスを登録することです。 2...

VueとReactの詳細

目次1. パノラマII. 背景1. 反応: プロフェッショナル2. ビュー: 凡例3. 技術的な思考...

MySQL チュートリアル: サブクエリの例の詳細な説明

目次1. サブクエリとは何ですか? 2. サブクエリはどこに表示されますか? 3. Whereサブク...

MySQLトランザクションとMySQLログの詳細な説明

取引特性1. アトミック性: トランザクションの開始後、すべての操作が完了するか、まったく実行されな...

Linuxのwhichコマンドの具体的な使い方

Linux でファイルを見つけたいのに、その場所がわからないことがよくあります。次のコマンドを使用し...

Angularルーティングアニメーションと高度なアニメーション機能の詳細な説明

目次1. ルーティングアニメーション2. グループクエリとスタガー1. ルーティングアニメーションル...

JavaScript スロットリングとアンチシェイクに関する簡単な説明

目次スロットルと手ぶれ防止コンセプト:違いスロットリングの実装スロットル機能手ぶれ補正の実装手ぶれ防...

mysql5.7 ユーザー権限の作成、ユーザーの削除、権限の取り消し

1. ユーザーを作成します。注文: 'password' によって識別される ...

JavaScript の手ぶれ補正とスロットリングの詳細な説明

目次デバウンススロットル要約するデバウンス定義: スクロール イベントなど、短時間に連続してトリガー...

MySQL無料インストール版のパスワード設定に関する詳細なチュートリアル

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...