VueJS组件不会渲染,直到我在Vue Devtools中单击它

ATL*_*ris 6 vue.js vuejs2 vue-devtools

我在博客后端的一个部分(而不是SPA)上使用VueJS 2.5.3进行API调用以检查附加到帖子的特色图像.

如果找到一个,它使用子组件来显示图像.问题是在API调用成功后子组件没有呈现,因此图像对象也没有传递给它.

正如您在此GIF中看到的那样,子组件未呈现<!---->,我v-if在其上检查图像是否存在.但是,如果我单击Vue DevTools中的子组件,子组件将呈现并按预期显示图像.

我的问题是为什么只有在Vue Devtools中点击它后,子组件才会呈现?当您单击某个组件时,Vue Devtools会触发某种事件吗?

这是子组件:

<template>
    <div v-if="showImage" class="featured-image-container" :class="[ size ]">
        <img :src="processedSrc" alt="Featured Image">
    </div>
</template>

<script>
export default {
    props: {
        image: {
            type: Object
        },
        size: {
            type: String,
            required: true
        }
    },
    data () {
        return {
            showImage: false
        }
    },
    computed: {
        processedSrc: function () {
            if (this.image && typeof this.image === 'object') {
                this.showImage = true
                return this.image.sizes[this.size].file
            } else {
                this.showImage = false
            }
        }
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

这里是父代组件和子组件代码的链接:

tha*_*ksd 10

问题出在您的PostFeaturedImage.vue组件中.您依赖于计算值processedSrc来设置数据属性showImage.

但是,showImage最初是falsev-if在根元素的指令中使用它.这意味着Vue不会渲染该元素或其中的<img>元素.

Vue中的计算属性是延迟加载的,这意味着在引用它们之前不会调用它们的函数.由于processedSrc计算属性仅在<img>元素上被引用(并且由于该元素未被呈现),因此不会调用其方法,这意味着该showImage属性永远不会被设置为true.

但是,当您在Vue DevTools中检查组件时,它会列出所有计算属性,这意味着processedSrc将调用计算器的方法,并showImage在该情况下设置属性.


对你的问题最简单的解决方案是使用v-show而不是v-if,因为一个内部的元素v-show将被隐藏但仍然呈现即使值是false.

但是,我几乎从不建议根据计算属性的函数内的逻辑设置数据属性的值.它会产生意想不到的,难以调试的副作用,从而导致像您目前遇到的问题.

我建议showImage根据当前在processedSrc计算方法中确定其值的逻辑,使您的属性成为计算属性.然后,您可以确定是否尝试根据值processedSrc计算计算值showImage.

computed: {
  showImage: function() {
    return this.image && typeof this.image === 'object';
  },
  processedSrc: function () {
    if (this.showImage) {
      return this.image.sizes[this.size].file;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,可以更轻松地查看影响内容的内容,并且您的代码更易于维护.

  • 是的.确实如此.计算属性的基本思想是根据依赖的Vue实例属性计算并返回一个值.所以Vue假设你从不尝试访问计算属性,运行该方法计算值没有意义.但是,如果您正在弯曲计算属性的意图(通过设置其他属性,发出事件或进行api调用等),如果永远不会访问计算属性,则会得到一些意外结果(或者如果你不期望它被访问,就像在使用Vue DevTools检查时那样). (3认同)
  • 那么DevTools实际上是否会触发计算机属性?在调试时,这是否会导致一些奇怪的事情? (2认同)
  • 感谢关于Vue Devtools的解释以及关于调整我如何使用计算属性的提示. (2认同)