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显示位置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何将HTML页面改写到vue项目中详解

    如何将HTML页面改写到vue项目中详解

    html和vue都是前端技术中非常重要的一部分,其中html是web开发的基石,而vue则是现代化的前端开发框架之一,下面这篇文章主要给大家介绍了关于如何将HTML页面改写到vue项目中的相关资料,需要的朋友可以参考下
    2024-08-08
  • vue-cli3配置与跨域处理方法

    vue-cli3配置与跨域处理方法

    这篇文章主要介绍了vue-cli3配置与跨域处理方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • vue中的data,computed,methods,created,mounted用法及说明

    vue中的data,computed,methods,created,mounted用法及说明

    这篇文章主要介绍了vue中的data,computed,methods,created,mounted用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • vue.config.js里面的devserver如何配置

    vue.config.js里面的devserver如何配置

    本文介绍了vue.config.js中devServer的常见配置方式,包括基本配置、代理配置、热模块替换、静态资源服务、HTTPS配置、多代理配置以及其他配置项,帮助开发者根据项目需求进行定制
    2025-01-01
  • vue中格式化时间过滤器代码实例

    vue中格式化时间过滤器代码实例

    这篇文章主要介绍了vue格式化时间过滤器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue+echarts实现多条折线图

    vue+echarts实现多条折线图

    这篇文章主要为大家详细介绍了vue+echarts实现多条折线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • petite vue 基本使用指南示例小结

    petite vue 基本使用指南示例小结

    petite-vue 是为渐进增强而优化的另一种 Vue 发行版,它提供与标准 Vue 相同的模板语法和反应性心智模型,这篇文章主要介绍了petite vue 基本使用指南,需要的朋友可以参考下
    2024-07-07
  • vue cli4.0项目引入typescript的方法

    vue cli4.0项目引入typescript的方法

    这篇文章主要介绍了vue cli4.0项目引入typescript的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 关于vue-property-decorator的基础使用实践

    关于vue-property-decorator的基础使用实践

    这篇文章主要介绍了关于vue-property-decorator的基础使用实践,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • element-ui如何在table中使用tooltip

    element-ui如何在table中使用tooltip

    这篇文章主要介绍了element-ui如何在table中使用tooltip问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论