【问题标题】:Why my v-for doesn't loop? VUE.JS with JSON为什么我的 v-for 不循环?带有 JSON 的 VUE.JS
【发布时间】:2018-07-30 12:58:54
【问题描述】:

我正在加载来自 .json 的数据,但 v-for 不返回循环。

我的 HTML:

<div id="app">
    <template v-for="product in products">
        <p>{{ product.brand }}</p>
        <p>{{ product.images }}</p>
        <p>{{ product.id }}</p>
        <p>{{ product.title }}</p>
        <p>{{ product.description }}</p>
        <p>{{ product.price }}</p>
    </template>

</div>

我的 JS:

new Vue({
el: '#app',
data: {
    products: []

},
methods: {

},
created: function() {
    var self = this;
    self.$http.get('http://localhost/app/products.json').then(function(response) {
        self.products = response.body;
    });
}
});

我的 JSON:

"product": [
    {
        "brand": "Apple",
        "images":"images/iphone-x-64-gb.jpg",
        "id": "iphone-x-64-gb",
        "title": "iPhone X 64 GB",
        "description": "Lorem ipsum dolor",
        "price": "1.159,00"
    },
    {
        "brand": "Apple",
        "images":"images/iphone-x-256-gb.jpg",
        "id": "iphone-x-256-gb",
        "title": "iPhone X 256 GB",
        "description": "Lorem ipsum dolor",
        "price": "1.329,00"
    },
    {
        "brand": "Apple",
        "images":"images/iphone-8-64-gb.jpg",
        "id": "iphone-8-64-gb",
        "title": "iPhone 8 64 GB",
        "description": "Lorem ipsum dolor.",
        "price": "819,99"
    }
   ]
  }

如果我像这样用 HTML 编写它是行不通的,但如果我把

{{ product[3].brand }}

例如...我只能看到这个,只是循环不起作用。

【问题讨论】:

    标签: json vue.js


    【解决方案1】:

    将您的模板更改为如下所示...

    <template>
        <div class="wrapper">
            <div  v-for="product in products">
                  <p>{{ product.brand }}</p>
                  <p>{{ product.images }}</p>
                  <p>{{ product.id }}</p>
                  <p>{{ product.title }}</p>
                  <p>{{ product.description }}</p>
                  <p>{{ product.price }}</p>
            </div>  
        </div>
    </template>
    

    Vue 模板需要 &lt;template&gt; 标签之间的单个根元素,而且我相信 v-for 在根元素上无法正常工作,因此我将其嵌套在“包装器”中。

    如果您查看您的开发工具控制台,您可能会看到类似这样的错误。

    Cannot use v-for on stateful component root element because it 
    renders multiple elements.
    

    [Vue warn]: Multiple root nodes returned from render function. 
    Render function should return a single root node.
    

    附加


    您的代码似乎还有其他问题。在我看来,您的请求应该如下所示,除非我遗漏了有关您的 json 被返回方式的信息。

    created: function() {
       this.$http.get('http://localhost/app/products.json').then(function(response) {
       this.products = response.body.products;
    }.bind(this));
    

    },

    注意从response.bodyresponse.body.products 的变化也可以将self 分配给this,但我发现使用.bind(this) 更简洁。

    这是一个基于您的代码的工作小提琴。 https://jsfiddle.net/skribe/umx98rxm/

    【讨论】:

    • 您也可以在
    • @Lucas G. “..
    • 您好,感谢您的努力,但这还没有奏效。我也在使用 Vue 2.5.13 和 vue-resource v1.3.4 - github.com/pagekit/vue-resource,在检查 vue 组件中我可以看到 / data / products: Object / product: Array[3] / 0: Object /这里的json内容正常。我想我迷失了方向。
    • 我对上面的答案进行了编辑。看看这里的工作示例。 jsfiddle.net/skribe/umx98rxm(请注意我用来加载 json 的 myjson 服务可能相当慢,所以请等待它加载。)
    • 如果这是您的问题的答案,我将不胜感激您将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2018-10-11
    • 2020-05-06
    • 2016-10-04
    • 1970-01-01
    • 2021-02-28
    • 2019-08-20
    • 2018-01-07
    相关资源
    最近更新 更多