antd designable平台的组件拖拽功能实现代码

 更新时间:2024年07月11日 10:39:41   作者:a堅強的泡沫  
这篇文章主要介绍了antd designable平台的组件拖拽功能实现代码,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

平台:designable设计器
github:designable

1 背景

由于业务需求,我们需要实现designable平台的一个简易版的组件拖拽功能。

  • 拖拽区域
    • 渲染组件列表,包括组件的名称和icon
    • 组件可以拖动
  • 放置区域
    • 拖动后的组件可以放置,并且放置区域的组件依旧存在
    • 放置区域的组件可以正确渲染相应样式,使用formily的schema json渲染
    • 放置区域的组件可以上下移动排序,同时可以进行删除和编辑操作

2 技术栈

antd
formily:表单引擎,可以根据schema json直接渲染表单
react-beautiful-dnd:常用于列表的拖拽,支持排序
react-dnd:拖拽和放置功能,比如上面截图的组件拖拽

3 组件拖拽和放置

3.1 类型定义

右侧组件类型:id唯一标识,scheme存放渲染表单的json文件

export interface ComponentConfig {
  id?: string; // 唯一标识,随机生成,且不可更改
  key: string; // 表单字段key,用户可以更改
  title: string; // 拖拽区域的文案,不可更改
  component_type: ComponentType; // RN侧的组件标识,不可更改
  schema: ISchema;
}
export enum ComponentType {
  TextInputRow = 'TextInputRow', // 文本输入框
  DateInputRow = 'DateInputRow', // 时间选择器
  CheckBox = 'CheckBox',
}

右侧组件列表:

export const ComponentConfigs: ComponentConfig[] = [
  {
    key: ComponentType.TextInputRow,
    schema: {
      title: ComponentType.TextInputRow,
      type: 'string',
      'x-component': 'Input',
      'x-decorator': 'FormItem',
      'x-rn-component': ComponentType.TextInputRow, // RN侧的组件名称,必须要保持一致
    },
  },
  {
    key: ComponentType.DateInputRow,
    schema: {
      title: ComponentType.DateInputRow,
      type: 'string',
      'x-component': 'DatePicker',
      'x-decorator': 'FormItem',
      'x-rn-component': ComponentType.DateInputRow,
    },
  },
  {
    key: ComponentType.CheckBox,
    schema: {
      title: ComponentType.CheckBox,
      type: 'string',
      'x-component': 'Checkbox',
      'x-decorator': 'FormItem',
      'x-rn-component': ComponentType.CheckBox,
    },
  },
].map((i) => ({ ...i, title: i.key, component_type: i.key }));

3.2 拖拽

useDrag:让DOM实现拖拽能力的构子

  • 请求参数:
    • type: 指定元素的类型,只有 类型相同的元素 才能进行drop操作
    • item: 元素在拖拽过程中,描述该对象的数据。可以在useDrop中的drop接收到该数据
    • collect: 返回一个描述状态的普通对象,然后返回以注入到组件中。它接收两个参数,一个DragTargetMonitor实例和拖拽元素描述信息item
  • 返回参数:
    • 第一个返回值:是一个对象 表示关联在拖拽过程中的变量,需要在传入useDrag的规范方法的collect属性中进行映射绑定, 比如:isDraging, canDrag等
    • 第二个返回值: 代表拖拽元素的ref
    • 第三个返回值: 代表拖拽元素拖拽后实际操作到的dom
// 用于包裹每一个可以拖拽的组件
export const WrapComponent = (props: DndComponentDndItem) => {
  const [, drag] = useDrag(() => ({
    type: ItemTypes.CARD,
    item: props.config,
    // collect中可以监控drag状态变更,并把状态暴露给组件
    collect: (monitor) => ({ isDragging: !!monitor.isDragging() }),
  }));
  return (
    <div
      style={{
        width: 100, // todo: 卡片无法居中
        cursor: 'move',
        height: 50,
        display: 'flex',
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: 'white',
        borderRadius: 4,
      }}
      ref={drag} // dom元素实例
    >
      {props.children}
    </div>
  );
};

3.3 放置

  • 请求参数:
    • type: 指定元素的类型,只有 类型相同的元素 才能进行drop操作
    • item: 元素在拖拽过程中,描述该对象的数据。可以在useDrop中的drop接收到该数据
    • collect: 返回一个描述状态的普通对象,然后返回以注入到组件中。它接收两个参数,一个DragTargetMonitor实例和拖拽元素描述信息item
  • 返回参数:
    • 第一个返回值:是一个对象 表示关联在拖拽过程中的变量,需要在传入useDrag的规范方法的collect属性中进行映射绑定, 比如:isDraging, canDrag等
    • 第二个返回值: 代表拖拽元素的ref
    • 第三个返回值: 代表拖拽元素拖拽后实际操作到的dom

到此这篇关于antd designable平台的组件拖拽功能的文章就介绍到这了,更多相关antd designable组件拖拽内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ajax清除浏览器js、css、图片缓存的方法

    Ajax清除浏览器js、css、图片缓存的方法

    为了减小浏览器与服务器之间网络传输压力,往往对静态文件,如js,css,修饰的图片做cache,也就是给这些文件的HTTP响应头加入 Expires和Cache-Control参数,并指定缓存时间,这篇文章详细介绍Ajax清楚浏览js、Css、图片缓存的方法,有需要的朋友可以参考下
    2015-08-08
  • 微信小程序分享功能onShareAppMessage(options)用法分析

    微信小程序分享功能onShareAppMessage(options)用法分析

    这篇文章主要介绍了微信小程序分享功能onShareAppMessage(options)用法,结合具体实例形式分析了微信小程序分享功能onShareAppMessage(options)具体使用技巧与相关操作注意事项,需要的朋友可以参考下
    2019-04-04
  • JS中循环遍历数组的四种方式总结

    JS中循环遍历数组的四种方式总结

    这篇文章主要给大家总结介绍了关于JS中循环遍历数组的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Bootstrap Table中的多选框删除功能

    Bootstrap Table中的多选框删除功能

    这篇文章主要介绍了Bootstrap Table中的多选框删除功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 深入理解JavaScript中async/await的错误处理方式

    深入理解JavaScript中async/await的错误处理方式

    在现代JavaScript开发中,异步编程是不可或缺的一部分,async和await是一种强大的异步编程工具,它们使得编写和维护异步代码更加容易和清晰,然而,异步操作仍然可能会出现错误,本文将深入探讨async和await的错误处理方式,提供详细的代码示例和解释
    2023-09-09
  • three.js利用射线Raycaster进行碰撞检测

    three.js利用射线Raycaster进行碰撞检测

    这篇文章主要为大家详细介绍了three.js利用射线Raycaster进行碰撞检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 基于Web Components实现一个日历原生组件

    基于Web Components实现一个日历原生组件

    这篇文章主要为大家详细介绍了如何利用Web Components实现一个简单的日历原生组件,文中的示例代码讲解详细,需要的小伙伴可以了解一下
    2023-07-07
  • JavaScript 模块的循环加载实现方法

    JavaScript 模块的循环加载实现方法

    本文介绍JavaScript语言如何处理"循环加载"。目前,最常见的两种模块格式CommonJS和ES6,处理方法是不一样的,返回的结果也不一样
    2015-12-12
  • js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)

    js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)

    这篇文章主要介绍了js实现用户离开页面前提示是否离开此页面的方法,较为详细的分析了javascript针对浏览器事件的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • js实现拖动滑块效果

    js实现拖动滑块效果

    这篇文章主要为大家详细介绍了js实现拖动滑块效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论