【问题标题】:Vue infinite doesn't load data properlyVue无限无法正确加载数据
【发布时间】:2020-02-18 08:59:31
【问题描述】:

我正在尝试使用 Vue-infinite-loading 获取我的数据,但它没有正确返回数据

代码

Component html

<div class="col-md-3 mb-3" v-for="product in products" :key="product.slug" :offset="1">
.. get name, image, etc.
</div>

<infinite-loading
  slot="append"
  @infinite="infiniteHandler"
  spinner="waveDots"
  @distance="1"
  force-use-infinite-wrapper=".el-table__body-wrapper">
</infinite-loading>

component script

export default {
    props:['currency', 'user'],
    name: "home",
    data() {
        return {
            page: 1,
            showModal: false,
            products: [],
            currentItem: {},
        }
    },
    methods: {
        infiniteHandler($state) {
            console.log('page', this.page);
            axios.get('/api/products?page='+this.page)
            .then(({ data }) => {
                console.log('My page data', data)
                if (data.data.length > 0) {
                    this.page += 1;
                    this.products.push(data.data);
                    $state.loaded();
                } else {
                    $state.complete();
                }
            });

            console.log('LOADING')
        },
        setCurrentItem: function(item) {
            this.currentItem = item
        },
    }
}

截图

知道是什么导致了这个问题吗?

更新

Demo

new Vue({
  el: "#app",
  props:['currency', 'user'],
    name: "home",
    data() {
        return {
            page: 1,
            showModal: false,
            products: [
              {
                name: "p1"
              },
              {
                name: "p2"
              },
              {
                name: "p3"
              }
            ],
            currentItem: {},
        }
    },
    methods: {
        infiniteHandler($state) {
            console.log('page', this.page);
            axios.get('http://www.mocky.io/v2/5e4baed83100005700d8b6fe?page='+this.page)
            .then(({ data }) => {
                console.log('My page data', data)
                if (data.data.length > 0) {
                    this.page += 1;
                    this.products.push(data.data);
                    $state.loaded();
                } else {
                    $state.complete();
                }
            });

            console.log('LOADING')
        },
        setCurrentItem: function(item) {
            this.currentItem = item
        },
    }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vue-infinite-loading@2.4.4/dist/vue-infinite-loading.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js"></script>


<div id="app">
  <div class="col-md-3 mb-3" v-for="product in products" :key="product.slug" :offset="1">
    {{product.name}}
  </div>

  <infinite-loading slot="append" @infinite="infiniteHandler" spinner="waveDots" @distance="1" force-use-infinite-wrapper=".el-table__body-wrapper">
  </infinite-loading>
</div>

【问题讨论】:

    标签: javascript laravel vue.js vuejs2


    【解决方案1】:

    codesandbox DEMO

    您的代码很好,但有两个注释。首先,您应该使用https 而不是http 以避免阻塞“mixed content”并正确地从 mocky.io 下载数据。其次,您需要使用this.products.push(...data.data); 而不是this.products.push(data.data);,因为在这种情况下,products 将是一个数组数组,而不是一个对象数组(这正是您所期望的)。

    <template>
      <div id="app">
        <div
          class="col-md-3 mb-3"
          v-for="product in products"
          :key="product.slug"
          :offset="1"
        >{{product.name}}</div>
    
        <infinite-loading
          slot="append"
          @infinite="infiniteHandler"
          spinner="waveDots"
          @distance="1"
          force-use-infinite-wrapper=".el-table__body-wrapper"
        ></infinite-loading>
      </div>
    </template>
    
    <script>
    import axios from "axios";
    
    export default {
      name: "App",
      data() {
        return {
          page: 1,
          products: [],
          currentItem: {}
        };
      },
      methods: {
        infiniteHandler($state) {
          console.log(this.products);
          console.log("page", this.page);
          axios
            .get(
              "https://www.mocky.io/v2/5e4baed83100005700d8b6fe?page=" + this.page
            )
            .then(({ data }) => {
              console.log("My page data", data);
              if (data.data.length > 0) {
                this.page += 1;
                this.products.push(...data.data);
                $state.loaded();
              } else {
                $state.complete();
              }
            });
    
          console.log("LOADING");
        }
      }
    };
    </script>
    
    <style>
    #app {
      font-family: "Avenir", Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>
    

    【讨论】:

    • 您好,感谢您的回答,目前不在系统后面测试您的代码(将很快)。同时(...data.data) 是真的吗?还是只是一个占位符?我很好奇!?
    • 是的,它是一个真实的东西,叫做Spread Syntax developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 并且push 可以接收多个这样的参数arr.push(element1[, ...[, elementN]])
    • 感谢您的信息,我会尝试您的代码并告诉您。
    • 是的,三点使它起作用:) 非常感谢
    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多