LoginSignup
76
53

More than 5 years have passed since last update.

Vue.js の同じ親を持つ v-for 使用の兄弟要素と key ディレクティブへの配列のインデックス指定について

Last updated at Posted at 2018-07-10

Vue.js の v-for で配列を指定する際にキーを指定しないほうがよいらしい

Vue.js: v-forで項目インデックスをkey属性にしていいのか
追加と削除が繰り返される配列要素のオブジェクトに一意のid番号を振る

いままでばんばんつかってました・・・

親を同じくする兄弟要素がそれぞれに v-for で配列を記述する場合

配列のキーを使用しないほうがよいというのは前述の記事にて述べられているのですが
下記のような良くないパターンをあえて

duplicate-key.vue
<template>
  <div>
    <ul>
      <!-- list 使用一か所目 -->
      <li
        v-for="(number, index) in list"
        :key="index"
        >{{ number }}</li>
      <!-- list 使用二か所目 -->
      <li
        v-for="(number, index) in list"
        :key="index"
        >{{ number }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [1, 2, 3]
    };
  }
};
</script>

同一の list を使用している li での v-for
配列のキーを :key="index" として使用しております。

実行例にて確認すると下記のようなエラーが

[Vue warn]: Duplicate keys detected: '0'. This may cause an update error.
[Vue warn]: Duplicate keys detected: '1'. This may cause an update error.
[Vue warn]: Duplicate keys detected: '2'. This may cause an update error.

GitHub での issue にて

:key="it.id" として複数の要素に同じ :key を使用しようとしたらエラーが
仕方ないから suffix で対応した

同じ ul の子に同じ :key の指定をしたら発生するしこれは期待される動き

前述の事例は同一の ul 中で :key がかぶったから発生したようです。

プレフィクスとして first- second- を付加して問題をなくした事例

not-duplicate-key.vue
<template>
  <div>
    <ul>
      <!-- list 使用一か所目 (first-) -->
      <li
        v-for="(number, index) in list"
        :key="`first-${index}`"
        >{{ number }}</li>
      <!-- list 使用二か所目 (second-) -->
      <li
        v-for="(number, index) in list"
        :key="`second-${index}`"
        >{{ number }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [1, 2, 3]
    };
  }
};
</script>
76
53
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
76
53