首頁 > web前端 > Vue.js > 如何解決在Vue3中無法為el-tree-select設定反選問題?

如何解決在Vue3中無法為el-tree-select設定反選問題?

WBOY
發布: 2023-05-10 08:22:17
轉載
1522 人瀏覽過

  環境:Vue3.2、Element Plus

  問題:子元件setting.vue => 彈窗元件Dialog => 樹選擇元件el-tree-select ,無法設定預設選取項目 default- checked-keys

  場景:在一個後台系統的清單頁,選取一行數據,點選設定按鈕,指派一些功能。這裡的做法是把設定頁封裝在一個子元件裡了,並且子元件裡使用了Element Plus的Dialog元件

               然後Dialog裡有個el-tree-select需要初始化賦值,因為在分配之前賦值,因為在分配之前賦值,可能之前分配過,需要設定反選

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

<template>
  <el-tree-select
登入後複製

    :data="store().UserMenus"

:default-expanded-keys="[&#39;xxxxxxxx&#39;]" 
  />
</template>
登入後複製

  然後發現不生效,週五的時候也能猜到原因,data綁定的pinia全域狀態裡的值,元件被實例化時這個值可能還未被加載,所以設定default-expanded-keys時它就找不到節點數據,等元件被創建後,data有值了,但是default-expanded-keys又不會再重新設定了,就造成元件有下拉數據,但是沒有反選效果。

  起初以為是個簡單問題,於是動了動腦子,既然和順序有關,那自然考慮到生命週期了,於是在setting.vue裡加上onMounted,並在這裡重新賦值:

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

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

  正常來講onMounted函數已經是元件創建完畢並創建Dom了,這個時候我應該可以設定list的值,再設定selectArr。但實際依然沒有反選成功。

  這表示載入依然存在問題,抱著研究的心態,於是我又想起一種方法,我可以透過呼叫el-tree-select的API來透過方法設定它的預設值,也就是setCheckedKeys方法!

  透過模板引用,取得到el-tree-select,命名為tree,然後回到onMounted裡印:console.log(tree.value),好傢伙,居然是個undefined,這說明在settting. vue的onMounted根本無法設定選取的keys。然後詭異的是,在我反覆修改程式碼的時候,由於熱重載,Vue頁面會隨之更新,居然能反選上了!但我一刷新,反選立刻失效。 enmmmm ..... 基本能定位到問題的所在了,onMounted是無法獲取到組件的,後面試了一下onUnmounted,這個可以,但是我這是初始化邏輯,不可能寫在onUnmounted裡。

  在這裡面還存在一個因素導致該問題的產生,就是Dialog預設是不顯示的,透過v-model="dialogVisible"綁定的變數控制顯示隱藏,初始化值為false也是導致失效的一個原因,如我初始時設定dialogVisible.value = true ,那麼反選是OK的,只不過我依然不可能設定為true,哪有彈跳視窗一開始就顯示的。

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

// Dialog
@opened="opened"

// script ts 
const opened = () => {
     selectArr.value = [&#39;xxxxxxxx&#39;]
}
登入後複製
登入後複製

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

// Dialog
@opened="opened"

// script ts 
const opened = () => {
     selectArr.value = [&#39;xxxxxxxx&#39;]
}
登入後複製
登入後複製

以上是如何解決在Vue3中無法為el-tree-select設定反選問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板