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.js与TypeScript的生命周期

    一文详解Vue.js与TypeScript的生命周期

    Vue与TypeScript的结合使得开发大型应用变得更加容易和高效,本文将详细探讨Vue.js组件中TypeScript的应用,特别是它的生命周期钩子函数,并通过丰富的示例,为你提供一个实战指南,需要的朋友可以参考下
    2023-11-11
  • 解决vite build打包后页面不能正常访问的情况

    解决vite build打包后页面不能正常访问的情况

    这篇文章主要介绍了解决Vite打包后直接使用浏览器打开,显示空白问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue3封装自动滚动列表指令(含网页缩放滚动问题)

    Vue3封装自动滚动列表指令(含网页缩放滚动问题)

    本文主要介绍了Vue3封装自动滚动列表指令(含网页缩放滚动问题),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • vue2.0中组件传值的几种方式总结

    vue2.0中组件传值的几种方式总结

    这篇文章主要介绍了vue2.0中组件传值的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • vue实现自定义表格工具扩展

    vue实现自定义表格工具扩展

    这篇文章主要为大家详细介绍了vue实现自定义表格工具扩展,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue3中使用ant-design-vue的layout组件实现动态导航栏和面包屑功能

    vue3中使用ant-design-vue的layout组件实现动态导航栏和面包屑功能

    这篇文章主要介绍了vue3中使用ant-design-vue的layout组件实现动态导航栏和面包屑功能,基于一个新建的Vue3项目上实现,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • vue+echarts实现数据实时更新

    vue+echarts实现数据实时更新

    这篇文章主要为大家详细介绍了vue+echarts实现数据实时更新,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 基于Vue实现一个"蛇形"步骤条

    基于Vue实现一个"蛇形"步骤条

    在现代Web应用中,步骤条作为一种常见的UI组件,广泛应用于表单提交、任务进度以及多步骤操作等场景,下面我们来看看如何利用Vue实现一个蛇形步骤条吧
    2024-11-11
  • vuex中commit和dispatch的区别解析

    vuex中commit和dispatch的区别解析

    commit 和dispatch的区别在于commit是提交mutatious的同步操作,dispatch是分发actions的异步操作,本文重点给大家讲解vuex中commit和dispatch的区别,感兴趣的朋友一起看看吧
    2024-06-06
  • Vue 多层组件嵌套二种实现方式(测试实例)

    Vue 多层组件嵌套二种实现方式(测试实例)

    本篇文章主要介绍了Vue组件嵌套二种实现方式(测试实例),具有一定的参考价值,代码很简单,感兴趣的小伙伴们可以参考一下
    2017-09-09

最新评论