自定义封装手风琴组件

为了项目使用手风琴组件,自定义封装并传值

  <template>
  <div class="Accordion">
    <!-- Accordion Title -->
    <div class="AccordionTitle">
      <div
        class="AccordionTitleL LEFTTEXT"
        v-text="AccordionData"
        v-show="isSlotSecond != 2"
      ></div>
      <div class="AccordionTitleL LEFTTEXT" v-show="isSlotSecond == 2">
        <slot name="Second"></slot>
      </div>
      <div class="ClickArea" @click="Shrink">
        <img
          v-show="isShrink == true"
          src="../assets/images/add.png"
          class="AccordionTitleR LEFTTEXT"
        />
        <img
          v-show="isShrink == false"
          src="../assets/images/reduce.png"
          class="AccordionTitleR LEFTTEXT"
        />
        <span class="fr wrongNum">错{{ wrongNum }}题</span>
      </div>
    </div>
    <div class="AccordionBody" ref="AccordionBody">
      <!-- 接受slot的容器 -->
      <div class="ContentA">
        <slot name="First">
          <span class="xian"></span>
        </slot>
        <p class="isshrink" v-show="isShrink"></p>
      </div>
    </div>
  </div>
</template>
  <script>
/**
 * Accordionindex   控制某一个展开收缩
 * AccordionData    左上角标题的文字
 * isSlotSecond     决定显示那个插槽 first or second
 * wrongNum         标题上的错题数
 */ 
export default {
  props: ["AccordionData", "Accordionindex", "isSlotSecond", "wrongNum"],
  data() {
    return {
      RightContent: "",
      isshow: this.Accordionindex,
      isShrink: true,
    };
  },
  methods: {
    Shrink() {
      let AllHiden = this.$refs.AccordionBody;
      let eleMoreHeight = AllHiden.childNodes[0].offsetHeight - 20;
      AllHiden.style.height = eleMoreHeight + "px";
      setTimeout(() => {
        if (this.isshow == 0) {
          console.log(AllHiden.childNodes[0].offsetHeight);
          AllHiden.style.height = eleMoreHeight + "px";
          this.isshow = 1;
          this.isShrink = false;
        } else {
          AllHiden.style.height = "0px";
          this.isshow = 0;
          this.isShrink = true;
        }
      }, 1);
    },
  },
};
</script>
<style scoped>
.Accordion {
  width: 100%;
  height: auto;
  box-shadow: 0px 2px 16px 0px rgb(153 153 153 / 30%);
  margin: 10px 0px;
}
.AccordionTitle {
  width: 100%;
  height: 1rem;
  background: #e4eaec;
  padding: 0px 0.2rem 0px 0.7rem;
  display: flex;
  position: relative;
}
.AccordionBody {
  position: relative;
  height: auto;
  overflow: hidden;
  height: 0px;
  -webkit-transition: height 0.6s;
  -moz-transition: height 0.6s;
  -o-transition: height 0.6s;
  transition: height 0.6s;
}
.AccordionTitleL {
  float: left;
  font-size: 14px;
  background: #e4eaec;
  margin-left: 0.16rem;
}
.AccordionTitleR {
  position: absolute;
  left: 0.4rem;
  top: 0.36rem;
  width: 0.27rem;
  height: 0.27rem;
  font-size: 12px;
  color: #518bdc;
}
.LEFTTEXT {
  line-height: 50px;
}
.ClickArea {
  flex: 1;
}
.isshrink {
  width: 100%;
  height: 20px;
}
.baseInformation li {
  border-top: 1px solid #efefef;
  line-height: 1.07rem;
  text-indent: 10px;
  position: relative;
  margin-left: 0.43rem;
}
.baseInformation li p {
  font-size: 0.26rem;
  text-indent: 0.45rem;
}
.baseInformation li::after {
  content: "";
  display: block;
  width: 0.17rem;
  height: 0.17rem;
  border-radius: 50%;
  border: 1px solid #666666;
  position: absolute;
  top: 40%;
  left: -0.02rem;
  z-index: 99;
  overflow: hidden;
  background-color: #fff;
}
.FundMangerDetail {
  /* padding: 0px 20px 0px 20px; */
  background-color: #fff;
}
.AccordionTitle {
  background-color: #fff;
}
.AccordionTitleL {
  background-color: #fff;
}
.wrongNum {
  font-size: 0.24rem;
  font-family: PingFang SC;
  font-weight: 500;
  color: #666666;
  line-height: 0.9rem;
}
</style>
	

引用组件:

<template>
  <div>
    <van-nav-bar
      title="我的错题-章节练习"
      left-arrow
      @click-left="onClickLeft"
      :border="false"
    >
    </van-nav-bar>
    <div class="FundMangerDetail">
      <div
        class="baseBox W100 BGCW MT20"
        v-for="(item, index) in baseInformation"
        :key="index"
      >
        <!-- 引用你的组件 -->
        <collapes
          class="rightFixed0"
          :Accordionindex="0"
          :isSlotSecond="0"
          :AccordionData="item.name"
          :wrongNum="item.num"
        >
          <div class="baseInformation" slot="First">
            <!-- 放入你要插入到内容 -->
            <li v-for="(items, ind) in item.show" :key="ind">
              <p @click="goMsg()">
                <span class="xian"></span>{{ items.name1 }}
                <span class="twoWrongNum fr">{{items.twoWrongNum}}></span>
              </p>
            </li>
          </div>
        </collapes>
      </div>
    </div>
  </div>
</template>
<script>
import collapes from "@/components/collapes.vue";
export default {
  components: {
    collapes,
    // baseInformation,
  },
  data() {
    return {
      bodyScroll: "",
      baseInformation: [
        {
          name: "生物化学",
          id: 1,
          num:10,
          show: [
            {
              name1: "第一节  蛋白质的结构与功能",
              twoWrongNum:30
            },
          ],
        },
        {
          name: "生理学",
          id: 2,
          num:10,
          show: [
            {
              name1: "第二节  核酸的结构与功能",
              twoWrongNum:30
            },
          ],
        },
        {
          name: "医学微生物学",
          id: 3,
          num:10,
          show: [
            {
              name1: "第二节  核酸的结构与功能",
              twoWrongNum:30
            },
          ],
        },
        {
          name: "小儿麻痹",
          id: 4,
          num:10,
          show: [
            {
              name1: "第三节  酶",
              twoWrongNum:30
            },
            {
              name1: "第四节  糖代谢",
              twoWrongNum:30
            },
            {
              name1: "第五节  生物氧化",
              twoWrongNum:30
            },
            {
              name1: "第五节  生物氧化",
              twoWrongNum:30
            },
            {
              name1: "第五节  生物氧化",
              twoWrongNum:30
            },
          ],
        },
        {
          name: "医学免疫学",
          id: 5,
          num:10,
          show: [
            {
              name1: "第一节  蛋白质的结构与功能",
              twoWrongNum:30
            },
          ],
        },
        {
          name: "病理学",
          id: 5,
          num:10,
          show: [
            {
              name1: "第一节  蛋白质的结构与功能",
              twoWrongNum:30
            },
          ],
        },
      ],
    };
  },
  mounted() {},
  methods: {
    goMsg() {
      this.$router.push('/questionMsg')
    },
    onClickLeft() {
      this.$router.go(-1)
    },
  },
};
</script>
<style  lang="scss" scoped>
.FundMangerDetail{
  background-color: #fff;
  .AccordionTitle{
    background-color: #fff;
    .AccordionTitleL {
      background-color: #fff;
    }
  }
}
.twoWrongNum{

font-size: .24rem;
font-family: PingFang SC;
font-weight: 500;
color: #666666;
margin-right: .3rem;
}
</style>


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值