vue3?setup語法糖中獲取slot插槽的dom對象代碼示例
前言
最近使用vue3開發(fā)項目,需要封裝一個無限滾動的組件,使用scroll組件內(nèi)置插槽接受模板的方式,所以需要在scroll組件內(nèi)獲取到模板渲染后dom元素的寬高。
但是setup語法糖是組件生命周期的beforeCreate和created中,而且經(jīng)過測試,在mounted函數(shù)中的el屬性也是null,所以得出結(jié)論模板的slot.default無法直接獲取, 必須通過 render 方式對 slot 的 vnode 進行渲染,然后在 render 組件中的 mounted 方法中才能獲取到。如下面的例子
容器組件 ScrollView
//ScrollView.vue scroll容器組件 <script setup lang="ts"> import { ref, useSlots } from 'vue' import createSlot from '../vnode/createSlot' const slot = useSlots() // 這里獲取到的是默認插槽的vnode,但拿不到對應(yīng)的dom實例 const defaultSlot = slots.default && slots.default()[0] // 自定義template 內(nèi)容mounted事件 const mountedCallFun = (args)=> { console.log('mounted', args) } // 自定義template 內(nèi)容updated事件 const updatedCallFun = (args)=> { console.log(args) } // 自定義template 內(nèi)容unMounted卸載事件 const unmountedCallFun = (args)=> { console.log(args) } const mySlot = createSlot({mountedCallFun, updatedCallFun, unmountedCallFun}) onMounted(() => { // 即使在該組件的mounted鉤子中,這個defaultSlot的$el依然為null console.log('defaultSlot', defaultSlot) }) </script> <template> <div> <mySlot :vnode="defaultSlot"></mySlot> </div> </template>
render函數(shù)渲染slot內(nèi)容的工廠函數(shù) createSlots.ts
通過 vue官方提供的 defineComponent創(chuàng)建一個組件裝載 scrollView組件中的 插槽內(nèi)容:
//createSlots.ts import { defineComponent, h } from "vue" type CallFun = (vnodeEl: HTMLElement) => void type Funs = Record<'mountedCallFun'| 'updatedCallFun'| 'unmountedCallFun', CallFun> export default ({mountedCallFun, updatedCallFun, unmountedCallFun}: Funs) => { return defineComponent({ props: ['vnode'], setup(props, ctx){ console.log(props, ctx) }, mounted() { // console.log(this.$el) mountedCallFun(this.$el) }, render(props: any, ctx: any) { console.log(props, ctx) return props.vnode } }) }
測試使用 ScrollView組件
<script setup lang="ts"> import Text from '../components/text.vue' import ScrollView from '../components/ScrollView.vue' </script> <template> <div> <ScrollView> <h2 >測試使用 ScrollView組件測試使用 ScrollView組件</h2> <h2 >測試使用 ScrollView組件測試使用 ScrollView組件</h2> <h2 >測試使用 ScrollView組件測試使用 ScrollView組件</h2> <h2 >測試使用 ScrollView組件測試使用 ScrollView組件</h2> </ScrollView> </div> </template>
總結(jié)
到此這篇關(guān)于vue3 setup語法糖中獲取slot插槽的dom對象的文章就介紹到這了,更多相關(guān)vue3獲取slot插槽dom對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Vue?+?ElementUI實現(xiàn)可編輯表格及校驗
這篇文章主要給大家介紹了基于Vue?+?ElementUI?實現(xiàn)可編輯表格及校驗,文中有詳細的代碼講解和實現(xiàn)思路,講解的非常詳細,有需要的朋友可以參考下2023-08-08Vue圖片瀏覽組件v-viewer用法分析【支持旋轉(zhuǎn)、縮放、翻轉(zhuǎn)等操作】
這篇文章主要介紹了Vue圖片瀏覽組件v-viewer用法,結(jié)合實例形式分析了v-viewer的基本功能與使用方法,包括旋轉(zhuǎn)、縮放、翻轉(zhuǎn)等操作技巧,需要的朋友可以參考下2019-11-11vue使用recorder-core.js實現(xiàn)錄音功能
這篇文章主要介紹了vue如何使用recorder-core.js實現(xiàn)錄音功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07Vue3如何自定義v-permission權(quán)限指令
這篇文章主要為大家詳細介紹了Vue3如何編寫一個?v-permission?指令來根據(jù)用戶權(quán)限動態(tài)控制元素的渲染,感興趣的小伙伴可以參考一下2024-12-12vue項目中axios請求網(wǎng)絡(luò)接口封裝的示例代碼
這篇文章主要介紹了vue項目中axios請求網(wǎng)絡(luò)接口封裝的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Vue3 setup語法糖銷毀一個或多個定時器(setTimeout/setInterval)
這篇文章主要給大家介紹了關(guān)于Vue3 setup語法糖銷毀一個或多個定時器(setTimeout/setInterval)的相關(guān)資料,vue是單頁面應(yīng)用,路由切換后,定時器并不會自動關(guān)閉,需要手動清除,當(dāng)頁面被銷毀時,清除定時器即可,需要的朋友可以參考下2023-10-10