vue2.0 自定义 折叠列表(Accordion)组件
1.自定义 折叠列表
Accordion.vue
(1)sass 版本
<!-- 折叠列表 组件 -->
<template>
<nav :class="$style.accWrapper">
<div :class="$style.accTitle" @click="toggleList">
<span>{{ title.area }}</span>
<span>当前人数:{{ title.num }}人</span>
<span>总人数:{{ title.sum }}人</span>
<img
src="../assets/img/arrow_right.png"
alt="chevron"
:class="[{ [$style.open_menu]: isDisplay, [$style.close_menu]: !isDisplay }, $style.accChevron]"
/>
</div>
<ul :class="[{ [$style.maxHeight]: isDisplay }, $style.accList]">
<li :class="$style.accListItem" v-for="item in list">
<span>{{ item.area }}</span>
<span>当前人数:{{ item.num }}人</span>
<span>总人数:{{ item.sum }}人</span>
</li>
</ul>
</nav>
</template> <script>
export default {
data () {
return {
isDisplay: false
}
},
props: {
title: {
type: Object,
default(){
return {}
}
},
list: {
type: Array,
required: true
}
},
methods: {
toggleList () {
this.isDisplay = !this.isDisplay
}
}
}
</script> <style lang="scss" module>
.accWrapper {
display:flex;
flex-direction: column;
}
.accTitle {
display: flex;
justify-content: space-between;
align-items: baseline;
height: 50px;
line-height: 50px;
font-size: 16px;
background: #eee;
text-indent: 1em;
cursor: pointer;
}
.accChevron {
width: 20px;
margin-right: 15px;
}
.accList{
list-style: none;
padding: 0;
margin: 0;
font-size: 16px;
overflow: hidden;
max-height: 0;
transition: max-height .5s ease-out;
}
.accList.maxHeight {
max-height: 500px;
transition: max-height .5s ease-in;
}
.accListItem {
background-image: url(../assets/img/arrow_right.png);
background-repeat: no-repeat;
background-size: 20px 20px;
background-position: 95% 50%;
display: flex;
// justify-content: space-between;
align-items: baseline;
height: 50px;
line-height: 50px;
font-size: 16px;
text-indent: 1em;
cursor: pointer;
}
/* chevron animation */
@keyframes open-menu {
to {
transform: rotate(90deg);
}
}
@keyframes close-menu {
from {
transform: rotate(90deg);
}
to {
transform: rotate(0deg);
}
}
.open_menu {
animation: open-menu 0.4s ease-out forwards;
}
.close_menu {
animation: close-menu 0.4s ease-out forwards;
}
</style>
(2)less 版本
<!-- 折叠列表 组件 -->
<template>
<nav class="accWrapper">
<div class="accTitle" @click="toggleList">
<span>{{ title.area }}</span>
<span>当前人数:{{ title.num }}人</span>
<span>总人数:{{ title.sum }}人</span>
<img
src="../assets/img/arrow_right.png"
alt="chevron"
:class="['accChevron', { 'open_menu': isDisplay, 'close_menu': !isDisplay }]"
/>
</div>
<ul :class="['accList', { 'maxHeight': isDisplay }]">
<li class="accListItem" v-for="item in list">
<span>{{ item.area }}</span>
<span>当前人数:{{ item.num }}人</span>
<span>总人数:{{ item.sum }}人</span>
</li>
</ul>
</nav>
</template> <script>
export default {
data () {
return {
isDisplay: false
}
},
props: {
title: {
type: Object,
default(){
return {}
}
},
list: {
type: Array,
required: true
}
},
methods: {
toggleList () {
this.isDisplay = !this.isDisplay
}
}
}
</script> <style lang="less" scoped>
.accWrapper {
display:flex;
flex-direction: column;
}
.accTitle {
display: flex;
justify-content: space-between;
align-items: baseline;
height: 50px;
line-height: 50px;
font-size: 16px;
background: #eee;
text-indent: 1em;
cursor: pointer;
}
.accChevron {
width: 20px;
margin-right: 15px;
}
.accList{
list-style: none;
padding: 0;
margin: 0;
font-size: 16px;
overflow: hidden;
max-height: 0;
transition: max-height .5s ease-out;
}
.accList.maxHeight {
max-height: 500px;
transition: max-height .5s ease-in;
}
.accListItem {
background-image: url(../assets/img/arrow_right.png);
background-repeat: no-repeat;
background-size: 20px 20px;
background-position: 95% 50%;
display: flex;
// justify-content: space-between;
align-items: baseline;
height: 50px;
line-height: 50px;
font-size: 16px;
text-indent: 1em;
cursor: pointer;
}
/* chevron animation */
@keyframes open-menu {
to {
transform: rotate(90deg);
}
}
@keyframes close-menu {
from {
transform: rotate(90deg);
}
to {
transform: rotate(0deg);
}
}
.open_menu {
animation: open-menu 0.4s ease-out forwards;
}
.close_menu {
animation: close-menu 0.4s ease-out forwards;
}
</style>
2.页面调用
Fold.vue
<!-- 折叠列表 -->
<template>
<div>
<!-- 标题栏 -->
<mt-header title="折叠列表">
<router-link to="/" slot="left">
<mt-button icon="back">返回</mt-button>
</router-link>
</mt-header>
<!-- 列表 -->
<accordion
v-for="(item,index) in dataList"
:key="item.id"
:title="item"
:list="item.child">
</accordion>
</div>
</template> <script>
import Accordion from '../components/Accordion' export default {
name: 'Fold',
components: {
Accordion,
},
data(){
return {
dataList:[
{"area":"深圳","num":"10","sum":"30","child":[
{"area":"罗湖","num":"20","sum":"20"},
{"area":"福田","num":"20","sum":"20"},
{"area":"南山","num":"20","sum":"20"}
]},
{"area":"广州","num":"10","sum":"30","child":[
{"area":"白云","num":"20","sum":"20"},
{"area":"福田","num":"20","sum":"20"},
{"area":"南山","num":"20","sum":"20"}
]}
]
}
}
}
</script> <style lang="scss" scoped>
//
</style>
3.效果图

vue2.0 自定义 折叠列表(Accordion)组件的更多相关文章
- vue2.0 自定义 提示框(Toast)组件
1.自定义 提示框 组件 src / components / Toast / index.js /** * 自定义 提示框( Toast )组件 */ var Toast = {}; var sho ...
- [js高手之路]Vue2.0基于vue-cli+webpack父子组件通信教程
在git命令行下,执行以下命令完成环境的搭建: 1,npm install --global vue-cli 安装vue命令行工具 2,vue init webpack vue-demo 使用v ...
- 采用Vue2.0开发的分页js组件
2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...
- CKEditor5 + vue2.0 自定义图片上传、highlight、字体等用法
因业务需求,要在 vue2.0 的项目里使用富文本编辑器,经过调研多个编辑器,CKEditor5 支持 vue,遂采用.因 CKEditor5 文档比较少,此处记录下引用和一些基本用法. CKEdit ...
- vue2.0项目 calendar.js(日历组件封装)
最近一直闲来无事,便寻思着做一下自己的个人项目,也想说能使用现在比较流行的一些mvvm框架来做,于是就选用了这样的一个技术栈vue2.0+vue-router+vuex+webpack来做,做得也是多 ...
- vue2.0自定义指令
前面一片文章说了vue2.0过滤器,其实自定义指令跟过滤器非常相似,单就定义方式而言,其与过滤器完全一致,分为局部指令,和全局指令.不过就是filter改为directive的区别. 过滤器一般用于对 ...
- vue2.0 自定义 图片上传(UpLoader)组件
1.自定义组件 UpLoader.vue <!-- 上传图片 组件 --> <template> <div class="vue-uploader"& ...
- vue2.0 自定义 弹窗(MessageBox)组件
组件模板 src/components/MessageBox/index.vue <!-- 自定义 MessageBox 组件 --> <template> <div c ...
- vue2.0 自定义 饼状图 (Echarts)组件
1.自定义 图表 组件 Echarts.vue <!-- 自定义 echart 组件 --> <template> <div> <!-- echart表格 ...
随机推荐
- java环境配置classpath和path变量的作用及设置方法
1.path:指定cmd中命令执行文件所在的路径.比如javac.java两个可执行文件在jdk的bin目录下,如果path值含有这个bin目录,在cmd下执行这两个命令的时候就会到path指定的目录 ...
- 算法golang篇
1.slice反转,偏移 func reverse(s []int) { , len(s) - ; i < j; i, j = i+, j- { s[i], s[j] = s[j], s[i] ...
- bootstrap 中dropmenu不起作用
今天在使用bootstrap发现dropmenu一直不起作用,代码是从官网拷贝过来. 网上查找可以用的页面进行一点点的去除分析,发现竟然是顺序反了导致的. 在使用dropmenu时需要引入jquery ...
- iOS--------对堆、栈 存储空间的理解
Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就 ...
- 【Luogu】P2607骑士(基环树DP)
题目链接 这题……好吧我比着题解打的 题解连接 #include<cstring> #include<cstdio> #include<cstdlib> #incl ...
- BZOJ-2829 信用卡凸包
凸包题. 我们先把所有信用卡的四个定点的坐标求出来,然后计算凸包长度,最后加上一个圆的周长就行. #include <cstdlib> #include <cstdio> #i ...
- BZOJ1856 [SCOI2010]生成字符串 【组合数】
题目 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求 ...
- linux下安装firefox
首先检查系统有没有安装:rpm -qa|grep firefox 如果有安装,先删掉rpm -e * firefox不同版本下载:http://liulanmi.com/firefox 具体方法如下: ...
- c++函数学习-关于c++函数的林林总总
本文是我在学习c++过程中的一些思考和总结,主要是c++中关于函数的林林总总.欢迎大家批评和指正,共同学习. os version: ubuntu 12.04 LTS gcc version: gcc ...
- linux环境内存分配原理 mallocinfo【转】
转自:http://www.cnblogs.com/dongzhiquan/p/5621906.html Linux的虚拟内存管理有几个关键概念: Linux 虚拟地址空间如何分布?malloc和fr ...