Я пытаюсь получить идентификатор из определенного элемента. Но данные возвращают столько элементов, сколько есть, и все они имеют одинаковое значение. Даже если я нажму кнопку другого элемента, значение не изменится.Выходной снимок экрана Как мне это решить?
Здесь код родительского компонента:
<template>
<ProductsList
class = "w-full"
:product = "item"
@product-id = "selectedID"
v-for = "(item, idx) in products"
:key = "idx"
/>
</template>
<script>
export default {
async asyncData(context) {
const products = await context.app
.$axios({
method: "get",
url: process.env.PROJECT_API + "/products",
headers: {
Authorization: `Bearer ${context.store.state.currentToken}`,
},
})
.then((res) => res.data.products);
return {
products,
};
},
methods: {
selectedID(id) {
this.products.find( el => {
el._id === id
console.info({id});
})
}
},
}
</script>
Код дочернего компонента:
<template>
<button @click = "passId">
details
<button>
<template>
export default {
props: ['product'],
methods: {
passId() {
this.$emit('product-id', this.product._id)
}
},
}
</script>
Ваш метод selectedID
присваивает искомый id
каждому продукту.
найти() возвращает первый элемент, для которого проверено условие true
.
Ваш find()
ничего не проверяет. Вместо этого он присваивает id
каждому элементу (вы используете =
вместо ===
), ничего не возвращая, что технически означает, что он возвращает undefined
, который оценивается как false
для каждого элемента. Так что ваш .find()
ничего не находит.
Другими словами, вы должны заменить
selectedID(id) {
this.products.find( el => {
el._id = id
console.info({id});
})
}
с:
selectedID(id) {
console.info(this.products.find(el => el._id === id)?._id);
}
или, более явно:
selectedID(id) {
const product = this.products.find(el => el._id === id);
if (product) {
console.info(product._id);
}
}
В приведенной выше находке el => el._id === id
является сокращением для:
function(el) {
return el._id === id;
}
Узнайте больше о стрелочные функции.
Рабочий пример:
Vue.component('product-item', {
template: `<button @click = "passId">details</button>`,
props: ['product'],
methods: {
passId() {
this.$emit('select-product', this.product._id);
}
}
});
new Vue({
el: '#app',
data: () => ({
products: [
{ _id: 'one' },
{ _id: 'two' },
{ _id: 'three' }
]
}),
methods: {
selectProduct(id) {
console.info(this.products.find(p => p._id === id)?._id);
}
}
})
button {
display: block;
cursor: pointer;
}
<script src = "https://cdn.jsdelivr.net/npm/[email protected]"></script>
<div id = "app">
<product-item
v-for = "product in products"
:key = "product._id"
:product = "product"
@select-product = "selectProduct" />
</div>
В приведенном выше примере я изменил пару имен:
<ProductsList>
=> <ProductItem>
selectedID
=> selectProduct