【问题标题】:Using Ajax data inside Vue Component在 Vue 组件中使用 Ajax 数据
【发布时间】:2017-12-01 12:33:17
【问题描述】:

我构建了一些功能,当我尝试将其导出到 vue 组件时它停止工作。

我几乎可以肯定这与组件渲染模板时 ajax 不可用有关,因为模板内的数组为空。

谁能看到延迟渲染直到加载 ajax 的任何方法?

也许我找错树了。数据在 ajax .done() 回调中可用。

<template>

      <div   v-for="item in filteredItems"  @mouseover="activate" @mouseout="deactivate" @click="openlink"  class="item" :data-link="item.link">
      <div class="vline"></div>
        <div class="details">
          <div class="top">
            <div class="media">{{item.sectors}}</div>
            <div class="title">{{item.title}}</div>
          </div>
          <div class="description">{{item.description}}</div>
                </div>
                <div class="img">
                  <div class="overlay"><a class="button" v-bind:href="'featured/'+item.link">View project <span class="plus"><span>[</span><span>+</span><span>]</span></span></a></div>
                  <div v-if="context == 'home'">
                     <img class="workimg" v-bind:src="item.imagemobile">
                  </div>
                  <div v-else>
                     <img class="workimg" v-bind:src="item.imagemobile">
                  </div>


                </div>
    </div>
  </div>


</template>

  <script>
export default {
   props: ['context'],
    data() {
            return {
            work: [],
            }

  },


             computed: {

  filteredItems: function () {
    if (this.context == 'home') {
    return this.work.filter(function (works) {  return works});
  }
  else {
      return this.work.filter(function (works) {  return works});
  }
  },




},
  mounted() {

    self= this;
     $.ajax({
  method: "GET",
  url: "/work.json",
})
.done(function(data){
    self.work = data;
   console.log(self.work);
 // work has data!

  })
    .fail(function(xhr, status, error) {
       console.log(error)
    });

  }

    }


</script>

编辑:

一定是在 ajax 函数中使用了 this/self,因为箭头语法让它工作,这很奇怪,因为这看起来是正确的。

$.ajax({
        method: 'GET',
        url: '/work.json'
      })
      .done(data => {

        this.work = data;

      })
      .fail((xhr, status, error) => {

      })

【问题讨论】:

  • 你遇到了什么错误?
  • 模板没有渲染,因为没有数据。
  • 模板应在检索数据时呈现。这是您模板的第一行吗?带有 v-for 的 div?
  • 嗨,伯特,试过这个,但那不是因为 console.log(this.work);计算出来的“filteredItems”里面是空的。
  • 没错,它最初是空的。当你的 Ajax 完成时,它会再次被调用。

标签: ajax components vuejs2


【解决方案1】:

在请求完成之前隐藏渲染的经典方法是将isLoading 属性添加到您的data。请注意,我使用的是arrow function,因此我可以访问正确的上下文。

<template>
  <div>
    <p v-if="failed">Request failed</p>
    <p v-else-if="isLoading">Loading...</p>
    <div v-else>
      <!-- your content here -->
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      isLoading: false,
      failed: false,
      work: []
    }
  },

  mounted () {
    this.isLoading = true
    $.ajax({
      method: 'GET',
      url: '/work.json'
    })
    .done(data => {
      this.isLoading = false
      this.work = data
    })
    .fail((xhr, status, error) => {
      this.loading = false
      this.failed = true
    })
  }
}
</script>

但是,有几个问题:

  • 您是如何在您的应用中注册 jquery 的?
  • 您考虑过使用纯 XMLHttpRequest 吗?或者更好with promises
  • 您是否考虑过使用vue-resource

【讨论】:

  • 谢谢乔治,我在我的人应用程序中添加 jquery var $ = require('jquery');
  • 我会研究 vue-resource
  • @LeBlaireau 如果您对用于 Ajax 的 jquery 感到满意,则没有理由切换到 vue-resource。是的,您已经在使用 Promise。
  • 将标记它,因为它让我部分获得了解决方案! :) 我不需要 is.loading 但箭头语法做到了。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 2021-12-08
  • 2018-03-06
  • 2017-04-29
  • 1970-01-01
  • 2023-04-03
  • 2020-04-14
  • 2015-01-14
相关资源
最近更新 更多