簡體   English   中英

無法讀取VueJs應用程序中未定義的屬性“價格”

[英]Cannot read property 'price' of undefined in VueJs Application

我正在使用vueJs創建購物車系統。 我想顯示用戶想要的項目列表,但是當我運行該應用程序並嘗試在結帳列表中添加產品時,當我要將項目添加到列表中時,在谷歌瀏覽器控制台窗口中出現以下錯誤。

[Vue warn]: Error in render: "TypeError: Cannot read property 'name' of undefined"

(found in <Root>)
warn @ vue.js:634
vue.js:1897 TypeError: Cannot read property 'name' of undefined
    at eval (eval at createFunction (vue.js:11628), <anonymous>:3:265)
    at Proxy.renderList (vue.js:2658)
    at Proxy.eval (eval at createFunction (vue.js:11628), <anonymous>:3:183)
    at Vue._render (vue.js:3545)
    at Vue.updateComponent (vue.js:4061)
    at Watcher.get (vue.js:4472)
    at Watcher.run (vue.js:4547)
    at flushSchedulerQueue (vue.js:4305)
    at Array.<anonymous> (vue.js:1989)
    at flushCallbacks (vue.js:1915)
logError @ vue.js:1897
cart.html:91 Uncaught (in promise) TypeError: Cannot read property 'price' of undefined
    at cart.html:91

這是我的cart.html代碼。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Bootstrap Example</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="bootstap.css">
    <!--<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>-->
    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>-->
    <!--<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>-->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.0/axios.min.js">

    </script>
</head>
<body>
    <nav class="navbar navbar-expand-sm bg-dark navbar-dark">
        <ul class="navbar-nav">
            <li class="nav-item active">
                <a class="nav-link" href="index.html">Shop</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="index.html">Show All Products</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/AddProducts.html">Add Product</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="cart.html"> cart</a>
            </li>
        </ul>
    </nav>
    <br />
    <div class="container" id="app">
        <h2>Your cart</h2>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>Product</th>
                    <th>quantity</th>
                    <th>Rate</th>
                    <th>vendor</th>
                    <th>Amount</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="cartItem in cartItems">
                    <td>{{cartItem.product.name}}</td>
                    <td>
                        <button type="button" class="btn btn-primary" v-on:click="changequantity(cartItem.productId,-1)">-</button>
                        {{cartItem.quantity}}
                        <button type="button" class="btn btn-primary" v-on:click="changequantity(cartItem.productId,+1)">+</button>
                    </td>
                    <td>{{cartItem.product.price}}</td>
                    <td>{{cartItem.product.vendor.name}}</td>
                    <td>{{cartItem.quantity*cartItem.product.price}}</td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td><b>Total</b></td>
                    <td>{{this.totalPrice}}</td>
                </tr>
            </tbody>
        </table>
    </div>
    <script>let app = new Vue({
        el: "#app",
    data: {

        totalPrice: 0,
        price: 0,
            cartItems:[]
        },
        methods:{
            fetAllcartItems(){
                new Promise((resolve)=>{
                    axios.get('/api/cart').then(function (response) {
                    resolve(response.data)
                })
                }).then((data)=>{
                        console.log(data)

                            this.cartItems=data
                            // console.log(data)
                            for(d in data){

                                this.totalPrice = this.totalPrice+ (d.quantity )* (d.product.price);
                            }
                    // console.log(this.products)
                })
            },
            changequantity(id,quantity){
                var obj = {id : id , quantity: quantity}

                // let iddd = parseInt(id)
                console.log(this.cartItems)
                let index =this.cartItems.findIndex(item => item.productId == id)

                this.totalPrice = this.totalPrice + this.cartItems[index].product.price * quantity
                if(this.cartItems[index].quantity ===1 && quantity===-1){
                    this.cartItems.splice(index ,1);
                }
                new Promise((resolve)=>{
                    axios.post('/api/cart/add',obj).then(function (response) {
                    resolve(response.data)
                })
                }).then((data)=>{
                    console.log(data)

                    if(data.quantity>0)
                    this.cartItems[index].quantity = data.quantity
                    /*for(d of data){

                        this.totalPrice = this.totalPrice+ (d.quantity )* (d.product.price);
                    }*/
                })
                // location.reload();
            }
        }
    })
    app.fetAllcartItems();</script>
    </body>
</html>

這是單擊“購買”按鈕時的屏幕截圖。

在此處輸入圖片說明

這是我運行應用程序時的屏幕截圖。 點擊

for(d in data){幾乎可以肯定是錯誤的。 也許您的意思for(const d of data) { d原始形式是字符串鍵,而不是數組中的項。 這很可能是第二個錯誤的原因,一個關於price錯誤。

對於有關name的錯誤,我想是這樣的:

<td>{{cartItem.product.vendor.name}}</td>

在某些情況下, cartItem.product.vendor似乎undefined

我強烈建議您開始使用短絨。 您的代碼中充滿了其他一些小缺陷,我希望棉絨能為您效勞。

首先,您不應該創建所有這些新的承諾。

若要查看顯示名稱的原因,您需要檢查所獲取的數據,請在VueDevtool上進行檢查,或者將console.log(this.cartItems)放在適當的位置,並查看其相關性,確保在此對象中cartItems是對象數組,其中poduct也是對象,名稱具有值/空值。

同樣是for(d in data) ,替換for(let d in data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM