v-if 每个组件加载时

Posted

技术标签:

【中文标题】v-if 每个组件加载时【英文标题】:v-if per component when loaded 【发布时间】:2019-07-13 05:58:43 【问题描述】:

目前,我正在将一些组件加载到一个更大的网格组件中(只是一个用于分组和显示子组件的组件)。

我想根据对象数据“featureButtonLink”是否为“''”来显示/隐藏按钮。 (如果不相等,则显示按钮)。

问题是,我不确定切换 v-if 的逻辑应该在子组件上,还是在数组本身所在的“网格”组件上。

这是我的代码示例 -

在子组件上:

<div v-if="link">
<h1>button here</h1>
</div>

<script>
export default 
    name: 'FeatureWork',
    props: [
        'featureTitle', 'featureDescription', 'featureImage', 'featureClass', 'featureButtonLink', 'featureButtonText',
    ],

    data () 
        return 
            link: false
        
    ,

    computed: 
        linkCheck: function() 
            if (this.featured.id.featureButtonLink != '') 
                this.link = true
                return this.link
            
        
    


</script>

并且,这是我的“网格”组件(我正在使用 v-for + 数组数据加载子组件的组件,其中的值内部称为“featureButtonLink”):

<template>
<div class="feature-work-row card-hover" :class="featureClass">
<div class="work-wrapper">
<!-- <div class="project-tags">
<p class="p-small text-weight-semi">Web Design</p>
<p class="p-small text-weight-semi">Web Design</p>
</div> -->



<div class="columns">
<div class="content">
<h4 class="text-weight-bold"> featureTitle </h4>
<p class="p-small text-color-regblue"> featureDescription </p>


<div class="button-container btn-main">
<router-link :to="featureButtonLink"><p class="p-small text-weight-semi"> featureButtonText </p></router-link>
</div>

<div v-if="link">
<h1>hey there</h1>
</div>
</div>

<div class="image">
<div class="image-wrapper">
<img :src="featureImage">
</div>

</div>
</div>



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

<script>
export default 
name: 'FeatureWork',
props: [
'featureTitle', 'featureDescription', 'featureImage', 'featureClass', 'featureButtonLink', 'featureButtonText',
],

data () 
return 
link: false

,

computed: 
linkCheck: function() 
if (this.featured.id.featureButtonLink != '') 
this.link = true
return this.link





</script>

或者,我猜另一个问题可能是......

如何从加载数据的组件中更改子组件的布尔值。

我的子组件使用“父”组件上的数组加载到 v-if 中。 如何将数据“true”传递回我的子组件,以决定是否在该按钮上显示(或不显示)按钮(同时使用 v-if)。

【问题讨论】:

为什么要计算 link 数据项和 linkCheck 而不仅仅是计算 link 【参考方案1】:

computed 的意义在于缓存您的数据,但您使用它的方式需要调用它。

这里有一些选项...

1 使用computed

按预期使用计算,通过返回值:

    data () 
        return 
    ,

    computed: 
        link: function() 
            return this.featured.id.featureButtonLink != '';
        
    

2 使用watch

    data () 
        return 
            link: false
        
    ,

    watch: 
      featured:
        immediate: true
        handler: function(val) 
            if (val.id.featureButtonLink != '') 
                this.link = true
                return this.link
            
        
      
    

3 使用mounted生命周期钩子

如果 prop 没有更改,则基于传递的 prop 值一次性渲染,则使用计算的没有什么好处。相反,您可以只使用 mounted 生命周期挂钩,这将使其仅在挂载时运行。这意味着它不会对值的变化做出反应,所以我不会展示这个例子。

【讨论】:

并且,这应该在子组件上进行,还是在通过数组呈现组件的组件上进行?而且,如果它应该显示在任何一个上,我如何将数据传递给每个组件? (例如,通过 props 使用 v-bind 传递要在子组件上显示的其他数据)如何将内容传递到子组件的数据中? 这应该在孩子身上完成,将数据作为道具传递给孩子使用propvuejs.org/v2/guide/components-props.html

以上是关于v-if 每个组件加载时的主要内容,如果未能解决你的问题,请参考以下文章

解决vue项目首页加载过慢的情况

显示异步 Vue 2 组件的加载微调器

你有对 Vue 项目进行哪些优化?

vue更新或者重新加载组件方法

包含 Vue.js v-if 和 v-for 指令的 HTML 标签在加载时闪烁

使用element ui tabs组件切换时踩到的坑