溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

element-plus下拉框怎么實(shí)現(xiàn)全選

發(fā)布時間:2022-05-26 09:19:04 來源:億速云 閱讀:647 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要介紹“element-plus下拉框怎么實(shí)現(xiàn)全選”,在日常操作中,相信很多人在element-plus下拉框怎么實(shí)現(xiàn)全選問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”element-plus下拉框怎么實(shí)現(xiàn)全選”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

下拉框的簡單使用

使用方法還是比較簡單的

<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雙向綁定數(shù)據(jù)。而 el-option就是下拉框的選項。

import { reactive, toRefs } from "vue";

const state = reactive({
  nameList: ["clz", "czh", "ccc"],
  user: {
    name: "",
  },
});

const { nameList, user } = toRefs(state);

element-plus下拉框怎么實(shí)現(xiàn)全選

全選互斥

需求:下拉框選項中有全選以及其他項,需要實(shí)現(xiàn)點(diǎn)擊全選后不能選擇其他項,選中了其他項同樣不能選擇全選。

下拉框多選

先來簡單了解下下拉框的多選。

理論上來說,是只需要給 el-select添加上 multiple就能實(shí)現(xiàn)多選,但是效果不太好。選中的會擠在一起。

element-plus下拉框怎么實(shí)現(xiàn)全選

這個時候,我們可以添加 collapse-tags屬性,這樣子,這樣子就只會顯示一個選項,沒顯示的以數(shù)量的形式在后面。

element-plus下拉框怎么實(shí)現(xiàn)全選

再添加 collapse-tags-tooltip屬性,還能實(shí)現(xiàn),懸浮在 +X上方時,顯示全部選中的選項。

element-plus下拉框怎么實(shí)現(xiàn)全選

代碼:

<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);

全選互斥的實(shí)現(xiàn)

這個主要就是依靠 disabled屬性來實(shí)現(xiàn),只不過屬性值變成一個返回 boolean值的函數(shù)了。

  <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;
};

element-plus下拉框怎么實(shí)現(xiàn)全選

可以看到,當(dāng)綁定的 checkAge返回 true的時候,全部選項都不能選了。

明白原理后,我們便只需要理清思路就行了。

首先,我們綁定的 checkAge應(yīng)該要把選中項( item)作為參數(shù)傳給 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;
};

是不是很簡單,但是還沒完,上面那樣子還會有小問題。

element-plus下拉框怎么實(shí)現(xiàn)全選

我們什么都沒有選擇的時候,全部選項不能選。這是因為上面選擇非全部選項時的判斷,寫成了沒有選擇全部的時候,所以一開始確實(shí)沒有選擇全部,那么就不能選擇了。所以在一開始應(yīng)該判斷有沒有已經(jīng)選中的,如果沒有,就返回`` 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;
};

element-plus下拉框怎么實(shí)現(xiàn)全選

多個下拉框互斥

多個下拉框不能同時選擇同樣的選項。

  <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屬性綁定方法,把選中的值傳過去。

多個下拉框互斥的實(shí)現(xiàn)就比較簡單了,只需要遍歷選中的值,是不是等于要選的值,等于的話就禁止選擇(return true)。如果能遍歷完,即該選項沒有被其他下拉框選中過,那么就能選擇( return false)。

const checkHobby = (item) => {
  for (const hobbyKey in hobbys.value) {
    // 如果已經(jīng)有選中過該選項的下拉框,則禁止再次選擇
    if (item === hobbys.value[hobbyKey]) {
      return true;
    }
  }

  return false;
};

element-plus下拉框怎么實(shí)現(xiàn)全選

一般全選的實(shí)現(xiàn)

什么是一般全選?其實(shí)只是為了區(qū)分上面的全選互斥。就是常見的點(diǎn)擊全選復(fù)選框,就會選中全部選項。

<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);

element-plus下拉框怎么實(shí)現(xiàn)全選

這個時候,全選和下面的選項是互不關(guān)聯(lián)的,所以我們可以通過添加 change事件,但復(fù)選框狀態(tài)變化時,去修改下面的選項的選中與否。

<el-checkbox v-model="checked" @change="handleCheckAllChange" />全選
const handleCheckAllChange = () => {
  if (checked.value) {
    form.value.ages = ageList.value;
  } else {
    form.value.ages = [];
  }
};

到這一步的時候,我們就能夠做到點(diǎn)擊全選復(fù)選框,能同時修改下面選項的選中狀態(tài)了,但是,還不能實(shí)現(xiàn)選中下面全部選項時,同時修改全選復(fù)選框為選中狀態(tài)。

可以通過添加偵聽器,偵聽選中結(jié)果,如果發(fā)生變化,就會觸發(fā)偵聽器,并根據(jù)選中結(jié)果的長度和選項總長度對比。

watch(
  () => form.value.ages,
  (newValue) => {
    checked.value = newValue.length === ageList.value.length;
  }
);

element-plus下拉框怎么實(shí)現(xiàn)全選

如果想要加個中間態(tài)的話,就需要用到 element-plus復(fù)選框的 indeterminate屬性。

這時候,復(fù)選框的狀態(tài)不再是只依靠 checked了,而是 indeterminate v-model同時作用。

  • indeterminate false,v-model true時,狀態(tài)為 &radic;

  • indeterminate false,v-model false時,狀態(tài)為空

  • indeterminate true時,狀態(tài)為 -

所以要實(shí)現(xiàn)中間態(tài),只需要當(dāng)選中的選項的個數(shù)比總選項的個數(shù)少,且選中的選項的個數(shù)不為0時, indeterminate的值為 true即可。

<el-checkbox
  v-model="checked"
  :indeterminate="
    form.ages.length < ageList.length && form.ages.length !== 0
  "
  @change="handleCheckAllChange"
/>全選

到此,關(guān)于“element-plus下拉框怎么實(shí)現(xiàn)全選”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI