小实例: 用vue实现手风琴效果

目标: 通过手风琴的小实例,了解vue的父子组件的事件传递方式(其中一种)。vue实例唯一标识_uid的实际使用。

建议阅读时间: 3分钟

手风琴,涉及到两个组件,<collapse><collapse-item>, 要实现的功能无非两点:

  1. 点击子组件<collapse-item>的时候,父组件要知道点了谁
  2. 父亲通知自己的所有子组件,A组件被点击了,B、C...子元素的content全部隐藏

小知识: 每个Vue实例都会有一个递增的id,可以通过this._uid获取

代码实现:

1. 定义一个父组件Collpase,实现以下功能

  1. 挂载cut方法,传入被点击的实例的Id, 遍历子组件,确认是谁被点击了
  2. 没有被点击的子组件,其show属性置位false
// 引入vue
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
// 定义个父组件collapse
Vue.component('Collapse', {
  methods: {
    cut(childId) {
      this.$children.forEach(child => {
        console.log('ci', child._uid)
        if(child._uid !== childId) {
          child.show = false;
        }
      });
    }
  },
  template: `<div class="wrap">
      <slot></slot>
    </div>`
})

复制代码

2. 定义一个子组件CollpaseItem,实现以下功能

  1. 接受一个tile,作为标题
  2. data中维护一个show属性,控制content的显示隐藏
  3. 当title被点击的时候,通过this.$parent调用父组件的cut方法,传入当前被点击的实例的_uid
  4. 置当前的组件show属性为true
Vue.component('CollapseItem', {
  props: ['title'],
  data() {
    return {show: false}
  },
  methods: {
    change() {
      console.log(this._uid)
      this.$parent.cut(this._uid);
      this.show = !this.show;
    }
   },
   template: `<div>
      <div class="title" @click="change">{{title}}</div>
      <div v-show="show">
        <slot></slot>  
      </div>
    </div>`
})
复制代码

3. 实例挂载,Dom渲染,完成。

<div id="app">
<collapse>
  <collapse-item title="react">内容1</collapse-item>
  <collapse-item title="vue">内容2</collapse-item>
  <collapse-item title="nodejs">内容2</collapse-item>
</collapse>
</div>
<script>
let vm = new Vue({
  el: '#app'
})
</script>
复制代码

感谢阅读!

我是海明月,前端小学生。

转载于:https://juejin.im/post/5cda9a086fb9a032076c2a1a

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一个流行的JavaScript框架,可以用于构建Web应用程序。要实现侧边栏手风琴效果,可以使用Vue的transition组件来实现动画效果,以及vue-router来管理路由。 下面是一个简单的侧边栏手风琴效果的代码示例: ``` <template> <div class="sidebar"> <ul> <li v-for="(item, index) in menuItems" :key="index" :class="{ active: activeIndex === index }" @click="toggleItem(index)"> <div class="title">{{ item.title }}</div> <transition name="slide"> <ul v-show="activeIndex === index"> <li v-for="(subItem, subIndex) in item.subItems" :key="subIndex">{{ subItem }}</li> </ul> </transition> </li> </ul> </div> </template> <script> export default { data() { return { menuItems: [ { title: '菜单1', subItems: ['子菜单1', '子菜单2', '子菜单3'] }, { title: '菜单2', subItems: ['子菜单4', '子菜单5', '子菜单6'] }, { title: '菜单3', subItems: ['子菜单7', '子菜单8', '子菜单9'] }, ], activeIndex: null, }; }, methods: { toggleItem(index) { if (this.activeIndex === index) { this.activeIndex = null; } else { this.activeIndex = index; } }, }, }; </script> <style scoped> .sidebar { width: 200px; } .title { cursor: pointer; } ul { list-style: none; padding: 0; } li { border-bottom: 1px solid #ddd; } .active .title { background-color: #ddd; } .slide-enter-active, .slide-leave-active { transition: all 0.3s ease-out; } .slide-enter, .slide-leave-to { height: 0; overflow: hidden; } </style> ``` 在这个示例中,我们使用了一个包含菜单项和子菜单项的数组来生成侧边栏。我们使用v-for指令来循环渲染每个菜单项,并使用v-show指令根据当前激活的索引来显示或隐藏子菜单项。我们还使用了Vue的transition组件来添加动画效果,并通过activeIndex来跟踪当前激活的菜单项。 希望这可以帮助您了解如何使用Vue实现侧边栏手风琴效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值