Vue操作DOM解决显示位置问题

 更新时间:2024年12月18日 08:28:42   作者:RePeaT  
这篇文章主要介绍了Vue操作DOM解决显示位置问题,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

近来遇到的一个需求,简单记录一下思考和解决的过程

一、需求

上传卡片按钮,可显示在上传文件列表的首位,也可显示在末尾。

简化代码如下:

// custom-upload 组件
<div class="wrapper" id="wrapper">
  <el-upload />
  <FilePreview  
    v-for="item in fileList"
    :key="item.id"
    :src="item.url" />
</div>

上传卡片按钮和上传文件列表在一个div元素内,上传卡片按钮是div的第一个子元素,

需要扩展组件功能,上传卡片按钮可为div的最后一个元素

二、解决办法及思路

一、增加prop参数,用来控制上传卡片的显示位置,默认在首位

<script lang="ts" setup>
interface IProps {
  position?: 'first' | 'last'
}

const props = withDefaults(defineProps<IProps>(), {
  position: 'first',
})
</script>

二、控制上传卡片按钮的位置

(1)第一想法是,直接复制在一份在<FilePreview/ >后面,

通过参数控制显示第一个还是最后一个,

此方法虽然方便快捷,但也有两点缺点。

<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>
  • 代码重复,不够优雅
  • <el-upload />上属性多,后期维护,改了第一个组件,容易漏掉最后一个组件,造成bug

(2)为了解决代码重复的问题,在想到将<el-upload />组件封装成组件,不失为一个好办法,

但是由于<el-upload />上属性太多,要写很多prop。

(3)在进一步思考,在本组件内,可操作DOM,达到移动的目的。上面两个问题都可以解决

onMounted(() => {
  if (props.position === 'last') { 
    const container: any = document.getElementById('wrapper')
    const firstItem: any = container.firstChild
    container.appendChild(firstItem)
  }
})

在vue中操作DOM的代码要写在onMounted中,此时组件挂载完成,DOM可确保获取到。

操作DOM需要三步:

  • 获取div父元素:通过document.getElementById获取div元素
  • 获取上传按钮卡片:通过firstChild属性,获取上传卡片按钮
  • 移动:在通过appendChild方法移动到div的末尾

DOM操作步骤确定,满足上面三步的方法,还可以变换,比如:

onMounted(() => {
  if (props.position === 'last') { 
    const container: any = document.querySelector("#wrapper")
    const firstItem: any = container.childNodes[0]
    container.insertBefore(firstItem, null)
  }
})
  • 获取div父元素:通过document.querySelector获取div元素
  • 获取上传按钮卡片:通过childNodes属性的,获取上传卡片按钮
  • 移动:在通过insertBefore方法,将第一个元素插入到最后

三、DOM方法整理

appendChild():用于向元素的末尾添加一个节点

insertBefore():把节点放在元素中某个特定的位置上

replaceChild():替换子元素中某个节点

cloneNode():复制一个节点

const container: any = document.getElementById('wrapper')
container.appendChild(newNode)
container.insertBefore(newNode, targetNode)
container.replaceChild(newNode, targetNode)
container.cloneNode() 

到此这篇关于Vue操作DOM解决显示位置问题的文章就介绍到这了,更多相关Vue DOM显示位置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用Vue Demi同时支持Vue2和Vue3的方法

    用Vue Demi同时支持Vue2和Vue3的方法

    这篇文章主要介绍了用Vue Demi同时支持Vue2和Vue3的方法,实际开发中,同一个API在不同的版本中可能导入的来源不一样,比如ref方法,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 深入理解Vue router的部分高级用法

    深入理解Vue router的部分高级用法

    这篇文章主要介绍了Vue router的部分高级用法,主要是针对已经有初步了解Vue-router的人,通过本文主要给大家介绍路由元信息,滚动行为以及路由懒加载这几个的使用方法。感兴趣的朋友一起看看吧
    2018-08-08
  • Vue引入vuetify框架你需要知道的几点知识

    Vue引入vuetify框架你需要知道的几点知识

    这篇文章主要介绍了Vue引入vuetify框架你需要知道的几点知识,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • vue导出报表至excel表格三种方式

    vue导出报表至excel表格三种方式

    这篇文章主要给大家介绍了关于vue导出报表至excel表格的三种方式,导出报表是实际开发的常见功能,前后端都可以实现表格导出,本文介绍的是用vue实现,需要的朋友可以参考下
    2023-09-09
  • 解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)

    解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)

    这篇文章主要介绍了解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 9102年webpack4搭建vue项目的方法步骤

    9102年webpack4搭建vue项目的方法步骤

    这篇文章主要介绍了9102年webpack4搭建vue项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Vue.js计算机属性computed和methods方法详解

    Vue.js计算机属性computed和methods方法详解

    这篇文章主要为大家详细介绍了Vue.js计算机属性computed和methods方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • vue实现在线预览pdf文件和下载(pdf.js)

    vue实现在线预览pdf文件和下载(pdf.js)

    这篇文章主要为大家详细介绍了vue实现在线预览pdf文件和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • nginx+vite项目打包以及部署的详细过程

    nginx+vite项目打包以及部署的详细过程

    我们使用nginx部署Vue项目,实质上就是将Vue项目打包后的内容同步到nginx指向的文件夹,下面这篇文章主要给大家介绍了关于nginx+vite项目打包以及部署的相关资料,需要的朋友可以参考下
    2023-01-01
  • Vuex简单入门

    Vuex简单入门

    本篇文章主要介绍了初步认识理解Vuex,Vuex就是在一个项目中,提供唯一的管理数据源的仓库,有兴趣的可以了解一下
    2017-04-04

最新评论