Плавное развертывание / свертывание с использованием vue-перехода с учетом динамической высоты содержимого - PullRequest
0 голосов
/ 04 марта 2019

У меня проблемы с переходами vue, может, некоторые из вас могут мне помочь ?!Я хочу понять, что это простой, легкий компонент свертывания, использующий vue переходы.

Поэтому в моем текущем подходе каждый раз, когда коллапс сворачивается, его высота должна быть установлена ​​в contentHeight, а затем сразу после этого0 (а также наоборот при расширении).Или говорить в JavaScript-хуках vue transition:

  • before-enter: установить высоту на 0
  • enter: установить height на contentHeight
  • after-введите: установите высоту 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>

При таком подходе следует учитывать динамические высоты содержимого и изменения содержимого, влияющие на его высоту.

Я также перенес это в коды и поле: https://codesandbox.io/s/yq1nw51yq9

То, что я ожидал бы здесь, было плавным открытием и закрытием перехода (как определено в css), но, как вы можете видеть в этом проекте, это работает только частично, и я не понимаю, почему.У кого-нибудь из вас есть идеи?

Может быть, это не правильный подход, я открыт для альтернативных подходов или уже существующих библиотек (хотя я бы предпочел понять здесь переходы vue), но решения, которые яДо сих пор было обнаружено, что используются фиксированные значения для max-height или другие обходные пути, которые я бы хотел избежать.

Заранее благодарен за помощь!

1 Ответ

0 голосов
/ 04 марта 2019

А как насчет компонента панели расширения?Я не уверен, что ты действительно хочешь сделать, но это может помочь тебе, по крайней мере.https://vuetifyjs.com/en/components/expansion-panels

...