Vue3+vuedraggable实现动态配置页面

 更新时间:2023年12月30日 08:26:19   作者:喵森  
这篇文章主要为大家详细介绍了Vue3如何利用vuedraggable实现动态配置页面,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

1、首先放上最终效果图,整个页面由三个区域组成:

  • 组件列表存放可以配置的组件名称。
  • 放置列表为最终展现的视觉效果。
  • 组件输入则可以动态配置内容,最终的配置数据为此处的数据。

1、框架搭建

1.1、安装指定版本的vuedraggable

首先安装支持vue3版本的vuedraggable

注意:默认安装的vuedraggable版本为vue2.0版本,并不通用。

npm install vuedraggable@4.1.0 --save

vue3版本vuedraggable示例地址sortablejs.github.io/vue.draggable.next

vue3版本vuedraggable Git地址 github.com/SortableJS/vue.draggable.next

1.2、布局搭建

安装完4.0版本的vuedraggable以后,就可以按下面的写法来进行一个简单的布局了。

<template>
  <div>
    <div class="section-container">
      <h4>组件列表</h4>
      <draggable 
      class="components-view"
      item-key="index" 
      :list="sectionList" 
      :sort="false"
      :forceFallback="true"
      ghost-class="ghost"
      dragClass="dragClass" 
      group="vehicle-station"
      >
        <template #item="{ element, index }">
            <div class="section">{{ element.type }}</div>
        </template>
      </draggable>
    </div>
    <div class="components-container">
      <h4>放置列表</h4>
      <draggable 
      item-key="index" 
      :list="componentsList"  
      animation="300"
      :scroll="true"
      :forceFallback="false"
      ghost-class="ghost"
      dragClass="dragClass" 
      group="vehicle-station">
        <template #item="{ element, index }">
          <transition name="el-fade-in-linear">
            <div>
              <div v-if="element.type === 'input'" class="section">输入框{{ element.data }}</div>
              <div v-if="element.type === 'textarea'" class="section">文本域</div>
            </div>
          </transition>
        </template>
      </draggable>
    </div>
    <!-- 这里存放组件 -->
    <div class="operate-container">
      <h4>组件输入</h4>
    </div>
  </div>
</template>

需要注意的是vue3版本不再需要v-for来渲染组件,直接使用template来渲染元素,并且需要指定唯一的item-key值。

1.2、使用到的参数介绍

属性名称说明
groupname相同的可以互相拖拽
list拖拽的数组
item-key唯一key值,不能重复
sort控制列表是否可以排序
forceFallback默认false,忽略HTML5的拖拽行为,因为设置了拖拽样式,需要开启
ghost-class目标位置占位符的样式
dragClass拖拽对象移动样式
animation拖拽动画时间
pullclone,拖拽的元素不会从列表消失,直接克隆这条数据
putfalse,禁止元素拖入

函数部分目前只需要定义数据结构

<script setup lang="ts">
import { ref } from 'vue';
import draggable from 'vuedraggable'

interface list {
  type: string,
  name: string,
  data: any
}

const sectionList = ref<list[]>([
  {
    type: 'input',
    data: '',
    name: 'input'
  },
  {
    data: '',
    type: 'textarea',
    name: 'textarea'
  }
])

const componentsList = ref<list[]>([])
</script>

css定义一下分栏布局和拖动、占位样式

<style scoped>
.components-view,
.components-wrap {
  height: 100%;
}

.dragClass {
  border: 1px solid red;
  border-radius: 8px;
}

.ghost {
  background-color: red !important;
}

.operate-container,
.section-container,
.components-container {
  float: left;
  padding-top: 30px;
  text-align: center;
  width: 300px;
  height: 800px;
}

.section-container {
  background-color: blanchedalmond;
}

.components-container {
  margin-left: 30px;
  background-color: rgb(184, 205, 178);
}

.operate-container {
  margin-left: 30px;
  background-color: rgb(125, 176, 228);
}

.section {
  text-align: center;
  width: 150px;
  height: 80px;
  line-height: 80px;
  margin-bottom: 30px;
  background-color: cadetblue;
  cursor: pointer;
}
</style>

至此页面就可以正常拖拽了,仅拖拽页面不需要用到函数操作,只需要根据配置项把页面布局完成即可。

2、数据接入

目前只是完成了组件的添加,接下来要把组件接入。

思路是单独定义组件数据,当输入完成以后,根据当前拖动的放置列表下标来存储数据。

2.1、为两列拖拽元素添加拖拽结束事件

2.2、设置组件数据

组件数据和放置列表的数据是联动的,在编辑完组件以后,数据会存储到放置列表内。 此时需要在拖动结束时获取当前拖动的放置列表下标,再把数据赋值给组件数据

  <div class="operate-container">
      <h4>组件输入</h4>
      <div>
        <!-- TODO:输入数据的时候要双向绑定,赋值给editorData -->
        <input v-if="editorData.type === 'input'" type="text" v-model="editorData.data" @change="setEditorData">
        <textarea v-if="editorData.type === 'textarea'" rows="4" cols="30" v-model="editorData.data"
          @change="setEditorData"></textarea>
      </div>
    </div>
    const onEnd = (evt: any) => {
  setCurrent(evt.newIndex)
}

-----
const setCurrent = (idx: number) => {
  // 设置当前编辑的组件数据
  editorData.value = { ...componentsList.value[idx] }
  editorIndex.value = idx
}

const setEditorData = () => {
  // 将编辑的组件数据赋值给放置列表数据
  componentsList.value[editorIndex.value] = editorData.value
}

最终实现效果如下,可以根据拖动的组件展示不同的组件,并且可以输入。

2.3、处理数据重复

上一步完成以后,组件数据已经可以保留下来了,但是无法做到数据互不冲突,无论是新添加组件,还是编辑其中一个组件,数据都是相同的。

这是因为在拖拽的时候数据都是复制的,在修改完数据以后,最左侧的组件列表会接收到最新修改的数据,在下一次拖动的时候就会把已经修改的数据再次拿来使用。

目前想到的解决方案是获取当前拖动的组件列表下标,和当前放置列表的下标,手动清除数据。

const onEnd = (evt: any) => {
  if (evt.target.className === 'components-view' && evt.to.className === 'components-wrap') {
    // 左侧组件列表的下标
    sectionIndex.value = evt.oldIndex
  }
  setCurrent(evt.newIndex)
}

const setCurrent = (idx: number) => {
  // 设置当前编辑的组件数据
  editorData.value = { ...componentsList.value[idx] }
  editorIndex.value = idx
}

const setEditorData = () => {
  // 填完值以后两侧数据都发生了改变,需要重新修改数据
  // 把上一次拖动的左侧列表数据清空
  sectionList.value[sectionIndex.value].data = ''
  // 将编辑的组件数据赋值给放置列表数据
  componentsList.value[editorIndex.value] = editorData.value
}

完成上述步骤以后,简单的动态配置组件就已经完成了,处理框架的代码量并不大,后续可以在上面拓展新的组件,最终可以呈现出一个可以动态配置的页面。

以上就是Vue3+vuedraggable实现动态配置页面的详细内容,更多关于Vue3 vuedraggable动态配置页面的资料请关注脚本之家其它相关文章!

相关文章

  • Vue2异步更新及nextTick原理详解

    Vue2异步更新及nextTick原理详解

    Vue2的异步更新机制是基于JavaScript的事件循环机制实现的。nextTick方法则是在DOM更新后执行回调函数。本文详细介绍了Vue2的异步更新机制和nextTick原理,对于理解Vue2的渲染机制和优化性能有很大的帮助。
    2023-04-04
  • vue过滤器实现日期格式化的案例分析

    vue过滤器实现日期格式化的案例分析

    这篇文章主要介绍了vue过滤器实现日期格式化的案例分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • el-form的label和表单自适应填满一行且靠左对齐方式

    el-form的label和表单自适应填满一行且靠左对齐方式

    这篇文章主要介绍了el-form的label和表单自适应填满一行且靠左对齐方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vuex的module模块用法示例

    vuex的module模块用法示例

    这篇文章主要介绍了vuex的module模块用法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • vue项目设置打包后的静态文件访问路径

    vue项目设置打包后的静态文件访问路径

    这篇文章主要介绍了vue项目设置打包后的静态文件访问路径,vue项目的最终项目文件需要经过打包输出,静态文件的访问路径需要在vue.config.js文件中设置,本文给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • vue控制滚动条滑到某个位置的方法实例

    vue控制滚动条滑到某个位置的方法实例

    当容器有滚动条时,有时需要将滚动条滑到某个位置,下面这篇文章主要给大家介绍了关于vue控制滚动条滑到某个位置的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Vue SPA 路由跳转无法回到顶部问题排查与解决

    Vue SPA 路由跳转无法回到顶部问题排查与解决

    本文主要介绍一下Vue SPA 路由跳转无法回到顶部问题排查与解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • 详解vue移动端项目代码拆分记录

    详解vue移动端项目代码拆分记录

    这篇文章主要介绍了详解vue移动端项目代码拆分记录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Vue实现监听某个元素滚动,亲测有效

    Vue实现监听某个元素滚动,亲测有效

    这篇文章主要介绍了Vue实现监听某个元素滚动,亲测有效!具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 使用Elemen加上lang=“ts“后编译报错

    使用Elemen加上lang=“ts“后编译报错

    本文主要介绍了使用Elemen加上lang=“ts“后编译报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论