如何使用外部函數(shù)動態(tài)加載elememtUI的級聯(lián)選擇器

elementUI官方文檔對級聯(lián)選擇器的動態(tài)加載數(shù)據(jù)介紹的比較簡單,我在使用的時候遇到了點坑。

官方文檔

從文檔中可以看出,動態(tài)加載的方法比較簡單,代碼如下:

<el-cascader :props="props"></el-cascader>

<script>
  let id = 0;

  export default {
    data() {
      return {
        props: {
          lazy: true,
          lazyLoad (node, resolve) {
            const { level } = node;
            setTimeout(() => {
              const nodes = Array.from({ length: level + 1 })
                .map(item => ({
                  value: ++id,
                  label: `選項${id}`,
                  leaf: level >= 2
                }));
              // 通過調(diào)用resolve將子節(jié)點數(shù)據(jù)返回,通知組件數(shù)據(jù)加載完成
              resolve(nodes);
            }, 1000);
          }
        }
      };
    }
  };
</script>

我們可以看到,只要給el-cascader組件傳入props屬性,并在props屬性中設置lazy:true,lazyLoad函數(shù)即可以開啟動態(tài)加載,需要注意的是,lazyLoad是一個函數(shù)。

遇到的問題

但是在實際的使用中,在data里面定義一個函數(shù)顯得太過臃腫,我更喜歡在methods里面去定義動態(tài)加載數(shù)據(jù)的方法。但是當將lazyLoad的值設置為一個函數(shù)的時候,會提示函數(shù)不存在,我們來分析下這個問題的原因及解決方案。

image.png

el-cascader組件中的this

我們可以在lozyLoad函數(shù)中輸出this,來查看為什么加載數(shù)據(jù)的方法initData不存在。

      props:{
        checkStrictly : true,
        lazy:true,
        lazyLoad(node,resolve){
          console.log(this,'lazyLoad')
         // this.initData(node,resolve)
        }
      }

el-cascader組件中的this

由上圖可以看到,el-cascader組件中的this指向的是組件本身,并不是我們調(diào)用組件時候的vue實例,所以,必然無法找到methods里面的函數(shù)。

由此引發(fā)的問題:由于this指向的不是調(diào)用組件時的vue實例,所以我們無法取到當前項目的Vue實例,故所有的全局數(shù)據(jù),方法,VUEX里面的數(shù)據(jù)等等,均無法在動態(tài)加載數(shù)據(jù)時候使用。從這一點出發(fā),這個問題必須要解決。

解決方案

由于vue在實例初始化的時候,datamethods等作為選項對象傳入,而data是一個函數(shù),所以我們可以在函數(shù)return之前將當前vue實例this保存到that中,然后在lazyLoad函數(shù)中,通過that調(diào)用initData方法。

  data() {
    let that=this;
    return {
      props:{
        checkStrictly : true,
        lazy:true,
        lazyLoad(node,resolve){
          console.log(this,'lazyLoad')
          console.log(that,'that')
          that.initData(node,resolve)
        }
      }
    }
  },

通過這種方式,我們可以在lazyLoad中使用我們自定義的函數(shù)了。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • vue概述 在官方文檔中,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,624評論 0 25
  • 一:什么是閉包?閉包的用處? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在本質(zhì)上,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 10,051評論 1 52
  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,373評論 0 6
  • 組件(Component)是Vue.js最核心的功能,也是整個架構設計最精彩的地方,當然也是最難掌握的。...
    六個周閱讀 5,770評論 0 32
  • 前言 使用Vue在日常開發(fā)中會頻繁接觸和使用生命周期,在官方文檔中是這么解釋生命周期的: 每個 Vue 實例在被創(chuàng)...
    心_c2a2閱讀 2,388評論 1 8

友情鏈接更多精彩內(nèi)容