# Массив ref-ссылок при использовании с v-for
кардинальное изменение

Во Vue 2, использование атрибута ref внутри v-for заполнит соответствующее свойство $refs массивом ссылок на элементы. Такое поведение становится двусмысленным и неэффективным при наличии вложенных v-for.

Во Vue 3, такое использование больше не будет автоматически создавать массив в $refs. Чтобы получить несколько ссылок из одной привязки, следует привязать ref к функции, которая обеспечит большую гибкость (это новая возможность):

<div v-for="item in list" :ref="setItemRef"></div>
1

С использованием Options API:

export default {
  data() {
    return {
      itemRefs: []
    }
  },
  methods: {
    setItemRef(el) {
      if (el) {
        this.itemRefs.push(el)
      }
    }
  },
  beforeUpdate() {
    this.itemRefs = []
  },
  updated() {
    console.log(this.itemRefs)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

С использованием Composition API:

import { onBeforeUpdate, onUpdated } from 'vue'

export default {
  setup() {
    let itemRefs = []
    const setItemRef = el => {
      if (el) {
        itemRefs.push(el)
      }
    }
    onBeforeUpdate(() => {
      itemRefs = []
    })
    onUpdated(() => {
      console.log(itemRefs)
    })
    return {
      setItemRef
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Обратите внимание:

  • itemRefs не обязательно должно быть массивом: это может быть и объект, где ссылки задаются их ключами итерации.

  • Это также позволяет сделать itemRefs реактивным и отслеживать в нём изменения при необходимости.

# Стратегия миграции

Флаги сборки для миграции:

  • V_FOR_REF
  • COMPILER_V_FOR_REF