自己实现一个折叠面板

216 阅读1分钟

image.png

  const transitionStyle = '0.3s height ease-in-out';
  const Transition = {
    beforeEnter(el) {
      el.style.transition = transitionStyle;
      if (!el.dataset) el.dataset = {};
 
      el.style.height = 0;
    },
 
    enter(el) {
      if (el.scrollHeight !== 0) {
        el.style.height = `${el.scrollHeight}px`;
      } else {
        el.style.height = '';
      }
      el.style.overflow = 'hidden';
    },
 
    afterEnter(el) {
      el.style.transition = '';
      el.style.height = '';
    },
 
    beforeLeave(el) {
      if (!el.dataset) el.dataset = {};
      el.style.display = 'block'; // 添加这一行
      el.style.height = `${el.scrollHeight}px`;
      el.style.overflow = 'hidden';
    },
 
    leave(el) {
      if (el.scrollHeight !== 0) {
        el.style.transition = transitionStyle;
        el.style.height = 0;
      }
    },
 
    afterLeave(el) {
      el.style.transition = '';
      el.style.height = '';
    },
  };
 
  export default {
    name: 'CollapseTransition',
    functional: true,
    render(h, { children }) {
      const data = {
        on: Transition,
      };
      return h('transition', data, children);
    },
  };
  //页面
  import CollapseTransition from "../commer/collapse-transition";
export default {
  components: {
    CollapseTransition,
  },
  <div v-for="(item, i) in list" :key="i" class="item">
      <div class="item-name" @click="change(item, true)">
        <div>{{ item.name }}</div>
        <div>
          {{ item.count }}
          <Icon type="ios-arrow-forward" v-if="!item.isExtend" />
          <Icon type="ios-arrow-down" v-else />
        </div>
      </div>
      <CollapseTransition>
        <div class="process" ref="child" v-show="item.isExtend">
          <!-- 需要折叠的一些内容啦啦啦啦 需要折叠的一些内容啦啦啦啦
          需要折叠的一些内容啦啦啦啦 -->
          <Circle
            :size="250"
            :trail-width="4"
            :stroke-width="5"
            :percent="75"
            stroke-linecap="square"
            stroke-color="#43a3fb"
          >
            <div class="demo-Circle-custom">
              <h1>42,001,776</h1>
              <p>消费人群规模</p>
              <span>
                总占人数
                <i>75%</i>
              </span>
            </div>
          </Circle>
        </div>
      </CollapseTransition>
    </div>
    
    list: [
        {
          id: 1,
          name: "hsfhfhfkhf",
          count: 255,
          isExtend: false,
        },
        {
          id: 2,
          name: "hsfhfhfkhf",
          count: 255,
          isExtend: false,
        },
        {
          id: 3,
          name: "hsfhfhfkhf",
          count: 255,
          isExtend: false,
        },
        {
          id: 4,
          name: "hsfhfhfkhf",
          isExtend: false,
        },
        {
          id: 5,
          name: "hsfhfhfkhf",
          count: 255,
          isExtend: false,
        },
      ],
       change(item, type) {
      this.list.forEach((x) => {
        if (x.id === item.id) {
          if (!x.isExtend) {
            x.isExtend = true;
          } else {
            x.isExtend = false;
          }
        } else {
          x.isExtend = false;
        }
      });
    },