ADD scSelectFilter 分类筛选器 组件

This commit is contained in:
sakuya 2022-05-27 00:23:30 +08:00
parent 09ecd7fed7
commit e2505cbfb3
3 changed files with 308 additions and 1 deletions

View File

@ -0,0 +1,125 @@
<!--
* @Descripttion: 分类筛选器
* @version: 1.0
* @Author: sakuya
* @Date: 2022年5月26日15:59:52
* @LastEditors:
* @LastEditTime:
-->
<template>
<div class="sc-select-filter">
<div v-if="data.length<=0" class="sc-select-filter__no-data">
暂无数据
</div>
<div v-for="item in data" :key="item.key" class="sc-select-filter__item">
<div class="sc-select-filter__item-title" :style="{'width':labelWidth+'px'}"><label>{{item.title}}</label></div>
<div class="sc-select-filter__item-options">
<ul>
<li :class="{'active':selected[item.key]&&selected[item.key].includes(option.value)}" v-for="option in item.options" :key="option.value" @click="select(option, item)">
<el-icon v-if="option.icon"><component :is="option.icon" /></el-icon>
<span>{{option.label}}</span>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
data: { type: Array, default: () => [] },
selectedValues: { type: Object, default: () => { return {} } },
labelWidth: {type: Number, default: 80},
outputValueTypeToArray: { type: Boolean, default: false }
},
data() {
return {
selected: {}
}
},
watch:{
data(val) {
val.forEach(item => {
this.selected[item.key] = this.selectedValues[item.key] || [item.options[0].value]
})
}
},
computed: {
selectedString() {
var outputData = JSON.parse(JSON.stringify(this.selected))
for (var key in outputData) {
outputData[key] = outputData[key].join(",")
}
return outputData
}
},
mounted() {
//
this.data.forEach(item => {
this.selected[item.key] = this.selectedValues[item.key] || [item.options[0].value]
})
},
methods: {
select(option, item){
//
if(item.multiple){
//
if(option.value === item.options[0].value){
//
this.selected[item.key] = [option.value]
}else{
//
if(this.selected[item.key].includes(option.value)){
//
this.selected[item.key].splice(this.selected[item.key].findIndex(s => s === option.value), 1)
//
if(this.selected[item.key].length == 0){
this.selected[item.key] = [item.options[0].value]
}
}else{
//
this.selected[item.key].push(option.value)
//
if(this.selected[item.key].includes(item.options[0].value)){
this.selected[item.key].splice(this.selected[item.key].findIndex(s => s === item.options[0].value), 1)
}
}
}
}else{
//
if(!this.selected[item.key].includes(option.value)){
this.selected[item.key] = [option.value]
}else{
return false
}
}
this.change()
},
change(){
if(this.outputValueTypeToArray){
this.$emit('onChange', this.selected)
}else{
this.$emit('onChange', this.selectedString)
}
}
}
}
</script>
<style scoped>
.sc-select-filter {width: 100%;}
.sc-select-filter__item {display: flex;}
.sc-select-filter__item-title {width: 80px;}
.sc-select-filter__item-title label {font-size: 14px;padding-top:13px;display: inline-block;color: #999;}
.sc-select-filter__item-options {flex: 1;border-bottom: 1px dashed var(--el-border-color-light);}
.sc-select-filter__item-options ul {display: flex;flex-wrap: wrap;padding-top: 10px;}
.sc-select-filter__item-options li {list-style: none;cursor: pointer;height:28px;padding:0 15px;border-radius:32px;margin: 0 10px 10px 0;display: flex;align-items: center;background: var(--el-color-primary-light-9);}
.sc-select-filter__item-options li .el-icon {margin-right: 3px;font-size: 16px;}
.sc-select-filter__item-options li:hover {color: var(--el-color-primary);}
.sc-select-filter__item-options li.active {background: var(--el-color-primary);color: #fff;font-weight: bold;}
.sc-select-filter__item:last-of-type .sc-select-filter__item-options {border: 0;}
.sc-select-filter__no-data {color: #999;}
</style>

View File

@ -9,6 +9,9 @@
<el-tab-pane label="已完成" name="4"></el-tab-pane> <el-tab-pane label="已完成" name="4"></el-tab-pane>
</el-tabs> </el-tabs>
</el-header> </el-header>
<el-header style="height: auto;">
<sc-select-filter :data="filterData" :label-width="80" @on-change="filterChange"></sc-select-filter>
</el-header>
<el-header> <el-header>
<div class="left-panel"> <div class="left-panel">
<el-button type="primary" icon="el-icon-plus"></el-button> <el-button type="primary" icon="el-icon-plus"></el-button>
@ -44,11 +47,95 @@
</template> </template>
<script> <script>
import scSelectFilter from '@/components/scSelectFilter'
export default { export default {
name: 'listTab', name: 'listTab',
components: {
scSelectFilter
},
data() { data() {
return { return {
groupId: "1", groupId: "0",
filterData: [
{
title: "所属行业",
key: "type",
multiple: true,
options: [
{
label: "全部",
value: ""
},
{
label: "汽车",
value: "1"
},
{
label: "大健康",
value: "2"
},
{
label: "节能环保",
value: "3"
},
{
label: "智能信息",
value: "4"
},
{
label: "文化旅游",
value: "5"
},
{
label: "新材料",
value: "6"
},
{
label: "高端装备",
value: "7"
},
{
label: "其他行业",
value: "99"
}
]
},
{
title: "所属区域",
key: "area",
options: [
{
label: "全部",
value: ""
},
{
label: "华东",
value: "HD"
},
{
label: "华北",
value: "HB"
},
{
label: "华南",
value: "HN"
},
{
label: "华中",
value: "HZ"
},
{
label: "华西南",
value: "HXN"
},
{
label: "东北",
value: "DB"
}
]
}
],
list: { list: {
apiObj: this.$API.demo.list apiObj: this.$API.demo.list
}, },
@ -68,6 +155,9 @@
groupId: name groupId: name
} }
this.$refs.table.reload(params) this.$refs.table.reload(params)
},
filterChange(data){
this.$refs.table.upData(data)
} }
} }
} }

View File

@ -0,0 +1,92 @@
<template>
<el-main>
<el-card shadow="never" header="分类筛选器">
<sc-select-filter :data="data" :selected-values="selectedValues" :label-width="80" @on-change="change"></sc-select-filter>
</el-card>
<el-card shadow="never" header="返回值" style="margin-top: 15px;">
<pre>{{ filterData }}</pre>
</el-card>
</el-main>
</template>
<script>
import scSelectFilter from '@/components/scSelectFilter'
export default {
name: 'selectFilter',
components: {
scSelectFilter
},
data() {
return {
data: [
{
title: "状态(单)",
key: "state",
options: [
{
label: "全部",
value: ""
},
{
label: "待审核",
value: "1",
icon: "el-icon-flag"
},
{
label: "已退回",
value: "2",
icon: "el-icon-bottom-left"
},
{
label: "已关闭",
value: "3",
icon: "el-icon-circle-close"
},
{
label: "已完成",
value: "4",
icon: "el-icon-checked"
}
]
},
{
title: "类型(多)",
key: "type",
multiple: true,
options: [
{
label: "全部",
value: ""
},
{
label: "请假申请",
value: "1"
},
{
label: "加班申请",
value: "2"
}
]
}
],
selectedValues: {
state: [""],
type: [""]
},
filterData: {}
}
},
mounted() {
},
methods: {
change(selected){
this.filterData = selected
}
}
}
</script>
<style>
</style>