溫馨提示×

溫馨提示×

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

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

Vue3中無法為el-tree-select設(shè)置反選問題怎么解決

發(fā)布時間:2023-04-28 10:43:17 來源:億速云 閱讀:116 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Vue3中無法為el-tree-select設(shè)置反選問題怎么解決”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Vue3中無法為el-tree-select設(shè)置反選問題怎么解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

  環(huán)境:Vue3.2、Element Plus

  問題:子組件 setting.vue => 彈窗組件 Dialog => 樹選擇組件el-tree-select ,無法設(shè)置默認(rèn)選中項 default-checked-keys

  場景:在一個后臺系統(tǒng)的列表頁,選中一行數(shù)據(jù),點擊設(shè)置按鈕,分配一些功能。這里的做法是把設(shè)置頁封裝在一個子組件里了,并且子組件里使用了Element Plus的Dialog組件

               然后Dialog里有個el-tree-select需要初始化賦值,因為在分配之前,可能之前分配過,需要設(shè)置反選

  最開始是直接寫死,如下:

<template>
  <el-tree-select

    :data="store().UserMenus"

:default-expanded-keys="['xxxxxxxx']" 
  />
</template>

  然后發(fā)現(xiàn)不生效,周五的時候也能猜到原因,data綁定的pinia全局狀態(tài)里的值,組件被實例化時這個值可能還未被加載,所以設(shè)置default-expanded-keys時它就找不到節(jié)點數(shù)據(jù),等組件被創(chuàng)建后,data有值了,但是default-expanded-keys又不會再重新設(shè)置了,就造成組件有下拉數(shù)據(jù),但是沒有反選效果。

  起初以為是個簡單問題,于是動了動腦子,既然和順序有關(guān),那自然考慮到生命周期了,于是在setting.vue里加上onMounted,并在這里重新賦值:

// script ts
const list = ref()
const selectArr = ref<string[]>([])
onMounted(() => {
  list.value = store().UserMenus
  selectArr.value = ['xxxxxxxx']
})
 
// setting.vue
<template>
  <el-tree-select 
    :data="list"
    :default-expanded-keys="selectArr" 
  />
</template>

  data綁定list這個變量,default-expanded-keys綁定selectArr。嗯,以為可以了,結(jié)果還是沒有反選成功。就.....離譜~

  正常來講onMounted函數(shù)已經(jīng)是組件創(chuàng)建完畢并創(chuàng)建Dom了,這個時候我應(yīng)該可以設(shè)置list的值,再設(shè)置selectArr。但實際依然沒有反選成功。

  這說明加載依然存在問題,抱著研究的心態(tài),于是我又想起一種方法,我可以通過調(diào)用el-tree-select的API來通過方法設(shè)置它的默認(rèn)值,也就是setCheckedKeys方法!

  通過模板引用,獲取到el-tree-select,命名為tree,然后回到onMounted里打?。篶onsole.log(tree.value),好家伙,居然是個undefined,這說明在settting.vue的onMounted根本就無法設(shè)置選中的keys。然后詭異的是,在我反復(fù)修改代碼的時候,由于熱重載,Vue頁面會隨之更新,居然能反選上了!但是我一刷新,反選立刻失效。enmmmm ..... 基本能定位到問題的所在了,onMounted是無法獲取到組件的,后面試了一下onUnmounted,這個可以,但是我這是初始化邏輯,不可能寫在onUnmounted里。

  這里面還存在一個因素導(dǎo)致該問題的產(chǎn)生,就是Dialog默認(rèn)是不顯示的,通過v-model="dialogVisible"綁定的變量控制顯示隱藏,初始化值為false也是導(dǎo)致失效的一個原因,如我初始時設(shè)置dialogVisible.value = true ,那么反選是OK的,只不過我依然不可能設(shè)置為true,哪有彈窗一開始就顯示的。

  周五下午基本卡在這個地方了,經(jīng)過周末的放空自我(峽谷Timi),周一早上上班的路上復(fù)盤了一下,考慮從Dialog本身尋找答案,嘿,果不其然,它的API里有個opened方法,Dialog 打開動畫結(jié)束時的回調(diào),我在這里做初始化,問題就解決了:

// Dialog
@opened="opened"

// script ts 
const opened = () => {
     selectArr.value = ['xxxxxxxx']
}

  之所以能找到這個思路,還有一個原因是也試了一下表單,之前表單的提交事件里一直可以獲取到表單對象,然后試了一下onMounted里能不能獲取到,結(jié)果也是類似的情況。放個按鈕,在按鈕的點擊事件里是可以獲取到組件的,因為等你可以點擊按鈕時,頁面什么東西都加載完畢了,同樣的,Dialog 打開動畫結(jié)束時的回調(diào)里,頁面肯定早加載完畢了,該有的值都有了,那么這個時候做初始化就不會存在找不到key的問題了。

// Dialog
@opened="opened"

// script ts 
const opened = () => {
     selectArr.value = ['xxxxxxxx']
}

讀到這里,這篇“Vue3中無法為el-tree-select設(shè)置反選問題怎么解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

AI