考虑动态内容高度,使用vue转换平滑展开/折叠转换

问题描述 投票:1回答:1

我在vue过渡方面遇到了一些麻烦,也许你们中有些人可以帮我解决?!我想要实现的是一个使用vue过渡的简单轻量级折叠组件。

因此,在我目前的方法中,每次崩溃崩溃时,它的高度应设置为contentHeight,然后立即设置为0(以及扩展时的另一种方式)。或者在vue transition的JavaScript钩子中说话:

  • 输入前:设置高度为0
  • 输入:将高度设置为contentHeight
  • 输入后:设置高度为auto
  • 请假前:将身高设置为contentHeight
  • 离开:设置高度为0

这是目前的做法:

<template>
  <transition
    @before-enter="beforeEnter"
    @enter="enter"
    @after-enter="afterEnter"
    @before-leave="beforeLeave"
    @leave="leave"
    @after-leave="afterLeave"
  >
    <div
      v-if="isCollapsed === false"
      :style="componentStyles"
      class="UiCollapse"
    >
      <div 
        ref="content"
        class="UiCollapse-content"
      >
        <slot/>
      </div>
    </div>
  </transition>
</template>

<script>
export default {
  name: "UiCollapse",

  props: {
    isCollapsed: {
      type: Boolean,
      default: false
    }
  },

  data() {
    return {
      componentStyles: {
        height: undefined
      }
    };
  },

  methods: {
    beforeEnter() {
      this.setHeight(0);
    },

    enter() {
      this.setHeight(this.getContentHeight());
    },

    afterEnter() {
      this.setHeight(undefined);
    },

    beforeLeave() {
      this.setHeight(this.getContentHeight());
    },

    leave() {
      this.setHeight(0);
    },

    afterLeave() {
      this.setHeight(0);
    },

    setHeight(height) {
      this.componentStyles.height = height;
    },

    getContentHeight() {
      return this.$refs.content.scrollHeight + "px";
    }
  }
};
</script>

<style scoped>
.UiCollapse {
  display: block;
  height: auto;
  overflow: hidden;
}

.UiCollapse.v-enter-active,
.UiCollapse.v-leave-active {
  transition: height 0.3s ease;
}

.UiCollapse-content {
  display: block;
}
</style>

使用此方法,应考虑影响其高度的内容和内容变化的动态高度。

我还把它转移到了codeandbox:https://codesandbox.io/s/yq1nw51yq9

我在这里期望的是平滑的开启和关闭过渡(如css中所定义),但正如您在本项目中所看到的,这只是部分工作而我不明白为什么。你们有没有想法?

也许这不是正确的方法,我对替代方法或已经存在的libs持开放态度(虽然我更喜欢在这里理解vue转换),但到目前为止我找到的解决方案是使用max-height或其他变通方法的修复值。我想避免。

在此先感谢您的帮助!

javascript css vue.js vuejs2 transition
1个回答
0
投票

扩展面板组件怎么样?我不确定你真的想做什么,但它至少可以帮到你。 https://vuetifyjs.com/en/components/expansion-panels

© www.soinside.com 2019 - 2024. All rights reserved.