vue3通過render函數(shù)實(shí)現(xiàn)菜單下拉框的示例
背景說明
鼠標(biāo)移動(dòng)到產(chǎn)品服務(wù)上時(shí),出現(xiàn)標(biāo)紅的下拉框。

使用純css的方案實(shí)現(xiàn)最簡單,但是沒什么技術(shù)含量,棄之;使用第三方組件庫,樣式定制麻煩棄之。因此,我們使用vue3直接在頁面創(chuàng)建一個(gè)dom作為下拉框吧。
技術(shù)方案
先寫一個(gè)下拉框組件
首先,我們先寫一個(gè)組件,用來展示下拉框內(nèi)容。組件名稱起為 :Select.vue
<template>
<div class="select-wrap">
<span>福利商城</span>
<span>Saas平臺</span>
<span>活動(dòng)定制</span>
</div>
</template>

渲染組件
我們要將這個(gè)組件渲染在網(wǎng)頁上,操作應(yīng)該是這樣的:
當(dāng)鼠標(biāo)移動(dòng)到產(chǎn)品服務(wù)時(shí),將下拉框組件作為一個(gè)組件實(shí)例渲染在頁面的合適位置。
vue3中,渲染一個(gè)Vonde,核心邏輯如下:
import { createVNode, h, render, VNode } from 'vue'
import component from "./component.vue"
//1、創(chuàng)造包裹虛擬節(jié)點(diǎn)的div元素
const container = document.createElement('div');
//2、創(chuàng)造虛擬節(jié)點(diǎn)
vm = createVNode(component)
//3、將虛擬節(jié)點(diǎn)創(chuàng)造成真實(shí)DOM
render (vm, container)
//4、將渲染的結(jié)果放到body下
document.body.appendChild(container.firstElementChild)
要知道組件渲染的位置,我們必須知道父組件(也就是產(chǎn)品服務(wù)的dom位置),我們通過ref來獲取父組件的dom信息。
// App.vue
<div ref="select">
<span class="name">產(chǎn)品服務(wù)</span>
</div>
<script setup >
import { ref } from "vue"
const select = ref()
</script>
當(dāng)鼠標(biāo)移到產(chǎn)品服務(wù)元素上時(shí),渲染下拉框,我們添加個(gè)函數(shù)
// App.vue
<div ref="select">
<span class="name">產(chǎn)品服務(wù)</span>
</div>
<script setup >
import { ref } from "vue"
import Select from "./Select.vue"
const select = ref()
function createDom(){
//1、創(chuàng)造包裹虛擬節(jié)點(diǎn)的div元素
const container = document.createElement('div');
//2、創(chuàng)造虛擬節(jié)點(diǎn)
let vm = createVNode(Select)
//3、將虛擬節(jié)點(diǎn)創(chuàng)造成真實(shí)DOM
render (vm, container)
//4、將渲染的結(jié)果放到body下
document.body.appendChild(container.firstElementChild)
}
</script>
然后,添加下位置判斷
function createDom(){
const left = select.value.offsetLeft + "px"
const width = select.value.getBoundingClientRect().left + "px"
const props = {
width,
left,
}
//1、創(chuàng)造包裹虛擬節(jié)點(diǎn)的div元素
const container = document.createElement('div');
//2、創(chuàng)造虛擬節(jié)點(diǎn)
let vm = createVNode(Select,props)
//3、將虛擬節(jié)點(diǎn)創(chuàng)造成真實(shí)DOM
render (vm, container)
//4、將渲染的結(jié)果放到body下
document.body.appendChild(container.firstElementChild)
}
其中,prop是傳遞給Select組件的距離參數(shù),在組件內(nèi)設(shè)置即可。
銷毀組件
銷毀組件,我們可以使用render渲染一個(gè)空對象即可
render (vm, container)
如果需要子組件來銷毀自身,我們可以使用父子傳值
<template>
<div class="select-wrap" @mouseleave="beforeUnload">
<span>福利商城</span>
<span>Saas平臺</span>
<span>活動(dòng)定制</span>
</div>
</template>
<script setup>
const emit = defineEmits(['destroy'])
function beforeUnload(){
emit('destroy')
}
</script>
父組件里,我們需要在props中添加一個(gè)onDestroy函數(shù),注意:onDestroy是駝峰式寫法
function createDom(){
const left = select.value.offsetLeft + "px"
const width = select.value.getBoundingClientRect().left + "px"
const props = {
width,
left,
onDestroy: () => {
render(null, container)
},
}
//1、創(chuàng)造包裹虛擬節(jié)點(diǎn)的div元素
const container = document.createElement('div');
//2、創(chuàng)造虛擬節(jié)點(diǎn)
let vm = createVNode(Select,props)
//3、將虛擬節(jié)點(diǎn)創(chuàng)造成真實(shí)DOM
render (vm, container)
//4、將渲染的結(jié)果放到body下
document.body.appendChild(container.firstElementChild)
}
這樣,就實(shí)現(xiàn)了下拉框組件
到此這篇關(guān)于vue3通過render函數(shù)實(shí)現(xiàn)菜單下拉框的示例的文章就介紹到這了,更多相關(guān)vue3 render菜單下拉框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解
- Vue render函數(shù)使用詳細(xì)講解
- Vue中render函數(shù)調(diào)用時(shí)機(jī)與執(zhí)行細(xì)節(jié)源碼分析
- 簡單談一談Vue中render函數(shù)
- vue中使用render封裝一個(gè)select組件
- Vue 2閱讀理解之initRender與callHook組件詳解
- vue語法之render函數(shù)和jsx的基本使用
- vue3中的render函數(shù)里定義插槽和使用插槽
- VUE3中h()函數(shù)和createVNode()函數(shù)的使用解讀
- Vue.js3.2的vnode部分優(yōu)化升級使用示例詳解
- Vue.js之VNode的使用
- vue中?render?函數(shù)功能與原理分析
相關(guān)文章
vuex實(shí)現(xiàn)簡易計(jì)數(shù)器
這篇文章主要為大家詳細(xì)介紹了vuex實(shí)現(xiàn)一個(gè)簡易計(jì)數(shù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
el-table實(shí)現(xiàn)搜索高亮展示并滾動(dòng)到元素位置的操作代碼
這篇文章主要介紹了el-table實(shí)現(xiàn)搜索高亮展示并滾動(dòng)到元素位置,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
Vue props中Object和Array設(shè)置默認(rèn)值操作
這篇文章主要介紹了Vue props中Object和Array設(shè)置默認(rèn)值操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
詳解element-ui日期時(shí)間選擇器的日期格式化問題
這篇文章主要介紹了詳解element-ui日期時(shí)間選擇器的日期格式化問題,本文用到了DateTimePicker來選擇日期時(shí)間,但是在將數(shù)據(jù)傳回后臺的過程中遇到了一些令人頭疼的問題,有興趣的一起來了解一下2019-04-04
vue中tab選項(xiàng)卡的實(shí)現(xiàn)思路
今天給大家分享vue中tab 選項(xiàng)卡的一些套路,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-11-11
Vue2中compiler和runtime模式報(bào)錯(cuò)template compiler is 
本文主要介紹了Vue2中compiler和runtime模式報(bào)錯(cuò)template compiler is not available,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
vue實(shí)現(xiàn)導(dǎo)出Word文件(數(shù)據(jù)流方式)
這篇文章主要介紹了vue實(shí)現(xiàn)導(dǎo)出Word文件(數(shù)據(jù)流方式),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

