【问题标题】:How can I call a method after the loops(more than 1 loop) complete on vue js?如何在 vue js 上的循环(超过 1 个循环)完成后调用方法?
【发布时间】:2017-12-26 01:23:37
【问题描述】:

我的 vue 组件是这样的:

<template>
    <div class="row">
        <div class="col-md-3" v-for="item1 in items1">
            ...
        </div>
        <div class="col-md-3" v-for="item2 in items2">
            ...
        </div>
        <div class="col-md-3" v-for="item3 in items3">
            ...
        </div>
    </div>
</template>
<script>
    export default {
        ...
        computed: {
            items1() {
                const n = ... // this is object
                return n
            },
            items2() {
                const n = ... // this is object
                return n
            },
            items3() {
                const n = ... // this is object
                return n
            }
        },
        ...
    }
</script>

如果三个循环完成,我想调用一个方法

所以方法在三个循环完成的时候执行

我该怎么做?

【问题讨论】:

  • 你为什么会想要这样的东西?你不应该让演示文稿控制任何东西,它是相反的!

标签: vue.js vuejs2 vue-component vuex


【解决方案1】:

正如承诺的那样,这是示例。

var counter = 0

const vm = new Vue({
  el: '#app',

  computed: {
    items1() {
      return {item1: 'value1', item2: 'value2'}
    },
    items2() {
      return {item1: 'value3', item2: 'value4'}
    },
    items3() {
      return {item1: 'value5', item2: 'value6'}
    }
  },

  methods: {
    callback() {
      counter++
      console.log('v-for loop finished')
      var numberOfLoops = 3
      if (counter >= numberOfLoops) {
        console.log('All loops have finished executing.')
        counter = 0
      }
    }
  },

  directives: {
    forCallback(el, binding, vnode) {
      let element = binding.value
      var key = element.key
      var len = 0

      if (Array.isArray(element.array)) {
        len = element.array.length
      }

      else if (typeof element.array === 'object') {
        var keys = Object.keys(element.array)
        key = keys.indexOf(key)
        len = keys.length
      }

      if (key == len - 1) {
        if (typeof element.callback === 'function') {
          (element.callback.bind(vnode.context))()
        }
      }
    }
  },

})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>

<div id="app">
  <div class="row">
    <div class="col-md-3" v-for="(item, key) in items1" v-for-callback="{key: key, array: items1, callback: callback}">
      ...
    </div>

    <div class="col-md-3" v-for="(item, key) in items2" v-for-callback="{key: key, array: items2, callback: callback}">
      ...
    </div>

    <div class="col-md-3" v-for="(item, key) in items3" v-for-callback="{key: key, array: items3, callback: callback}">
      ...
    </div>
  </div>
</div>

【讨论】:

  • 完美...我忘记了重新渲染,,,,我的错误,感谢您指出...+1 :)
  • @VamsiKrishna 我的荣幸 :)
  • @Ikbel,我使用export default{...},就像我在问题上的代码一样。我把这个var counter = 0放在哪里?
  • @TrendingNews 查看我编辑的答案。而不是在您的 vue 实例之外定义 counter 。使用 mounted 回调在 Vue 中创建它,而不使其反应。这应该是一个更好的解决方案。
  • @Ikbel,好的。谢谢。我尝试这样:&lt;script&gt; let counter = 0 export default { ... } &lt;/script。我也工作。
猜你喜欢
  • 2017-12-25
  • 1970-01-01
  • 2020-09-24
  • 2014-12-14
  • 2019-03-06
  • 2021-10-15
  • 2017-12-14
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多