Elevator 电梯楼层
介绍
用于列表快速定位以及索引的显示
基础用法
html
<template>
<nut-elevator :index-list="dataList" :height="260" @click-item="clickItem" @click-index="clickIndex"></nut-elevator>
</template>
<script lang="ts">
import { reactive, toRefs } from 'vue';
export default {
setup() {
const state = reactive({
dataList: [
{
title: 'A',
list: [
{
name: '安徽',
id: 1
}
]
},
{
title: 'B',
list: [
{
name: '北京',
id: 2
}
]
},
{
title: 'G',
list: [
{
name: '广西',
id: 3
},
{
name: '广东',
id: 4
}
]
},
{
title: 'H',
list: [
{
name: '湖南',
id: 5
},
{
name: '湖北',
id: 6
}
]
}
]
});
const clickItem = (key: string, item: any) => {
console.log(key, JSON.stringify(item));
};
const clickIndex = (key: string) => {
console.log(key);
};
return { ...toRefs(state), clickItem, clickIndex };
}
};
</script>
自定义索引
html
<template>
<nut-elevator :index-list="dataList2" :height="220" :acceptKey="acceptKey" @click-item="clickItem" @click-index="clickIndex"></nut-elevator>
</template>
<script lang="ts">
import { reactive, toRefs } from 'vue';
export default {
setup() {
const state = reactive({
acceptKey: 'num',
dataList2: [
{
num: '一',
list: [
{
name: '北京',
id: 1
},
{
name: '上海',
id: 2
},
{
name: '深圳',
id: 3
},
{
name: '广州',
id: 4
},
{
name: '杭州',
id: 5
}
]
},
{
num: '二',
list: [
{
name: '成都',
id: 6
},
{
name: '西安',
id: 7
},
{
name: '天津',
id: 8
},
{
name: '武汉',
id: 9
},
{
name: '长沙',
id: 10
},
{
name: '重庆',
id: 11
},
{
name: '苏州',
id: 12
},
{
name: '南京',
id: 13
}
]
},
{
num: '三',
list: [
{
name: '西宁',
id: 14
},
{
name: '兰州',
id: 15
},
{
name: '石家庄',
id: 16
},
{
name: '秦皇岛',
id: 17
},
{
name: '大连',
id: 18
},
{
name: '哈尔滨',
id: 19
},
{
name: '长春',
id: 20
},
{
name: '太原',
id: 21
}
]
}
]
});
const clickItem = (key: string, item: any) => {
console.log(key, JSON.stringify(item));
};
const clickIndex = (key: string) => {
console.log(key);
};
return { ...toRefs(state), clickItem, clickIndex };
}
};
</script>
索引吸顶
html
<template>
<nut-elevator :index-list="dataList3" :is-sticky="true" :height="220" @click-item="clickItem" @click-index="clickIndex"></nut-elevator>
</template>
<script lang="ts">
import { reactive, toRefs } from 'vue';
export default {
setup() {
const state = reactive({
dataList3: [
{
title: 'A',
list: [
{
name: '安徽',
id: 1
}
]
},
{
title: 'B',
list: [
{
name: '北京',
id: 2
}
]
},
{
title: 'C',
list: [
{
name: '重庆',
id: 3
}
]
},
{
title: 'F',
list: [
{
name: '福建',
id: 4
}
]
},
{
title: 'G',
list: [
{
name: '广西',
id: 5
},
{
name: '广东',
id: 6
},
{
name: '甘肃',
id: 7
},
{
name: '贵州',
id: 8
}
]
},
{
title: 'H',
list: [
{
name: '湖南',
id: 9
},
{
name: '湖北',
id: 10
},
{
name: '海南',
id: 11
},
{
name: '河北',
id: 12
},
{
name: '河南',
id: 13
},
{
name: '黑龙江',
id: 14
}
]
},
{
title: 'J',
list: [
{
name: '吉林',
id: 15
},
{
name: '江苏',
id: 16
},
{
name: '江西',
id: 17
}
]
},
{
title: 'L',
list: [
{
name: '辽宁',
id: 18
}
]
}
]
});
const clickItem = (key: string, item: any) => {
console.log(key, JSON.stringify(item));
};
const clickIndex = (key: string) => {
console.log(key);
};
return { ...toRefs(state), clickItem, clickIndex };
}
};
</script>
自定义内容
html
<template>
<nut-elevator :index-list="dataList" :height="260" @click-item="clickItem" @click-index="clickIndex">
<template v-slot:default="slotProps">
<nut-icon name="jd" width="12px"></nut-icon>
<span :style="{marginLeft: '15px'}">{{ slotProps.item.name }}</span>
</template>
</nut-elevator>
</template>
<script lang="ts">
import { reactive, toRefs } from 'vue';
export default {
setup() {
const state = reactive({
dataList: [
{
title: 'A',
list: [
{
name: '安徽',
id: 1
}
]
},
{
title: 'B',
list: [
{
name: '北京',
id: 2
}
]
},
{
title: 'G',
list: [
{
name: '广西',
id: 3
},
{
name: '广东',
id: 4
}
]
},
{
title: 'H',
list: [
{
name: '湖南',
id: 5
},
{
name: '湖北',
id: 6
}
]
}
]
});
const clickItem = (key: string, item: any) => {
console.log(key, JSON.stringify(item));
};
const clickIndex = (key: string) => {
console.log(key);
};
return { ...toRefs(state), clickItem, clickIndex };
}
};
</script>
API
Props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
height | 电梯区域的高度 | number | string | 200px |
accept-key | 索引 key 值 | string | title |
index-list | 索引列表 | Array( item 需包含 id 、name 属性, name 支持传入 html 结构) | [{id: 0, name: ''}] |
is-sticky | 索引是否吸顶 | boolean | false |
space-height | 右侧锚点的上下间距 | number | 23 |
title-height | 左侧索引的高度 | number | 35 |
Slots
名称 | 说明 |
---|---|
default | 自定义左侧索引下每条数据的内容 |
Events
事件名 | 说明 | 回调参数 |
---|---|---|
click-item | 点击内容 | key: string, item: { id: 0, name: '' } |
click-index | 点击索引 | key: string |
change | 索引改变 | index: number |
Methods
方法名 | 说明 | 参数 |
---|---|---|
scrollTo | 滚动到对应索引的位置 | index:number |
主题定制
样式变量
组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件。
名称 | 默认值 |
---|---|
--nut-elevator-list-item-highcolor | var(--nut-primary-color) |
--nut-elevator-list-item-font-size | 12px |
--nut-elevator-list-item-font-color | #333333 |
--nut-elevator-list-item-name-padding | 0 20px |
--nut-elevator-list-item-name-height | 30px |
--nut-elevator-list-item-name-line-height | 30px |
--nut-elevator-list-item-code-font-size | 14px |
--nut-elevator-list-item-code-font-color | #1a1a1a |
--nut-elevator-list-item-code-font-weight | 500 |
--nut-elevator-list-item-code-padding | 0 20px |
--nut-elevator-list-item-code-height | 35px |
--nut-elevator-list-item-code-line-height | 35px |
--nut-elevator-list-item-code-after-width | 100% |
--nut-elevator-list-item-code-after-height | 1px |
--nut-elevator-list-item-code-after-bg-color | #f5f5f5 |
--nut-elevator-list-item-code-current-box-shadow | 0 3px 3px 1px rgba(240, 240, 240, 1) |
--nut-elevator-list-item-code-current-bg-color | #fff |
--nut-elevator-list-item-code-current-border-radius | 50% |
--nut-elevator-list-item-code-current-width | 45px |
--nut-elevator-list-item-code-current-height | 45px |
--nut-elevator-list-item-code-current-line-height | 45px |
--nut-elevator-list-item-code-current-position | absolute |
--nut-elevator-list-item-code-current-right | 60px |
--nut-elevator-list-item-code-current-top | 50% |
--nut-elevator-list-item-code-current-transform | translateY(-50%) |
--nut-elevator-list-item-code-current-text-align | center |
--nut-elevator-list-item-bars-position | absolute |
--nut-elevator-list-item-bars-right | 8px |
--nut-elevator-list-item-bars-top | 50% |
--nut-elevator-list-item-bars-transform | translateY(-50%) |
--nut-elevator-list-item-bars-padding | 15px 0 |
--nut-elevator-list-item-bars-background-color | #eeeff2 |
--nut-elevator-list-item-bars-border-radius | 6px |
--nut-elevator-list-item-bars-text-align | center |
--nut-elevator-list-item-bars-z-index | 1 |
--nut-elevator-list-item-bars-inner-item-padding | 3px |
--nut-elevator-list-item-bars-inner-item-font-size | 10px |
--nut-elevator-list-fixed-color | var(--nut-primary-color) |
--nut-elevator-list-fixed-bg-color | var(--nut-white) |
--nut-elevator-list-fixed-box-shadow | 0 0 10px #eee |
--nut-elevator-list-item-bars-inner-item-active-color | var(--nut-primary-color) |