Vue實(shí)現(xiàn)多標(biāo)簽選擇器
本文實(shí)例為大家分享了Vue實(shí)現(xiàn)多標(biāo)簽選擇器展示的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)效果

實(shí)現(xiàn)代碼
<html lang="en">
<head>
<title>Document</title>
<!-- 引入本地組件庫(kù) -->
<link rel="stylesheet" href="static/element-ui/index.css" >
<script src="static/element-ui/vue.js"></script>
<script src="static/element-ui/index.js"></script>
<!-- 引入CDN樣式 -->
<!-- <link rel="stylesheet" > -->
<!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> -->
<!-- <script src="https://unpkg.com/element-ui/lib/index.js"></script> -->
<style>
.not-active {
display: inline-block;
font-size: 12px;
margin: 5px 8px;
}
span {
margin: 0 2px;
}
</style>
</head>
<body>
<div id="app">
<!-- 待選標(biāo)簽 -->
<div v-for='(category, categoryIndex) in categories' :key="category.id">
<!-- 分類(lèi) -->
<span class="not-active">{{category.name}}:</span>
<template>
<span v-if="category.count"class="not-active" @click="clearCategory(category, categoryIndex)"> 不限</span>
<my-tag v-else>不限</my-tag>
</template>
<!-- 標(biāo)簽 -->
<template v-for='(child, childIndex) in category.children'>
<my-tag v-if="child.active" :closable='true' @click-child='clickChild(category, categoryIndex, child, childIndex)'>
{{ child.name }}
</my-tag>
<span v-else class="not-active" @click='clickChild(category, categoryIndex, child, childIndex)'>{{ child.name }}</span>
</template>
</div>
<!-- 已選標(biāo)簽 -->
<div v-if='conditions.length'>
<span class="not-active" @click="clearCondition">清空已選:<span>
<el-tag
v-for='(condition, index) in conditions'
:key="condition.id"
type="primary"
:closable="true"
size="small"
:disable-transitions="true"
@close='removeCondition(condition, index)'
@click='removeCondition(condition, index)'>
{{condition.name}}
</el-tag>
</div>
</div>
<script src="./data.js"></script>
<script>
// 簡(jiǎn)單封裝一個(gè)公用組件
Vue.component('my-tag', {
template: "<el-tag v-bind='$attrs' v-on='$listeners' effect='dark' size='small' :disable-transitions='true' @click='clickChild' @close='clickChild'><slot></slot></el-tag>",
methods: {
clickChild() {
this.$emit("click-child")
}
}
});
var app = new Vue({
el: '#app',
data() {
return {
categories, // 分類(lèi)標(biāo)簽,可從外部加載配置
conditions: [] // 已選條件
}
},
watch: {
// 監(jiān)聽(tīng)條件變化,按照請(qǐng)求接口拼裝請(qǐng)求參數(shù)
conditions(val){
let selectedCondition = {};
for(let categorie of this.categories){
let selected_list = [];
for(let child of categorie.children){
if(child.active){
selected_list.push(child.name);
}
}
selectedCondition[categorie.name] = selected_list.join("|")
}
console.log(selectedCondition);
}
},
methods: {
// 處理標(biāo)簽點(diǎn)擊事件,未選中則選中,已選中則取消選中
clickChild(category, categoryIndex, child, childIndex) {
let uid = `${categoryIndex}-${childIndex}`
child.uid = uid;
console.log(uid)
// 取消選擇
if (child.active === true) {
category.count--;
child.active = false;
this.conditions.forEach((conditionChild, index) => {
if (conditionChild.uid === child.uid) {
this.conditions.splice(index, 1);
}
});
// 選擇
} else {
category.count++;
child.active = true;
this.conditions.push(child);
}
},
// 清除已選整個(gè)類(lèi)別標(biāo)簽
clearCategory(category, categoryIndex) {
category.count = 0;
// 可選列表均為未選中狀態(tài)
category.children.forEach(child => {
child.active = false;
})
// 清空該類(lèi)已選元素
for (let index = this.conditions.length - 1; index >= 0; index--) {
const conditionChild = this.conditions[index];
if (conditionChild.uid.startsWith(categoryIndex)) {
this.conditions.splice(index, 1);
}
}
},
// 移除一個(gè)條件
removeCondition(condition, index) {
let categoryIndex = condition.uid.split("-")[0];
this.categories[categoryIndex].count --;
this.conditions.splice(index, 1)
condition.active = false;
},
// 清空所有條件
clearCondition() {
for(let i = this.conditions.length-1; i >=0 ; i--){
this.removeCondition(this.conditions[i], i);
}
}
}
});
</script>
</body>
</html>
標(biāo)簽篩選的數(shù)據(jù)格式
data.js
var categories = [{
name: '品牌',
count: 0,
children: [{
name: '聯(lián)想',
}, {
name: '小米',
}, {
name: '蘋(píng)果',
}, {
name: '東芝',
}]
}, {
name: 'CPU',
count: 0,
children: [{
name: 'intel i7 8700K',
}, {
name: 'intel i7 7700K',
}, {
name: 'intel i9 9270K',
}, {
name: 'intel i7 8700',
}, {
name: 'AMD 1600X',
}]
}, {
name: '內(nèi)存',
count: 0,
children: [{
name: '七彩虹8G',
}, {
name: '七彩虹16G',
}, {
name: '金士頓8G',
}, {
name: '金士頓16G',
}]
}, {
name: '顯卡',
count: 0,
children: [{
name: 'NVIDIA 1060 8G',
}, {
name: 'NVIDIA 1080Ti 16G',
}, {
name: 'NVIDIA 1080 8G',
}, {
name: 'NVIDIA 1060Ti 16G',
}]
}]
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue使用動(dòng)畫(huà)實(shí)現(xiàn)滾動(dòng)表格效果
這篇文章主要為大家詳細(xì)介紹了vue使用動(dòng)畫(huà)實(shí)現(xiàn)滾動(dòng)表格效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Vue單頁(yè)應(yīng)用引用單獨(dú)的樣式文件的兩種方式
這篇文章給大家介紹Vue單頁(yè)應(yīng)用如何引用單獨(dú)的樣式文件,本文以css文件為例,通過(guò)兩種方式給大家介紹的非常詳細(xì),需要的朋友參考下吧2018-03-03
Vue項(xiàng)目實(shí)現(xiàn)token無(wú)感刷新的示例代碼
最近在使用系統(tǒng)的過(guò)程中,業(yè)務(wù)人員反饋剛登錄一會(huì)就提示token過(guò)期需要重新登錄,所以本文為大家分享一個(gè)無(wú)感刷新的實(shí)現(xiàn)代碼,需要的可以參考下2023-07-07
Vue源碼學(xué)習(xí)之?dāng)?shù)據(jù)初始化
這篇文章主要為大家介紹了Vue源碼學(xué)習(xí)之?dāng)?shù)據(jù)初始化實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
vue 登錄滑動(dòng)驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要介紹了vue 登錄滑動(dòng)驗(yàn)證實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
Vue中的數(shù)據(jù)監(jiān)聽(tīng)和數(shù)據(jù)交互案例解析
這篇文章主要介紹了Vue中的數(shù)據(jù)監(jiān)聽(tīng)和數(shù)據(jù)交互案例解析,在文章開(kāi)頭部分先給大家介紹了vue中的數(shù)據(jù)監(jiān)聽(tīng)事件$watch,具體代碼講解,大家可以參考下本文2017-07-07
Vue cli+mui 區(qū)域滾動(dòng)的實(shí)例代碼
下面小編就為大家分享一篇Vue cli+mui 區(qū)域滾動(dòng)的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01

