# Массив 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
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
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