Vue.jsのv-forでkeyが必要な理由

この記事を書いたチーム:frontier

はじめに

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

Vue.jsv-forディレクティブでは、要素を配列にバインドしてレンダリングをすることができます。そしてバインドを行う際、各要素に一意のkey属性を指定することが推奨されています。本記事では、なぜ推奨されているのかについて述べます。

 

 

仮想DOMとは

メモリ上に保持された(実際のDOMとは異なる)仮想的なDOMで、パフォーマンスの向上や効率的なDOM更新のため、Vue.jsReactなどで使用されています。リアクティブなデータが変更されたとき、まず仮想DOMが変更され、変更内容の抽出(差分計算)が行われ、実際のDOMに変更部分が反映されるという処理が行われます。差分計算では、仮想DOMで「更新しなければならない部分」のみを抽出して処理を行います。

 

 

DOMノードと要素番号のずれ

 例えば、次のようにデータを変更すると考えます。

ここで、Tulipの削除を行うと、どうなるでしょうか?

Tulipは削除されず、先頭のDaliaが削除されてしまいます。この問題は、Vue.jsが変更内容の抽出を行う過程で、配列のどの要素が変更されたのか正確に把握できず、DOMノードが再利用されてしまうことに起因します。

 先ほどの例では、Tulipの削除を行う際にindexを基に再レンダリングを行うため、先頭の要素が削除されています。

結論

v-forディレクティブを使用する場合は、Vue.jsが要素を正しく認識できるよう、一意の値をkey属性に指定しましょう!

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス