Как изменить элемент массива в вычисляемых свойствах vuejs - PullRequest
0 голосов
/ 20 марта 2020

я обнаружил аналогичную проблему в stackowerflow, но все еще не могу найти решение

Вот моя проблема,

У меня есть некоторые данные, которые я запрашиваю из остальных API, это отгрузка с моего электронного начала сайт, этот груз содержит массив товаров, и каждый товар содержит один товар. Я создал вычисленные свойства в моем компоненте products, где я отображаю элементы и создаю новый массив продуктов. Проблема в тексте, после того, как я получаю свои продукты из остальных API, мне нужно пометить каждый продукт в этом массиве как разрешенный, но он не работает для меня, похоже, что мой новый массив продуктов не реагирует

Вот мой код

Scan. vue

<script>
    import HeadLine from '@/components/HeadLine'
    import OrderDetails from "@/components/collect/OrderDetails"
    import ProductListItem from "@/components/collect/ProductListItem"
    import {mapActions} from 'vuex'

    export default {
        components: {
            HeadLine, OrderDetails, ProductListItem
        },
        data() {
            return {
                scan: '',
                shipment: {},
                loading: null,
                success: null,
            }
        },
        computed: {
            products() {
                return this.shipment.items ? this.shipment.items.map(item => {
                    return {
                        barcode: item.product.barcode,
                        name: item.product.name,
                        sku: item.product.sku,
                        success: null
                    }
                }) : []
            },
            orderDetails() {
                return {
                    tracking_number: this.shipment.tracking_number || '',
                    order_id: this.shipment.remote_order_id || ''
                }
            }
        },
        methods: {
            ...mapActions([
                'handleError',
                'getShipmentByTracking'
            ]),
            async handleGetShipmentByTracking() {
                try {
                    this.loading = true
                    this.shipment = await this.getShipmentByTracking(this.scan)
                    this.scan = ''
                } catch (e) {
                    this.handleError(e)
                    this.scan = ''
                } finally {
                    this.loading = null
                }
            },
            handleScan() {
                // If no shipment, get it by tracking number
                if (!this.shipment.id) {
                    return this.handleGetShipmentByTracking()
                }

                //We got shipment already, start scan products by barcode
                this.products.map((el) => {
                    if (el.barcode === this.scan) {
                        el.success = true
                    }
                })
            },
            clearOrder() {
                this.shipment = {}
                this.scan = ''
            }
        },
        watch: {
            products: {
                handler(val){
                    alert('changed')
                },
                deep: true
            }
        }
    }
</script>

<template>
    <v-row align="center" justify="center">
        <v-col cols="12" md="12" sm="12" xl="12">
            <head-line text="Scan tracking numbers"/>
        </v-col>
        <v-col cols="12" md="12" sm="12">
            <v-row>
                <v-col cols="12" md="6" sm="12">
                    <v-card>
                        <v-card-title>
                            Scan Area
                        </v-card-title>
                        <v-card-text>
                            <v-text-field
                                @keyup.enter="handleScan"
                                label="Scan"
                                clearable
                                loader-height="3"
                                :loading="loading"
                                v-model="scan"
                                outlined
                            ></v-text-field>
                            <v-btn
                                block
                                color="primary"
                                @click="clearOrder"
                            >
                                Clear Order
                            </v-btn>
                        </v-card-text>
                    </v-card>
                </v-col>
                <v-col cols="12" md="6" sm="12">
                    <order-details :details="orderDetails"/>
                </v-col>
            </v-row>
        </v-col>
        <v-col cols="12" sm="12" md="12" v-if="products">
            <product-list-item v-for="(product, index) in products" :key="index" :product="product" />
        </v-col>
    </v-row>
</template>

<style scoped>

</style>

ProductListItem

<script>
    export default {
        props: {
            product: {
                type: Object,
                default: {}
            },
        },
        computed: {
            color() {
                return this.product.success ? 'green' : 'white'
            }
        }
    }
</script>

<template>
    <v-card class="m-1" :color="color">
        <v-card-title>
            {{product.name}}
        </v-card-title>
        <v-card-text class="title font-weight-black">
            <div>
                <v-icon class="mr-1">mdi-pound</v-icon>{{product.sku}}
            </div>
            <div>
                <v-icon class="mr-1">mdi-barcode</v-icon>{{product.barcode}}
            </div>
        </v-card-text>
    </v-card>
</template>

<style scoped>

</style>

А вот console.log моего this.products enter image description here

Я отметил продукты как успешные, но цвет в моем ProductListItem компоненте все еще белый

1 Ответ

0 голосов
/ 20 марта 2020

Два предложения:

  1. Сделать значение по умолчанию для product prop в ProductListItem как функцию, возвращающую объект
  2. Значение по умолчанию product prop должен содержать success prop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...