Vue でコンポーネントを正しく強制的に再レンダリングするにはどうすればよいですか? (手法の紹介)
Vue の応答性に頼ってデータを更新するだけでは不十分な場合があり、代わりにコンポーネントを手動で再レンダリングしてデータを更新する必要があります。あるいは、現在の DOM を破棄して最初からやり直すこともできます。では、Vue でコンポーネントを正しい方法で再レンダリングするにはどうすればよいでしょうか?
Vue にコンポーネントの再レンダリングを強制する最良の方法は、コンポーネントに :key
を設定することです。コンポーネントを再レンダリングする必要がある場合、key
の値を変更するだけで、Vue がコンポーネントを再レンダリングします。
これは非常に簡単な解決策です。
もちろん、他の方法に興味があるかもしれません:
- 単純で大雑把な方法: ページ全体をリロードする
- 不適切な方法: use
v -if
- より良い方法: Vue の組み込み
forceUpdate
メソッドを使用します - 最適な方法: コンポーネントの
キー
Change
簡単で大雑把な方法: ページ全体をリロードします。
これは、コンピュータを毎回再起動するたびにアプリケーションを閉じるのと同じです。 。
この方法は機能するかもしれませんが、非常に悪い解決策です。これは行わないでください。見てみましょう。もっといい方法。
不適切な方法: v-if
v- if# を使用します## ディレクティブ。コンポーネントが
true の場合にのみレンダリングされます。
false の場合、コンポーネントは
DOM に存在しません。
v-if がどのように機能するかを見てみましょう。
template に、
v-if ディレクティブを追加します:
<template> <my-component v-if="renderComponent" /> </template>
script、
nextTick メソッドを使用します
<script> export default { data() { return { renderComponent: true, }; }, methods: { forceRerender() { // 从 DOM 中删除 my-component 组件 this.renderComponent = false; this.$nextTick(() => { // 在 DOM 中添加 my-component 组件 this.renderComponent = true; }); } } }; </script>
- Just starting
- renderComponent
に設定されているため、
my-componentコンポーネント
をレンダリングすると、 - forceRerender
を呼び出すと、すぐに
renderComponentは
false に設定されています。 - v-if
ディレクティブが
falseと評価されるため、
my-componentのレンダリングを停止します。
- v-if
When の場合、
nextTickメソッドで
renderComponentを
true に設定します。命令の計算結果は
true、
my-component を再度レンダリングします ##このプロセスには、より重要な部分が 2 つあります
まず、
nextTick まで待つ必要があります。そうしないと、変更が表示されません。
では、ティックは DOM 更新サイクルを表します。 Vue は同じティック内で行われたすべての更新を収集し、ティックの終了時にそれらの更新に基づいて DOM 内のコンテンツをレンダリングします。次のティックまで待たないと、renderComponent への更新は自動的にキャンセルされ、何も変わりません。 2 番目に、2 回目のレンダリング時に、Vue はまったく新しいコンポーネントを作成します。 Vue は最初のコンポーネントを破棄し、新しいコンポーネントを作成します。これは、新しい
が通常どおりすべてのライフサイクルを通過することを意味します - created
、 Mounted
等 また、
は、promise とともに使用できます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>forceRerender() {
// 从 DOM 中删除 my-component 组件
this.renderComponent = false;
this.$nextTick().then(() => {
this.renderComponent = true;
});
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
ただし、これはあまり良い解決策ではないので、Vue が望んでいることを実行しましょう。
これは、この問題を解決する 2 つの最良の方法のうちの 1 つであり、どちらの方法もすべて Vue で正式にサポートされています。
通常、Vue はビューを更新することで依存関係の変更に対応します。ただし、forceUpdate
を呼び出すと、すべての依存関係が実際には変更されていない場合でも、更新を強制することもできます。この方法を使用するときにほとんどの人が犯す最大の間違いは次のとおりです。
forceUpdate
を呼び出すことができる 2 つの異なるメソッドがあります:// 全局 import Vue from 'vue'; Vue.forceUpdate(); // 使用组件实例 export default { methods: { methodThatForcesUpdate() { // ... this.$forceUpdate(); // ... } } }
重要な注意: これは、次の計算プロパティを更新しません。 call
forceUpdate はビューの再レンダリングを強制するだけです。 key を変更します多くの場合次へ、コンポーネントを再レンダリングする必要があります。
要正确地做到这一点,我们将提供一个key
属性,以便 Vue 知道特定的组件与特定的数据片段相关联。如果key
保持不变,则不会更改组件,但是如果key
发生更改,Vue 就会知道应该删除旧组件并创建新组件。
正是我们需要的!
但是首先,我们需要绕一小段路来理解为什么在Vue中使用key
。
为什么我们需要在 Vue 中使用 key
一旦你理解了这一点,那么这是了解如何以正确方式强制重新渲染的很小的一步。
假设我们要渲染具有以下一项或多项内容的组件列表:
- 有本地的状态
- 某种初始化过程,通常在
created
或mounted
钩子中 - 通过jQuery或普通api进行无响应的DOM操作
如果你对该列表进行排序或以任何其他方式对其进行更新,则需要重新渲染列表的某些部分。 但是,不会希望重新渲染列表中的所有内容,而只是重新渲染已更改的内容。
为了帮助 Vue 跟踪已更改和未更改的内容,我们提供了一个key
属性。 在这里使用数组的索引,因为索引没有绑定到列表中的特定对象。
const people = [ { name: 'Evan', age: 34 }, { name: 'Sarah', age: 98 }, { name: 'James', age: 45 }, ];
如果我们使用索引将其渲染出来,则会得到以下结果:
<ul> <li v-for="(person, index) in people" :key="index"> {{ person.name }} - {{ index }} </li> </ul> // Outputs Evan - 0 Sarah - 1 James - 2
如果删除Sarah
,得到:
Evan - 0 James - 1
与James
关联的索引被更改,即使James
仍然是James
。 James
会被重新渲染,这并不是我们希望的。
所以这里,我们可以使用唯一的 id
来作为 key
const people = [ { id: 'this-is-an-id', name: 'Evan', age: 34 }, { id: 'unique-id', name: 'Sarah', age: 98 }, { id: 'another-unique-id', name: 'James', age: 45 }, ]; <ul> <li v-for="person in people" :key="person.id"> {{ person.name }} - {{ person.id }} </li> </ul>
在我们从列表中删除Sarah
之前,Vue删除了Sarah
和James
的组件,然后为James
创建了一个新组件。现在,Vue知道它可以为Evan
和James
保留这两个组件,它所要做的就是删除Sarah
的。
如果我们向列表中添加一个person
,Vue 还知道可以保留所有现有的组件,并且只需要创建一个新组件并将其插入正确的位置。这是非常有用的,当我们有更复杂的组件,它们有自己的状态,有初始化逻辑,或者做任何类型的DOM操作时,这对我们很有帮助。
所以接下来看看,如果使用最好的方法来重新渲染组件。
更改 key 以强制重新渲染组件
最后,这是强制Vue重新渲染组件的最佳方法(我认为)。
我们可以采用这种将key
分配给子组件的策略,但是每次想重新渲染组件时,只需更新该key
即可。
这是一个非常基本的方法
<template> <component-to-re-render :key="componentKey" /> </template> export default { data() { return { componentKey: 0, }; }, methods: { forceRerender() { this.componentKey += 1; } } }
每次forceRerender
被调用时,我们的componentKey
都会改变。当这种情况发生时,Vue将知道它必须销毁组件并创建一个新组件。我们得到的是一个子组件,它将重新初始化自身并“重置”其状态。
如果确实需要重新渲染某些内容,请选择key
更改方法而不是其他方法。
原文地址:https://hackernoon.com/the-correct-way-to-force-vue-to-re-render-a-component-bde2caae34ad
推荐学习:vue视频教程!
以上がVue でコンポーネントを正しく強制的に再レンダリングするにはどうすればよいですか? (手法の紹介)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











vue.jsでBootstrapを使用すると、5つのステップに分かれています。ブートストラップをインストールします。 main.jsにブートストラップをインポートしますブートストラップコンポーネントをテンプレートで直接使用します。オプション:カスタムスタイル。オプション:プラグインを使用します。

HTMLテンプレートのボタンをメソッドにバインドすることにより、VUEボタンに関数を追加できます。 VUEインスタンスでメソッドを定義し、関数ロジックを書き込みます。

Vue.jsの監視オプションにより、開発者は特定のデータの変更をリッスンできます。データが変更されたら、Watchはコールバック関数をトリガーして更新ビューまたはその他のタスクを実行します。その構成オプションには、すぐにコールバックを実行するかどうかを指定する即時と、オブジェクトまたは配列の変更を再帰的に聴くかどうかを指定するDEEPが含まれます。

VUEマルチページ開発は、VUE.JSフレームワークを使用してアプリケーションを構築する方法です。アプリケーションは別々のページに分割されます。コードメンテナンス:アプリケーションを複数のページに分割すると、コードの管理とメンテナンスが容易になります。モジュール性:各ページは、簡単に再利用および交換するための別のモジュールとして使用できます。簡単なルーティング:ページ間のナビゲーションは、単純なルーティング構成を介して管理できます。 SEOの最適化:各ページには独自のURLがあり、SEOに役立ちます。

vue.jsでJSファイルを参照するには3つの方法があります。タグ;; mounted()ライフサイクルフックを使用した動的インポート。 Vuex State Management Libraryを介してインポートします。

vue.jsには、前のページに戻る4つの方法があります。$ router.go(-1)$ router.back()outes&lt; router-link to =&quot;/&quot; Component Window.history.back()、およびメソッド選択はシーンに依存します。

Vue.jsには配列とオブジェクトを通過するには3つの一般的な方法があります。V-Forディレクティブは、各要素をトラバースしてテンプレートをレンダリングするために使用されます。 V-BindディレクティブをV-Forで使用して、各要素の属性値を動的に設定できます。 .mapメソッドは、配列要素を新しい配列に変換できます。

VUEにDIV要素をジャンプするには、VUEルーターを使用してルーターリンクコンポーネントを追加するには、2つの方法があります。 @clickイベントリスナーを追加して、これを呼び出します。$ router.push()メソッドをジャンプします。
