Vue操作DOM解決顯示位置問(wèn)題
近來(lái)遇到的一個(gè)需求,簡(jiǎn)單記錄一下思考和解決的過(guò)程
一、需求
上傳卡片按鈕,可顯示在上傳文件列表的首位,也可顯示在末尾。
簡(jiǎn)化代碼如下:
// custom-upload 組件 <div class="wrapper" id="wrapper"> <el-upload /> <FilePreview v-for="item in fileList" :key="item.id" :src="item.url" /> </div>
上傳卡片按鈕和上傳文件列表在一個(gè)div元素內(nèi),上傳卡片按鈕是div的第一個(gè)子元素,
需要擴(kuò)展組件功能,上傳卡片按鈕可為div的最后一個(gè)元素
二、解決辦法及思路
一、增加prop參數(shù),用來(lái)控制上傳卡片的顯示位置,默認(rèn)在首位
<script lang="ts" setup> interface IProps { position?: 'first' | 'last' } const props = withDefaults(defineProps<IProps>(), { position: 'first', }) </script>
二、控制上傳卡片按鈕的位置
(1)第一想法是,直接復(fù)制在一份在<FilePreview/ >后面,
通過(guò)參數(shù)控制顯示第一個(gè)還是最后一個(gè),
此方法雖然方便快捷,但也有兩點(diǎn)缺點(diǎn)。
<div class="wrapper"> <el-upload v-if="props.position === 'first'" /> <FilePreview v-for="item in fileList" :key="item.id" :src="item.url" /> <el-upload v-if="props.position === 'last'" /> </div>
- 代碼重復(fù),不夠優(yōu)雅
- <el-upload />上屬性多,后期維護(hù),改了第一個(gè)組件,容易漏掉最后一個(gè)組件,造成bug
(2)為了解決代碼重復(fù)的問(wèn)題,在想到將<el-upload />組件封裝成組件,不失為一個(gè)好辦法,
但是由于<el-upload />上屬性太多,要寫(xiě)很多prop。
(3)在進(jìn)一步思考,在本組件內(nèi),可操作DOM,達(dá)到移動(dòng)的目的。上面兩個(gè)問(wèn)題都可以解決
onMounted(() => { if (props.position === 'last') { const container: any = document.getElementById('wrapper') const firstItem: any = container.firstChild container.appendChild(firstItem) } })
在vue中操作DOM的代碼要寫(xiě)在onMounted中,此時(shí)組件掛載完成,DOM可確保獲取到。
操作DOM需要三步:
- 獲取div父元素:通過(guò)document.getElementById獲取div元素
- 獲取上傳按鈕卡片:通過(guò)firstChild屬性,獲取上傳卡片按鈕
- 移動(dòng):在通過(guò)appendChild方法移動(dòng)到div的末尾
DOM操作步驟確定,滿足上面三步的方法,還可以變換,比如:
onMounted(() => { if (props.position === 'last') { const container: any = document.querySelector("#wrapper") const firstItem: any = container.childNodes[0] container.insertBefore(firstItem, null) } })
- 獲取div父元素:通過(guò)document.querySelector獲取div元素
- 獲取上傳按鈕卡片:通過(guò)childNodes屬性的,獲取上傳卡片按鈕
- 移動(dòng):在通過(guò)insertBefore方法,將第一個(gè)元素插入到最后
三、DOM方法整理
appendChild():用于向元素的末尾添加一個(gè)節(jié)點(diǎn)
insertBefore():把節(jié)點(diǎn)放在元素中某個(gè)特定的位置上
replaceChild():替換子元素中某個(gè)節(jié)點(diǎn)
cloneNode():復(fù)制一個(gè)節(jié)點(diǎn)
const container: any = document.getElementById('wrapper') container.appendChild(newNode) container.insertBefore(newNode, targetNode) container.replaceChild(newNode, targetNode) container.cloneNode()
到此這篇關(guān)于Vue操作DOM解決顯示位置問(wèn)題的文章就介紹到這了,更多相關(guān)Vue DOM顯示位置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決vite build打包后頁(yè)面不能正常訪問(wèn)的情況
這篇文章主要介紹了解決Vite打包后直接使用瀏覽器打開(kāi),顯示空白問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue3封裝自動(dòng)滾動(dòng)列表指令(含網(wǎng)頁(yè)縮放滾動(dòng)問(wèn)題)
本文主要介紹了Vue3封裝自動(dòng)滾動(dòng)列表指令(含網(wǎng)頁(yè)縮放滾動(dòng)問(wèn)題),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05vue實(shí)現(xiàn)自定義表格工具擴(kuò)展
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)自定義表格工具擴(kuò)展,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04vue3中使用ant-design-vue的layout組件實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)航欄和面包屑功能
這篇文章主要介紹了vue3中使用ant-design-vue的layout組件實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)航欄和面包屑功能,基于一個(gè)新建的Vue3項(xiàng)目上實(shí)現(xiàn),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01vue+echarts實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)更新
這篇文章主要為大家詳細(xì)介紹了vue+echarts實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)更新,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04基于Vue實(shí)現(xiàn)一個(gè)"蛇形"步驟條
在現(xiàn)代Web應(yīng)用中,步驟條作為一種常見(jiàn)的UI組件,廣泛應(yīng)用于表單提交、任務(wù)進(jìn)度以及多步驟操作等場(chǎng)景,下面我們來(lái)看看如何利用Vue實(shí)現(xiàn)一個(gè)蛇形步驟條吧2024-11-11Vue 多層組件嵌套二種實(shí)現(xiàn)方式(測(cè)試實(shí)例)
本篇文章主要介紹了Vue組件嵌套二種實(shí)現(xiàn)方式(測(cè)試實(shí)例),具有一定的參考價(jià)值,代碼很簡(jiǎn)單,感興趣的小伙伴們可以參考一下2017-09-09