国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3 使用defineAsyncComponent與component標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)渲染組件

這篇具有很好參考價(jià)值的文章主要介紹了vue3 使用defineAsyncComponent與component標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)渲染組件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

內(nèi)容有些啰嗦,內(nèi)容記載了當(dāng)時(shí)遇到了bug以及解決問(wèn)題的思路。

業(yè)務(wù)場(chǎng)景簡(jiǎn)述:
前端做配置化組件,通過(guò)url內(nèi)的唯一標(biāo)識(shí),請(qǐng)求后端sql 哪取頁(yè)面配置信息,前端通過(guò)配置信息動(dòng)態(tài)渲染查詢表單,導(dǎo)出、表格,toolbar以及動(dòng)態(tài)彈窗;該動(dòng)態(tài)渲染組件的功能,就是渲染的toolbar內(nèi)的按鈕,類型為自定義彈窗,彈窗路徑為后端配置數(shù)據(jù),前端通過(guò)點(diǎn)擊該按鈕,打開(kāi)指定路徑下的彈窗組件。

之前用的vue2的動(dòng)態(tài)掛載組件,也沒(méi)見(jiàn)vue3那么麻煩,官網(wǎng)上的例子以及網(wǎng)上的所以例子都是前端知道要導(dǎo)哪些組件,然后程序進(jìn)入就直接導(dǎo)進(jìn)來(lái)了,只是寫了邏輯動(dòng)態(tài)切換。我這個(gè)不一樣,需要掛載的組件是未知的。所以實(shí)現(xiàn)起來(lái)有點(diǎn)吃力。

一、基礎(chǔ)的動(dòng)態(tài)引入組件:
簡(jiǎn)單的動(dòng)態(tài)引入的意思是,前端知道要引入哪些組件,將多個(gè)組件引入到父組件中,但不渲染它,滿足一定條件后,才去在某個(gè)位置渲染指定的組件。

<template>
	 <custom-modal ref="custom"></custom-modal>
</template>
<script>
 import {
    reactive,
    ref,
    shallowReactive,
    onActivated,
    defineAsyncComponent,
  } from 'vue';
 const customModal = defineAsyncComponent(() => import('./modal/CustomModal.vue'));
 const custom = ref();
 </script>

以上的例子就是通過(guò)vue的defineAsyncComponent實(shí)現(xiàn)掛載組件,并賦值給customModal ,模板中可以直接使用<custom-modal>作為標(biāo)簽使用,也可以將它賦值給component中的is屬性,is屬性執(zhí)向一個(gè)變量,可通過(guò)業(yè)務(wù)邏輯動(dòng)態(tài),更改該變量的值,就可以實(shí)現(xiàn)多個(gè)組件進(jìn)行來(lái)回的渲染了

<template>
<component :is="componentKey" ref="custom"></component>
</template>
 import {
    reactive,
    ref,
    shallowReactive,
    onActivated,
    defineAsyncComponent,
  } from 'vue';
 const componentKey = ref(null);
 const components: any = shallowReactive({});
 const customModal = defineAsyncComponent(() => import('./modal/CustomModal.vue'));
 componentKey  = customModal

二、復(fù)雜的引入:不確定到底引入什么組件,組件的路徑由后端返回
將以上代碼 添加到項(xiàng)目代碼中,并不能實(shí)現(xiàn),雖然引入不報(bào)錯(cuò),但是ref一直為undefined,無(wú)法調(diào)用動(dòng)態(tài)組件內(nèi)的open函數(shù)。
不斷嘗試了很多次,得出以下結(jié)論

1.起初是在按鈕的click函數(shù)內(nèi)去掛載自定義組件并調(diào)用ref函數(shù)的,ref為undefined。
嘗試多次不能實(shí)現(xiàn)功能(這里是掛載與調(diào)用最合適的位置),
2.接著又在初始化配置數(shù)據(jù)時(shí)(查詢后端sql),axios的then函數(shù)內(nèi)掛載組件,然后點(diǎn)擊按鈕的地方調(diào)用ref內(nèi)的函數(shù),ref依舊為null。
3. 接著在最外層,調(diào)用初始化時(shí)掛載,也就是生命周期函數(shù)體內(nèi),測(cè)試還是一樣的結(jié)果。
4. 接著發(fā)現(xiàn)帶有async函數(shù)體內(nèi)掛載組件,也無(wú)法完成。
5.單獨(dú)寫個(gè)函數(shù),不加async,函數(shù)內(nèi)掛載組件,然后再生命周期外調(diào)用該函數(shù),按鈕內(nèi)調(diào)用ref內(nèi)的方法,成功彈窗。這并不是我想要的,因?yàn)槁窂讲皇枪潭ǖ模鹊胶蠖藄ql放回結(jié)果,才能執(zhí)行。

總結(jié):上面的多次測(cè)試,得出以下結(jié)論,都不能讓動(dòng)態(tài)組件ref對(duì)象有值
1、不能在組件的事件函數(shù)內(nèi)掛載,
vue3 使用defineAsyncComponent與component標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)渲染組件

2、不能在axios的then函數(shù)體內(nèi)掛載
vue3 使用defineAsyncComponent與component標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)渲染組件

3、不能在帶有async聲明的函數(shù)體內(nèi)掛載
vue3 使用defineAsyncComponent與component標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)渲染組件

4、不能在vue的生命周期內(nèi)掛載
vue3 使用defineAsyncComponent與component標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)渲染組件

5、只能在最外層掛載實(shí)現(xiàn),這時(shí)ref才是個(gè)對(duì)象。

好在天無(wú)絕人之路;腦海里有個(gè)思路:
頁(yè)面初始化時(shí)將項(xiàng)目里所有的全局掛載view組件扔到一個(gè)object內(nèi),使用component組件,is:對(duì)應(yīng)object內(nèi)指定的組件對(duì)象,然后通過(guò)后端的數(shù)據(jù),這時(shí)后端就不用給組件路徑了,給個(gè)組件名,我從object中找到掛載的組件然后將對(duì)象給is。
const modules = import.meta.glob('@/views/*/**.vue'); // 獲取所有項(xiàng)目路徑
mudules為views內(nèi)所有的vue的相對(duì)路徑,然后循環(huán)它,在循環(huán)體內(nèi)實(shí)現(xiàn)掛載,將它存入一個(gè)對(duì)象內(nèi),key為相對(duì)路徑的項(xiàng)目名稱(可以截取以下)。

有了上面的思路,通過(guò)反復(fù)測(cè)試和實(shí)現(xiàn),最終功能實(shí)現(xiàn)了。

<template>
<component :is="componentKey" ref="custom"></component>
</template>
<script>
 import {
    reactive,
    ref,
    shallowReactive,
    onActivated,
    defineAsyncComponent,
  } from 'vue';
	
	//聲明componentkey,用于告訴component當(dāng)前掛載什么組件,components為一個(gè)對(duì)象,存放多個(gè)不確定的自定義組件。
  const componentKey = ref(null);
  const components: any = shallowReactive({});

  // 組件掛載
  const initTableConfig = (gridId, type) => { 
   queryTableConfig({ gridId }).then(({ data }) => {
      if (type === 'main') {
        Object.assign(mainConfig, data);
        tabsKey.value = -1;
      } else {
        tabsDetail.value.push(data);
        tabsKey.value = tabsDetail.value.length - 1;
      }
      // 涉及到自定義組件的部分,這里需要提前掛載,在用到時(shí)不至于ref為null
      XEUtils.objectEach(data.action, (action, key) => {
        if (
          action.modalCfg &&
          action.modalCfg.type === 'CustomModal' &&
          action.modalCfg.src
        ) {
          components[action.actionId] = defineAsyncComponent(
            () => import(`../../../${action.modalCfg.src}`)
          );
          //注意:這里的路徑后端只能返回相對(duì)路徑,不能使用@/xxx/xxx.vue ,不能使用src/xxx/xxx.vue,只能./xxx.vue或者../../xxx/xxx.vue。由于并不確定組件在什么位置,避免容易出錯(cuò)的原則,我在前端通過(guò)../../../的形式將路徑回退到src下,后端只需要從src下配置路徑即可,不用考慮那么多了。如后端src的值為src/xxx/xxx/xxx.vue 則在前端合成的路徑就為../../../src/xx/xxx/xxx.vue
          componentKey.value = components[action.actionId];
          // 為什么componentKey.vue在這里賦值,在后面點(diǎn)擊窗口后又賦值,這里能不能省略。
		//	答:這里省略的話,到點(diǎn)擊按鈕觸發(fā)時(shí)會(huì)報(bào)錯(cuò),第一次點(diǎn)擊會(huì)報(bào)錯(cuò),第二次點(diǎn)擊不會(huì)報(bào)錯(cuò),窗口正常彈出??赡苁且?yàn)椋M件掛載時(shí)并沒(méi)有引入組件,只在使用時(shí)才引入,如果上面不提前將掛載好的組件引入進(jìn)來(lái),后面觸發(fā)事件觸發(fā)時(shí)引入在調(diào)用ref,執(zhí)行太快,costom就會(huì)報(bào)錯(cuò),所以才會(huì)點(diǎn)兩次才彈窗。
        }
      });
    });
  };
 </script>

按鈕點(diǎn)擊觸發(fā)事件,確定彈窗要彈出什么組件

		} else if (action.modalCfg.type === 'CustomModal') {
  		// 這里的actionid和組件是對(duì)應(yīng)的,所以在按鈕觸發(fā)后,通過(guò)按鈕攜帶的actionid能取到對(duì)應(yīng)的組件。
          componentKey.value = components[action.actionId];
          custom.value.init(row);
        }

經(jīng)過(guò)以上的方式:在任何地方掛載都不會(huì)報(bào)錯(cuò),完美解決。
注意:掛載與使用ref不能在同一個(gè)方法體內(nèi),如果可以的話,頁(yè)面加載時(shí),執(zhí)行掛載,需要調(diào)用ref時(shí)就不會(huì)報(bào)錯(cuò)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-446800.html

到了這里,關(guān)于vue3 使用defineAsyncComponent與component標(biāo)簽實(shí)現(xiàn)動(dòng)態(tài)渲染組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3 -- 使用audio標(biāo)簽播放音頻

    vue3 -- 使用audio標(biāo)簽播放音頻

    公司系統(tǒng)內(nèi)的審批頁(yè)面,前端要根據(jù)后臺(tái)推送的信息,使用’提示音’提醒用戶進(jìn)行對(duì)應(yīng)審批操作。 vue3 項(xiàng)目 簡(jiǎn)介 | Vue.js (vuejs.org) TypeScript TypeScript: JavaScript With Syntax For Types. (typescriptlang.org) vite Vite | 下一代的前端工具鏈 (vitejs.dev) 下載好使用音頻文件 音效網(wǎng),保存本地。 將

    2024年02月01日
    瀏覽(20)
  • h5音頻標(biāo)簽?zāi)M實(shí)現(xiàn)語(yǔ)音條(VUE3)

    h5音頻標(biāo)簽?zāi)M實(shí)現(xiàn)語(yǔ)音條(VUE3)

    思路:將原audio標(biāo)簽通過(guò)css隱藏,在通過(guò)css的div實(shí)現(xiàn)語(yǔ)音條樣式,獲取到audio的ref,操作audio的play、pause方法即可 效果圖: template ? div style=\\\"display: none\\\" ? ? audio ? ? ? controls ? ? ? ref=\\\"audioRef\\\" ? ? ? @loadedmetadata=\\\"handleLoadedMetadata\\\" ? ? ? @ended=\\\"audioEnded\\\" ? ? ? ? ? !-- source :src=\\\"

    2024年03月20日
    瀏覽(24)
  • vue3中使用ant-design-vue的layout組件實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)航欄功能(1~2級(jí))

    vue3中使用ant-design-vue的layout組件實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)航欄功能(1~2級(jí))

    目錄 0 前言 1 準(zhǔn)備工作 1.1 安裝ant-design-vue 1.2 安裝圖標(biāo)組件包 2 選擇組件 3 路由文件 4 Vue導(dǎo)航頁(yè)面 5 最終效果 ????????最近在自己搞一個(gè)前后端小項(xiàng)目,前端想使用ant-design-vue的layout組件實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)航欄和面包屑,但是網(wǎng)上的資料較少,所以我就自己整合實(shí)現(xiàn)了一下,在此

    2024年02月15日
    瀏覽(27)
  • Vue3-在HTML標(biāo)簽、組件標(biāo)簽上使用v-model

    本篇為Vue3學(xué)習(xí)中遇到的v-model相關(guān)的記錄,如有問(wèn)題歡迎指正 v-model通常在input、select等標(biāo)簽上來(lái)實(shí)現(xiàn)數(shù)據(jù)雙向綁定 原理 :v-model通過(guò)給標(biāo)簽value賦值來(lái)實(shí)現(xiàn)? 數(shù)據(jù)—頁(yè)面 的綁定。然后通過(guò)綁定input事件實(shí)現(xiàn) 頁(yè)面—數(shù)據(jù) 的綁定。 原理 :在組件上時(shí),v-model通過(guò) :modelValue 來(lái)進(jìn)行

    2024年01月24日
    瀏覽(25)
  • Vue3實(shí)現(xiàn)可視化拖拽標(biāo)簽小程序

    Vue3實(shí)現(xiàn)可視化拖拽標(biāo)簽小程序

    實(shí)現(xiàn)功能:可視化標(biāo)簽拖拽,雙擊標(biāo)簽可修改標(biāo)簽內(nèi)容 一個(gè)大DIV包含里面存放兩個(gè)DIV一個(gè)input header為頭部標(biāo)簽名稱 內(nèi)容區(qū)域綁定雙擊鼠標(biāo)事件,觸發(fā)開(kāi)始修改事件(startEditing),使用v-if進(jìn)行標(biāo)簽的顯示和隱藏操作 input標(biāo)簽,事件綁定為修改內(nèi)容,綁定獲取焦點(diǎn)事件(@blue=“

    2024年02月09日
    瀏覽(33)
  • [VUE學(xué)習(xí)]權(quán)限管理系統(tǒng)前端vue實(shí)現(xiàn)9-動(dòng)態(tài)路由,動(dòng)態(tài)標(biāo)簽頁(yè),動(dòng)態(tài)面包屑

    [VUE學(xué)習(xí)]權(quán)限管理系統(tǒng)前端vue實(shí)現(xiàn)9-動(dòng)態(tài)路由,動(dòng)態(tài)標(biāo)簽頁(yè),動(dòng)態(tài)面包屑

    ? ? ? ? ? ? ? ? 在總體布局頁(yè)面添加router router-view 是 Vue Router 提供的組件,用于動(dòng)態(tài)展示匹配到的路由組件內(nèi)容。 通過(guò)在合適的位置放置 router-view ,你可以根據(jù)路由路徑動(dòng)態(tài)地渲染對(duì)應(yīng)的組件內(nèi)容。 ? ? ? ? ? ? ? ? ? ? 因?yàn)槲覀兪嵌嗉?jí)頁(yè)面 之后動(dòng)態(tài)路由也是多級(jí)的 如

    2024年02月13日
    瀏覽(22)
  • uni-app:vue3 + uni-app 在微信小程序中無(wú)法使用app.component全局注冊(cè)組件

    按上文中的代碼執(zhí)行后,會(huì)發(fā)現(xiàn)在微信小程序開(kāi)發(fā)中全局注冊(cè)的組件是無(wú)法顯示的,這是uniapp的一個(gè)未解決bug, 在uniapp中出了可以通過(guò)vue實(shí)例的component方法注冊(cè)全局組件外,uniapp支持另一種全局注冊(cè)的方式,就是通過(guò) easycom 掃描注冊(cè),步驟如下 easycom 的掃描流程是:通過(guò)代碼

    2024年02月16日
    瀏覽(105)
  • vue3利用 a 標(biāo)簽,文件流,JSZip 壓縮包,實(shí)現(xiàn)文件下載

    在實(shí)現(xiàn)文件的下載,采用 a 標(biāo)簽,會(huì)出現(xiàn)圖片,沒(méi)有進(jìn)行下載,而是,在當(dāng)前頁(yè)面打開(kāi)了圖片。 導(dǎo)致原因: ·a標(biāo)簽,有 download 屬性,可以實(shí)現(xiàn)下載 同源文件( ip 和 端口 相同),當(dāng)圖片不同源 時(shí),點(diǎn)擊下載,會(huì)在當(dāng)前窗口直接打開(kāi)圖片,而不是進(jìn)入下載狀態(tài)。 1.1 沒(méi)有圖片

    2023年04月08日
    瀏覽(21)
  • vue給components動(dòng)態(tài)添加組件

    在Vue中,可以使用 v-bind 指令來(lái)動(dòng)態(tài)地將組件添加到其他組件上。 首先,需要定義一個(gè)包含所有可能的子組件的數(shù)組或?qū)ο蟆H缓?,通過(guò)計(jì)算屬性(computed property)根據(jù)條件選擇要顯示的組件。最后,使用 component 元素并結(jié)合 is 特性來(lái)動(dòng)態(tài)地切換不同的組件。 這樣就可以根據(jù)

    2024年01月24日
    瀏覽(20)
  • vue3 +element動(dòng)態(tài)表單實(shí)現(xiàn)

    可以直接復(fù)制,接口看后端 父頁(yè)面 子頁(yè)面

    2024年02月15日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包