Отфильтрвать полученный массив для отображения опций Vue.js
Добрый день ,есть массив продуктов в json вот его кусок `{
"products":[
{ "badge":"новинка", "image": "8.jpg", "sku":"420гр", "name": "Болоньезе", "except":"Томатный соус, моцарелла, красный лук, фарш, помидор", "price":369, "id": "1", "avalible": true, "category":"Роллы", "type":"pizza", "variations": [
{
"id":"1110",
"size":"25",
"weight":"320гр",
"price":500},
{ "id":"3335",
"size":"33",
"weight":"550гр",
"price":1020
},
{"id":"3338",
"size":"40",
"weight":"720гр",
"price":1020
}
],
"variation_id":222
},`
Есть Vue.js файл который представляет собой карточку товара
<template>
<div class="ar-catalog-item">
<span class="ar-catalog-item__badge">
<img :src="('../assets/images/' + product_data.badge)" alt="">
{{ product_data.badge }}
</span>
<img class="ar-catalog-item__img" :src="require('../assets/images/' + product_data.image)" alt="img">
<div v-for="(item, index) in orderedObj" :key="index"> Вес {{ item.weight }}</div>
<p class="ar-catalog-item__sku">{{ product_data.sku }}</p>
<p class="ar-catalog-item__name">{{ product_data.name }}</p>
<p class="ar-catalog-item__except">{{ product_data.except }}</p>
<p v-if="product_data.type == 'pizza'" class="ar-catalog-item_sku_variations">Выберите размер</p>
<ar-variation :options="product_data.variations" @select="mysortFunction()">
</ar-variation>
<!--
<div class="variations" v-for="variation in product_data.variations" :key="variation.id">
<a class="ar-variable" :class="{ active: isActive[variation.id] }" @click="selectSize(variation.id)">
Здесь: {{ variation.price }}
</a>
</div> -->
<div class="ar-catalog-item-bottom">
<p class="ar-catalog-item-bottom__price"> Цена: {{ product_data.price }}₽</p>
<button @click="addToCart" class="ar-catalog-item-bottom__add_to_cart_btn btn">хочу</button>
<!-- <div class="ar-catalog-item-qty">
<span
v-if="product_data.quantity > 1"
class="ar-catalog-item-qty_btns">
<button class="item_quantity_btn"
@click="decrementInProductCard">-</button>
{{ product_data.quantity }}
<button class="item_quantity_btn"
@click="addToCart">+</button>
</span>
</div> -->
</div>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import arVariation from './ar-variables.vue'
export default {
name: 'ar-catalog-item',
components: {
arVariation
},
props: {
product_data: {
type: Object,
default() {
return { }
}
},
},
data() {
return {
isActive: {
type: Object
},
orderedObj: {
}
}
},
created() { },
computed: { },
methods: {
mysortFunction: function () {
this.orderedObj = this.sortKeyObject(this.product_data.variations);
// this.product_data.variations = this.orderedObj.filter(function(variation) {
// return variation.weight.some(function(weight) {
// return weight === '25' || weight === '33' || weight === '40';
// });
// });
// console.log(weight);
},
sortKeyObject: function (o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
},
selectSizes(size) {
let vm = this;
// i == i || 0
// vm.selectedSize = vm.product_data.variations[i]
vm.$set(vm.isActive, (size) || !vm.isActive, [size]);
console.log('size checked')
},
...mapActions([
]),
//* Кнопки отвечающие за действие увелечения и убавления количества в корзине из карточки товара *//
addToCart() {
this.$emit('addToCart', this.product_data); //* Добавляем в корзину товар
},
decrementInProductCard() { //* Убавляем товар
let pd = this;
pd.$emit(
'decrementInProductCard',
pd.product_data.quantity--)
}
},
mounted() {
this.$set(this.product_data, 'quantity', 1)
}
}
Ответы (2 шт):
Автор решения: Виктор Карев
→ Ссылка
Компонент arVariation у вас бросает событие select? Пусть он в этом событии параметром передаёт выбранный вариант:
this.$emit('select', this.options[k]);
где k - это номер выбранного варианта. Передаёте этот вариант родительскому компоненту:
<ar-variation :options="product_data.variations" @select="onSelectVariation">
а родительский компонент у себя его обрабатывает:
onSelectVariation: function (variation) {
// здесь уже обрабатываете выбранный вариант, в котором все нужные данные
}
Автор решения: KORICA
→ Ссылка
< template >
<
div class = "ar-catalog-item" >
<
span class = "ar-catalog-item__badge" >
<
img: src = "('../assets/images/' + product_data.badge)"
alt = "" > {
{
product_data.badge
}
} <
/span>
<
img class = "ar-catalog-item__img": src = "require('../assets/images/' + product_data.image)"
alt = "img" >
<
div v -
for = "(item,weight) in isActive": key = "weight.index" > Вес {
{
weight
}
} < /div> <
p class = "ar-catalog-item__sku" > {
{
product_data.sku
}
} < /p> <
p class = "ar-catalog-item__name" > {
{
product_data.name
}
} < /p> <
p class = "ar-catalog-item__except" > {
{
product_data.except
}
} < /p> <
p v -
if = "product_data.type == 'pizza'"
class = "ar-catalog-item_sku_variations" > Выберите размер < /p>
<!-- <ar-variation
: options = "product_data.variations"
@select = "mysortFunction()" >
<
/ar-variation>
-->
<
div class = "variations"
v -
for = "(variation,index) in product_data.variations": key = "index" >
<
a class = "ar-variable": class = "{ active: isActive [variation] }"
@click.prevent = "selectSize(variation)" > {
{
variation.size
}
} <
/a> <
/div>
<
div class = "ar-catalog-item-bottom" >
<
p class = "ar-catalog-item-bottom__price" > Цена: {
{
product_data.price
}
}₽ < /p>
<
button @click = "addToCart"
class = "ar-catalog-item-bottom__add_to_cart_btn btn" > хочу < /button>
<!-- <div class="ar-catalog-item-qty">
<
span
v -
if = "product_data.quantity > 1"
class = "ar-catalog-item-qty_btns" >
<
button class = "item_quantity_btn"
@click = "decrementInProductCard" > - < /button> {
{
product_data.quantity
}
} <
button class = "item_quantity_btn"
@click = "addToCart" > + < /button> <
/span> <
/div> --> <
/div> <
/div>
<
/template>
<
script >
import {
mapActions
} from 'vuex';
// import arVariation from './ar-variables.vue'
export default {
name: 'ar-catalog-item',
components: {
// arVariation
},
props: {
product_data: {
type: Object,
default () {
return {}
}
},
},
data() {
return {
isActive: {},
orderedObjects: [],
}
},
created() {
},
computed: {
reducedArray() {
if (this.orderedObjects.length) {
return this.orderedObjects
} else {
return this.product_data.variations
}
}
},
methods: {
// mysortFunction: function () {
// this.orderedObjects = this.sortKeyObject(this.product_data.variations);
// },
// sortKeyObject: function (o) {
// return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
// },
selectSize(i) {
let vm = this;
// i == i || 0
// vm.selectedSize = vm.product_data.variations[i]
this.$set(this.isActive, i || !this.isActive, [i]);
vm.$emit('select-size');
console.log('size checked')
},
...mapActions([]),
//* Кнопки отвечающие за действие увелечения и убавления количества в корзине из карточки товара *//
addToCart() {
this.$emit('addToCart', this.product_data); //* Добавляем в корзину товар
},
decrementInProductCard() { //* Убавляем товар
let pd = this;
pd.$emit(
'decrementInProductCard',
pd.product_data.quantity--)
}
},
mounted() {
this.$set(this.product_data, 'quantity', 1)
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>