<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
實習確實能學到不少東西,但是學到的東西果然還是需要沉澱下來,不然後面立馬又忘記了。
使用方法還是比較簡單的
<el-select v-model="user.name" placeholder="請選擇"> <el-option v-for="item in nameList" :key="item" :label="item" :value="item"> </el-option> </el-select>
首先需要使用到 el-select
和 el-option
, el-select
就是下拉框,所以需要使用 v-model
雙向繫結資料。而 el-option
就是下拉框的選項。
import { reactive, toRefs } from "vue"; const state = reactive({ nameList: ["clz", "czh", "ccc"], user: { name: "", }, }); const { nameList, user } = toRefs(state);
需求:下拉框選項中有全選以及其他項,需要實現點選全選後不能選擇其他項,選中了其他項同樣不能選擇全選。
先來簡單瞭解下下拉框的多選。
理論上來說,是隻需要給 el-select
新增上 multiple
就能實現多選,但是效果不太好。選中的會擠在一起。
這個時候,我們可以新增 collapse-tags
屬性,這樣子,這樣子就只會顯示一個選項,沒顯示的以數量的形式在後面。
再新增 collapse-tags-tooltip
屬性,還能實現,懸浮在 +X
上方時,顯示全部選中的選項。
程式碼:
<el-select v-model="form.ages" placeholder="請選擇" multiple collapse-tags collapse-tags-tooltip > <el-option v-for="item in ageList" :key="item" :label="item" :value="item" ></el-option> </el-select>
import { reactive, toRefs } from "vue"; const state = reactive({ ageList: ["全部", 19, 20, 21, 22], form: { ages: [], }, }); const { ageList, form } = toRefs(state);
這個主要就是依靠 disabled
屬性來實現,只不過屬性值變成一個返回 boolean
值的函數了。
<el-select v-model="form.ages" placeholder="請選擇" multiple collapse-tags collapse-tags-tooltip > <el-option v-for="item in ageList" :key="item" :label="item" :value="item" :disabled="checkAge" ></el-option> </el-select>
const checkAge = () => { return true; };
可以看到,當繫結的 checkAge
返回 true
的時候,全部選項都不能選了。
明白原理後,我們便只需要理清思路就行了。
首先,我們繫結的 checkAge
應該要把選中項( item
)作為引數傳給 checkAge
,這樣子才能得到選中的項。
接著,就是思路了。我們禁選的情況就兩種:
全部
,此時禁選非全部的選項
非全部的選項
,此時禁選全部
也就是說,只有這兩個情況返回 true
,其他時候返回 false
const checkAge = (item) => { if (form.value.ages.includes("全部") && item !== "全部") { // 選擇了`全部`,此時禁選`非全部的選項` return true; } else if (!form.value.ages.includes("全部") && item === "全部") { // 選擇了`非全部的選項`,此時`禁選全部` return true; } return false; };
是不是很簡單,但是還沒完,上面那樣子還會有小問題。
我們什麼都沒有選擇的時候,全部選項
不能選。這是因為上面選擇非全部選項時的判斷,寫成了沒有選擇全部
的時候,所以一開始確實沒有選擇全部
,那麼就不能選擇了。所以在一開始應該判斷有沒有已經選中的,如果沒有,就返回`` false`
const checkAge = (item) => { if (form.value.ages.length === 0) { return false; } if (form.value.ages.includes("全部") && item !== "全部") { return true; } else if (!form.value.ages.includes("全部") && item === "全部") { return true; } return false; };
多個下拉框不能同時選擇同樣的選項。
<el-select v-model="hobbys.hobby1" placeholder="請選擇愛好"> <el-option v-for="item in hobbyList" :key="item" :label="item" :value="item" :disabled="checkHobby(item)" ></el-option> </el-select>
有三個上面的下拉框,依次是 hobby1
, hobby2
, hobby3
import { reactive, toRefs } from "vue"; const state = reactive({ hobbyList: ["聽歌", "動漫", "前端"], hobbys: { hobby1: "", hobby2: "", hobby3: "", }, }); const { hobbyList, hobbys } = toRefs(state);
老樣子,通過給 disabled
屬性繫結方法,把選中的值傳過去。
多個下拉框互斥的實現就比較簡單了,只需要遍歷選中的值,是不是等於要選的值,等於的話就禁止選擇(return true
)。如果能遍歷完,即該選項沒有被其他下拉框選中過,那麼就能選擇( return false
)。
const checkHobby = (item) => { for (const hobbyKey in hobbys.value) { // 如果已經有選中過該選項的下拉框,則禁止再次選擇 if (item === hobbys.value[hobbyKey]) { return true; } } return false; };
什麼是一般全選?其實只是為了區分上面的全選互斥。就是常見的點選全選核取方塊,就會選中全部選項。
<el-select v-model="form.ages" placeholder="請選擇" multiple collapse-tags collapse-tags-tooltip > <el-checkbox v-model="checked" />全選 <el-option v-for="item in ageList" :key="item" :label="item" :value="item" ></el-option> </el-select>
import { reactive, toRefs } from "vue"; const state = reactive({ ageList: [19, 20, 21, 22], form: { ages: [], }, checked: false, }); const { ageList, form, checked } = toRefs(state);
這個時候,全選和下面的選項是互不關聯的,所以我們可以通過新增 change
事件,但核取方塊狀態變化時,去修改下面的選項的選中與否。
<el-checkbox v-model="checked" @change="handleCheckAllChange" />全選
const handleCheckAllChange = () => { if (checked.value) { form.value.ages = ageList.value; } else { form.value.ages = []; } };
到這一步的時候,我們就能夠做到點選全選核取方塊,能同時修改下面選項的選中狀態了,但是,還不能實現選中下面全部選項時,同時修改全選核取方塊為選中狀態。
可以通過新增偵聽器,偵聽選中結果,如果發生變化,就會觸發偵聽器,並根據選中結果的長度和選項總長度對比。
watch( () => form.value.ages, (newValue) => { checked.value = newValue.length === ageList.value.length; } );
如果想要加個中間態的話,就需要用到 element-plus
核取方塊的 indeterminate
屬性。
這時候,核取方塊的狀態不再是隻依靠 checked
了,而是 indeterminate
和 v-model
同時作用。
indeterminate
為 false
,v-model
為 true
時,狀態為 √
indeterminate
為 false
,v-model
為 false
時,狀態為空indeterminate
為 true
時,狀態為 -
所以要實現中間態,只需要當選中的選項的個數比總選項的個數少,且選中的選項的個數不為0時, indeterminate
的值為 true
即可。
<el-checkbox v-model="checked" :indeterminate=" form.ages.length < ageList.length && form.ages.length !== 0 " @change="handleCheckAllChange" />全選
到此這篇關於element-plus 下拉框實現全選的範例程式碼的文章就介紹到這了,更多相關element-plus 下拉框全選內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45