Vue.js学习笔记(四)组件递归封装——无限级折叠面板

封装无限级折叠面板


前言

由于vant 2 组件的折叠面板原有的样式和操作二次封装不符合我的需求(反正我没写出来),因此手写一个可以无限级展开的折叠面板,特此记录学习封装递归组件。


一、递归组件是什么?

其实递归组件就是自己反复调用自己。

二、案例

代码如下(示例):使用技术栈vue 2 + 组件库 vant 2

组件效果图

1.布局和样式

主要使用栅格布局,不使用组件库的话自己用div写也可。

<template>
  <div class="collspseBox">
    <van-row class="collspse_item" v-for="(item, index) in  data " :key="index" @click.stop="open(item, index)">
      <van-col span="21" class="title">{{ item.name }}</van-col>
      <van-col span="3" class="icon"><van-icon :name="item.active ? 'arrow-down' : 'arrow'" color="#878D99" /></van-col>
      <van-col span="24" class="content" v-if="item.children && item.children.length > 0"
        :style="{ height: item.active ? 'auto' : '0' }">
        <RecursiveCollapse :data="item.children" />
      </van-col>
    </van-row>
  </div>
</template>

样式使用scss预处理器,按项目需求更换。

<style lang="scss" scoped>
.collspseBox {
  padding: 14px 10px;

  .collspse_item {
    background-color: #fff;
    padding: 15px 12px;
    border-radius: 8px;
    overflow: hidden;
    margin-bottom: 10px;
    box-shadow: 0 0px 6px rgba(100, 101, 102, 0.1);

    .icon {
      text-align: right;
    }

    .title {
      font-size: 16px;
      color: #2F3541;
      white-space: nowrap;
      text-wrap: nowrap;
      word-break: keep-all;
      overflow: hidden;
      text-overflow: ellipsis;
      font-weight: bold;
      font-family: "PingFang SC";
    }

    .content {
      transition: all .5s;

      .collspseBox {
        padding: 0;

        .collspse_item {
          padding: 16px 0 0 12px;
          margin-bottom: 0;
          box-shadow: none;

          .title {
            font-size: 14px;
            color: #2F3541;
            font-family: "PingFang SC";
            font-weight: 400;
            position: relative;
            padding-left: 5px;
          }

          .title::before {
            content: '';
            position: absolute;
            top: calc(50% - 1px);
            left: 0;
            width: 2px;
            height: 2px;
            background-color: #2F3541;
            border-radius: 2px;
          }
        }
      }
    }
  }

}

</style>

2.实例操作

代码如下(示例):

<script>
export default {
  name: "RecursiveCollapse",
   /** 需要传进来的参数 */
  props: {
    data: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      activeNames: ['1'],
      active: false,
    };
  },
  components: {
  },
  methods: {
    open(item, index) {
      /** 有下一级则继续展开,否则跳转详情 */
      if (item.children && item.children.length > 0) {
        /** 给当前 item 增加一个状态 */
        this.$set(this.data[index], 'active', !this.data[index].active);
      } else {
       /** 这里的逻辑按需求修改 */
        this.$router.push('/subjectTwo/' + item.id );
      }

    }
  }
};
</script>

3.引用组件

<template>
<div>
<RecursiveCollapse v-if="data" :data="data.menus" />
</div>
</template>
<script>
 /** 导入组件 */
import RecursiveCollapse from "@/components/RecursiveCollapse";
export default {
  name: "SubjectOne",
   /** 导入组件 */
  components: {
    RecursiveCollapse
  },
  data() {
    return {
      data:[]
    }
  },
}
</script>

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了递归组件的基本实现,仅供学习参考。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js允许您封装可重用的组件并在应用程序中多次使用它们。以下是单独封装和引用Vue组件的基本步骤: 1. 创建组件 使用Vue.js创建一个组件。您可以将其放在一个单独的文件中,并通过导出来暴露组件。例如,假设您正在创建一个名为"MyComponent"的组件。可以创建一个名为"MyComponent.vue"的文件,并使用以下代码: ``` <template> <div> <!-- 组件内容 --> </div> </template> <script> export default { name: 'MyComponent', // 组件的逻辑 } </script> <style> /* 可选的组件样式 */ </style> ``` 2. 导入组件组件导入到您的应用程序中。在Vue.js中,您可以使用import语句从文件中导入组件。在您的Vue应用程序中使用以下代码: ``` import MyComponent from './MyComponent.vue'; export default { name: 'App', components: { MyComponent } } ``` 3. 使用组件 在您的应用程序中使用组件。一旦将组件导入到应用程序中,您可以在应用程序的模板中使用它。例如,在App.vue中,您可以使用以下代码: ``` <template> <div> <my-component></my-component> </div> </template> <script> import MyComponent from './MyComponent.vue'; export default { name: 'App', components: { MyComponent } } </script> <style> /* 可选的样式 */ </style> ``` 在上面的示例中,您可以看到在模板中使用`<my-component>`标签来使用组件。该标签会自动渲染"MyComponent"组件的内容。 注意,您需要在组件的定义中设置正确的名称,以便在使用组件时引用它。在上面的示例中,组件名称为"MyComponent",因此您可以在模板中使用`<my-component>`标记。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值