高度为 100% 的 Vue 组件在 v-if 重新渲染时改变高度

Posted

技术标签:

【中文标题】高度为 100% 的 Vue 组件在 v-if 重新渲染时改变高度【英文标题】:Vue component with height of 100% changes height on v-if re-render 【发布时间】:2018-06-16 13:26:41 【问题描述】:

我有一个 Vue 组件,它具有类“tab-body-wrapper”,其目的是显示当前处于活动状态的任何选项卡的“插槽”。

在排除故障后,我在 CSS 中将高度设置为 100% 的“.tab-body-wrapper”组件似乎在 v-if 重新渲染期间降低了高度即使包含它的元素的高度(“.sub-menu-tabs-body”)在同一时间点保持完全相同。

我的 Vue 组件(带有“tab-body-wrapper”类)

Vue.component("tab", 
    template: `
        <div v-if="isActive"
            class="tab-body-wrapper">
            <slot></slot>
        </div>
    `,
    props: 
        name:  required: true ,
        icon:  required: true ,
        selected:  default: false 
    ,
    data() 
        return 
            isActive: false
        
    ,
    mounted() 
        this.isActive = this.selected;
    
);

下面的红色箭头显示了这个 Vue 组件在 DOM 中的位置

相关的 CSS

.sub-menu-tabs-wrapper,
.sub-menu-tabs-body,
.tab-body-wrapper 
    height: 100%;

我解决问题的方法是将以下代码放在我的其他 Vue 组件的 mount() 挂钩中,该挂钩包含在上述 Vue 组件的 中。

下面是我的另一个 Vue 组件的挂载钩子中的故障排除代码,它位于插槽中。请注意,我也使用了 getBoundingClientRect 并且结果相同,因此问题不在于 d3 .

console.log(d3.select(".sub-menu-tabs-wrapper").style("height"));
console.log(d3.select(".sub-menu-tabs-body").style("height"));
console.log(d3.select(".tab-body-wrapper").style("height"));

在初始渲染时,高度符合预期:

scripts.js:791 1207px // .sub-menu-tabs-wrapper
scripts.js:792 1153px // .sub-menu-tabs-body
scripts.js:793 1151px // .tab-body-wrapper

但是,在单击离开然后单击返回选项卡时,您可以看到包含元素(“.sub-menu-tabs-body”)保持其 1153px 的高度,但“.tab-body- wrapper" 已缩小到 574.5px。

scripts.js:791 1207px // .sub-menu-tabs-wrapper
scripts.js:792 1153px // .sub-menu-tabs-body
scripts.js:793 574.5px // .tab-body-wrapper

奇怪的是,当我之后 console.log “.tab-body-wrapper”的高度时,我得到了 1151px。

在某些情况下,我需要“.tab-body-wrapper”的高度在渲染期间正确的原因是因为我有一堆 d3 图表使用“.tab”中元素的高度和宽度-body-wrapper”在渲染期间确定它们各自的高度和宽度。因此,我遇到的问题是导致这些图表以不正确的高度和宽度呈现。

请注意,我的选项卡组件不能使用 v-show,原因我不会在此详述。

【问题讨论】:

您是否尝试过将计算包含在this.$nextTick() 中,如下所述:github.com/vuejs/Discussion/issues/394? @yuriy636 你是个传奇。这解决了我的问题。我非常感谢你 - 这个问题一直在杀死我。如果您提交您的评论作为答案,我会很乐意接受它:) 【参考方案1】:

尝试将计算封装在 this.$nextTick() 回调中。如文档所述,它将:

延迟回调在下一个 DOM 更新周期后执行

所以元素在执行时被正确渲染。

new Vue(
  el: '#app',
  data: 
    pRect: 0
  ,
  mounted() 
    this.$nextTick(() => 
      this.pRect = document.querySelector('p').getBoundingClientRect();
    )
  
)
<script src="https://unpkg.com/vue@2.5.13/dist/vue.js"></script>
<body>
  <div id="app">
    <p>My BoundingClientRect is:  pRect <p>
  </div>
</body>

【讨论】:

再次感谢您:)

以上是关于高度为 100% 的 Vue 组件在 v-if 重新渲染时改变高度的主要内容,如果未能解决你的问题,请参考以下文章

在 react-native 中将组件高度设置为 100%

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

Vue 插槽在插槽 v-if 语句启动之前加载异步组件

如何将聚合物组件的高度设置为 100%

在 Nuxt / Vue (Typescript) 中具有属性的组件 v-if 语句

vue使用v-if v-show页面闪烁,div闪现的解决方法