【问题标题】:I get error in console when use "v-if" directive. Infinite loop使用“v-if”指令时,控制台出现错误。无限循环
【发布时间】:2018-07-20 21:02:06
【问题描述】:

当我使用 v-if 后,我在控制台中收到 [Vue 警告],不知道如何解决这个问题。 [Vue 警告]:组件渲染函数中可能存在无限更新循环。

<template>
  <div class="example-component">
      <div class="spinner-box" v-if="loadComplete = !loadComplete">
        <div class="spinner-inner">
          <i class="fas fa-circle-notch fa-spin"></i>
        </div>
      </div>
  </div>
</template>

<script>
export default {
  name: 'ExampleComponent',
  data () {
    return {
      loadComplete: false
    }
  }
</script>

【问题讨论】:

  • 注意:我只需要在从firebase获取数据之前制作预加载器,也许有其他解决方案并且不需要使用v-if或其他任何东西

标签: vue.js compiler-errors vuejs2 syntax-error warnings


【解决方案1】:

只是为了澄清无限更新循环的来源。

v-if="loadComplete = !loadComplete" 是一个赋值,您将值 !loadComplete 分配给 loadComplete。每当你在 Vue 中分配一个变量时,它都会触发一个新的渲染,并且在下一次渲染时它会再次执行相同的分配......这会导致无限循环。

@PaulTsai 举了一个很好的例子,使用正确的方法v-if="!loadComplete"

【讨论】:

  • 感谢您的反馈,我很感激。可惜我不能投票,因为我的声望不到 15。
  • 别着急,继续吧:)
【解决方案2】:

改变

v-if="loadComplete = !loadComplete"

v-if="!loadComplete"

例子

https://2ozkjp4vyp.codesandbox.io/

<template>
    <div id="app">
        <img width=200 src="./assets/logo.png">
        <div class="loader" v-if="!loadComplete"></div>
        <div v-else>
            <p>asynchronous data from firebase</p>
            <button @click="loadDataFromFirebase">Reload</button>
        </div>
    </div>
</template>

<script>
    export default {
    name: 'app',
        data: () => ({
            loadComplete: false
        }),
        mounted () {
            this.loadDataFromFirebase()
        },
        methods: {
            loadDataFromFirebase () {
                this.loadComplete = false
                setTimeout(() => {
                    this.loadComplete = true
                }, 1000)
            }
        }
  }
</script>

【讨论】:

  • 感谢您的回答,但这里不工作。我想解释一下我想做什么,也许有其他方法可以解决这个问题。在从我的 firebase 获取数据之前,我想在我的投资组合中制作一些预加载器(微调器),并且我想做一些我以前在 jQuery 或 JS 上做的事情。例如,我提供以下函数: $(window).on('load', function () { var body = $('body'); body.removeClass('loaded'); });我不知道也许我用错了东西来做到这一点。有什么想法吗?
  • 我添加一个例子。检查一下,希望对您有所帮助
  • 哇,我也试过了,但没有 setTimeout,非常感谢你帮助我,并解决了这个问题。这是一个非常有用的例子,我赌的不仅仅是我自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多