【问题标题】:vue 2 v-for not working after loading json with axiosvue 2 v-for 在用 axios 加载 json 后不工作
【发布时间】:2021-09-10 23:48:29
【问题描述】:

我在互联网上搜索了一个解决方案,但到目前为止都没有奏效。 我有一个 Vue 组件,之后我想在其中加载下拉内容。由于它不起作用,我简化了代码,使其只显示元素(即驱动程序名称)。 问题是,v-for 似乎不起作用,因为元素不是在 DOM 中创建的。

代码如下:

<template>

            <div class="list-group">

                <a class="list-group-item" v-for="driver in drivers">
                    {{driver.name}}
                </a>

            </div>

</template>

<script>
export default {
    name: "DriverComponent",
    data: function (){
        return {
            drivers: [],
        }
    },
    mounted(){
        this.loadDrivers();
        console.log(this.drivers);
    },
    methods: {

        loadDrivers: function(){
            axios.get('/api/drivers')
                .then(
                    (response) => {
                        this.drivers = response.data.data;
                        console.log(this.drivers);
                    }

                )
                .catch(function(error){
                    console.log(error);
                });
            // console.log(this.drivers);
        }
    }
}
</script>

在我的 app.js 中:

require('./bootstrap');

window.Vue = require('vue').default;
Vue.component('driver-component', require('./components/DriverComponent.vue').default);
const drivers = new Vue({
    el: '#driv',
});

我的 html 如下所示:

    <div id="driv">
        <driver-component></driver-component>
    </div>

如您所见,我添加了一些日志,如下所示: Image of console output

有趣的是,它应该是同一个数组,但第一个数组是空的,但第二个数组中有正确的值。-> 编辑:澄清,谢谢

为了突出问题:我希望有一个类似的列表: v-for created list 相反,我得到一个空白页。 如果我用我在 json 中获得的数据初始化 drivers 数组,它就可以工作。但是,由于我之后加载数据,它似乎不起作用

感谢您的帮助! BR 约翰内斯

编辑: 我正在使用"axios": "^0.21",控制器是:

    public function index(){
        return DriverResource::collection(Drivers::all());
    }

此控制器在data 字段中返回数组,因此,我设置了response.data.data(意思是两次data) 后端返回:

{"data":[{"id":1,"name":"UPS"},{"id":2,"name":"Hermes"}]}

【问题讨论】:

  • 第一个空数组来自 console.log,在挂载的钩子内调用 this.loadDrivers(); 后您就拥有了。这可以是空的,因为在执行此行时 axios 调用尚未完成。在将响应数据分配给this.drivers 之后,第二个数组在 axios 的已解决承诺内执行。您的代码可以正常工作。
  • 此外,您可以将created() 事件用于较早的API 调用,而不是稍后调用的mounted()。有关示例,请参阅此 question
  • @lisymcaydnlb 如果稍后调用mounted() 然后创建,那我为什么要调用created()?
  • @Chin.Udara 感谢您对数组的澄清。不幸的是,代码没有按我的预期工作,因为没有创建元素。似乎 v-for 不起作用

标签: laravel vue.js axios


【解决方案1】:

查看axios 的主页。在“响应模式”section 下,它们提供响应的外观。专门针对 data,它是

{
  // `data` is the response that was provided by the server
  data: {}

  < ... omitted for brevity ... >
}

请再次检查您的后端返回或应该返回的内容。记录你得到的全部回复。 this.drivers = response.data.data; 似乎不正确,但 this.drivers = response.data; 应该可以工作。


您没有说明您正在使用哪个版本的axios 或显示您的配置,所以我使用以下示例:
axios = ^0.21.1
vue-axios = @ 987654332@

将“名称”替换为“标题”以匹配以下响应格式:

 {
    "title": "delectus aut autem",

      < ... omitted for brevity ... >
  },

--

loadDrivers: function(){
  Vue.axios.get('https://jsonplaceholder.typicode.com/todos')
      .then(
          (response) => {
            this.drivers = response.data; // <<-- works and many task titles are shown on page
            // this.drivers = response.data.data; // <<-- DOES NOT WORK LIKE FOR YOU, blank page
            console.log(this.drivers);
          }
      )
      .catch(function(error){
        console.log(error);
      });
  // console.log(this.drivers);
}

【讨论】:

  • 我正在使用"axios": "^0.21"。我在控制器中使用资源:``` public function index(){ return DriverResource::collection(Drivers::all()); } ``` 因此,数组放在data 中,我需要data 两次...对吗?
  • 后端返回:``` {"data":[{"id":1,"name":"UPS"},{"id":2,"name":"Hermes "}]} ```
  • 您能否在收到响应时循环并仅记录驱动程序名称?确认他们在那里。应该看到 2 条与 UPS 和 Hermes 分开的线路。另一个猜测,也许你有类似this 的问题,其中 v-bind:key="driver.id" 或类似的东西会有所帮助。见官方documentation部分。
  • 日志显示,驱动程序名称已加载,我确认了这一点......还是我把你的问题弄错了?我尝试了 v-bind:key="driver.id",但没有成功
  • 不,你理解正确。如果您的数据已加载但未显示,那么您的其他设置一定是错误的。您可以直接在 HTML 中记录值,以查看它们在哪里显示和在哪里不显示。此外,我认为您应该获取一个初始 HelloWorld 项目,其中一切都开箱即用,并在其之上逐步应用您的解决方案。文字越来越难猜了。如果您将代码的抽象版本放入代码示例托管网站并在此处添加实时链接以供任何有兴趣播放它的人使用,这将很有帮助。希望您能在此过程中自己发现错误。
猜你喜欢
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2021-05-10
  • 1970-01-01
  • 2021-07-16
  • 2019-09-20
  • 2017-09-15
相关资源
最近更新 更多