react 实现低耦合 拖拽项目的思路

简介: react 实现低耦合 拖拽项目的思路

1. 前言

  1. 前几天面试也问到了这个问题
  2. 首先低耦合 其次拖拽来分析
  3. 当时主要是 react问的 所以用 react代码来说明

2. 是什么 what

  1. 低耦合性是指在软件设计中,模块或组件之间的相互依赖程度较低的特性。
  2. 当组件之间的耦合性低时,它们可以独立存在、修改和测试,而不会对其他组件产生太大的影响。
  3. 低耦合性有助于提高代码的可维护性、可扩展性和可重用性。

3. 实现方式 -模块化设计:

  1. 将系统拆分成多个独立的模块,每个模块只关注自身的功能,并提供清晰的接供其他模块使用。模块之间的通信通过接口进行,而不是直接依赖于具体实现。

  • 大概代码思路

// 模块A
import { doSomething } from './moduleB';
function ModuleA() {
  // 使用模块B提供的功能
  doSomething();
  // 组件A的其他逻辑
  // ...
}
// 模块B
export function doSomething() {
  // 执行某些操作
}

4.  解耦合的通信方式:

  1. 采用解耦合的通信方式,如事件驱动发布-订阅模式,以减少模块之间的直接依赖。这样,模块之间的通信可以通过事件或消息进行,而不需要直接引用其他模块。

  • 大概代码

// 事件驱动方式
// 组件A
function ComponentA() {
  function handleClick() {
    // 触发事件
    EventBus.emit('customEvent', data);
  }
  // 组件A的其他逻辑
  // ...
}
// 组件B
function ComponentB() {
  useEffect(() => {
    // 订阅事件
    EventBus.on('customEvent', handleEvent);
    return () => {
      // 取消订阅
      EventBus.off('customEvent', handleEvent);
    };
  }, []);
  function handleEvent(data) {
    // 处理事件
    // ...
  }
  // 组件B的其他逻辑
  // ...
}

5. 依赖注入:

  1. 通过依赖注入的方式,将组件所需的依赖作为参数传递给组件,而不是在组件内部直接创建或引用依赖对象。这样可以使组件更加灵活,易于替换和测试。

  • 代码

// 父组件
function ParentComponent() {
  const dependency = {
    // 依赖对象或函数
  };
  return (
    <ChildComponent dependency={dependency} />
  );
}
// 子组件
function ChildComponent({ dependency }) {
  // 使用依赖对象或函数
  dependency.doSomething();
  // 子组件的其他逻辑
  // ...
}

6. 接口设计:

  1. 良好的接口设计可以将组件之间的耦合降到最低。接口应该简洁明确,只提供必要的功能,并尽量减少对其他模块的依赖。

  • 代码

// 接口定义
const API = {
  getData: () => {
    // 获取数据的实现
  },
  sendData: (data) => {
    // 发送数据的实现
  },
};
// 组件
function Component() {
  // 使用接口定义的功能
  API.getData();
  // 组件的其他逻辑
  // ...
}

7. 具体的 低耦合拖拽项目

  1. 上面大概了解了 低耦合项目的方式 模块化设计,解耦合的通信方式,依赖注入,接口设计
  2. 下面看下具体的 低耦合 拖拽实现 思路
  3. 定义可拖拽的元素:创建一个组件或者元素,设置其可拖拽属性,例如 draggable="true"。
  4. 监听拖拽事件:在拖拽元素上添加拖拽事件的监听器,包括 dragstart、drag 和 dragend 事件。可以通过使用事件处理函数来处理这些事件。
  5. 实现拖拽的逻辑:在 dragstart事件中,可以获取拖拽元素的数据,并将其存储到数据传输对象(DataTransfer)中。可以使用自定义的数据属性或者其他方式存储数据。
  6. 接收拖拽的目标区域:在接收拖拽的目标区域上添加相应的事件监听器,包括 dragenter、dragover、dragleave 和 drop 事件。同样可以通过事件处理函数来处理这些事件。
  7. 实现拖拽目标的逻辑:在 dragover 事件中,可以阻止默认的拖放行为,并指示浏览器允许放置操作。在 drop 事件中,可以获取拖拽元素的数据,并进行相应的处理。

import React from 'react';
const DraggableItem = ({ data, onDragStart }) => {
  const handleDragStart = (event) => {
    event.dataTransfer.setData('text/plain', JSON.stringify(data));
    onDragStart(data);
  };
  return (
    <div draggable="true" onDragStart={handleDragStart}>
      {/* 拖拽元素的内容 */}
    </div>
  );
};
const DroppableTarget = ({ onDrop }) => {
  const handleDragOver = (event) => {
    event.preventDefault();
  };
  const handleDrop = (event) => {
    event.preventDefault();
    const data = JSON.parse(event.dataTransfer.getData('text/plain'));
    onDrop(data);
  };
  return (
    <div onDragOver={handleDragOver} onDrop={handleDrop}>
      {/* 接收拖拽的目标区域的内容 */}
    </div>
  );
};
const App = () => {
  const handleDragStart = (data) => {
    // 拖拽开始时的处理逻辑
  };
  const handleDrop = (data) => {
    // 拖拽结束时的处理逻辑
  };
  return (
    <div>
      <DraggableItem data={/* 拖拽元素的数据 */} onDragStart={handleDragStart} />
      <DroppableTarget onDrop={handleDrop} />
    </div>
  );
};
export default App;
  1. DraggableItem 组件代表可拖拽的元素,DroppableTarget 组件代表接收拖拽的目标区域
  2. 通过传递相应的数据回调函数,可以在 App 组件中实现特定的拖拽行为


参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
前端开发 测试技术 容器
React 快速实现拖拽改变容器宽高度
React 快速实现拖拽改变容器宽高度
584 0
|
前端开发 JavaScript 测试技术
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
328 0
|
前端开发 API 数据安全/隐私保护
【第45期】一文解决React项目的权限管理
【第45期】一文解决React项目的权限管理
528 0
|
Web App开发 资源调度 JavaScript
竟然可以在一个项目中混用 Vue 和 React?
竟然可以在一个项目中混用 Vue 和 React?
1133 0
|
8月前
|
移动开发 前端开发 API
React 拖拽上传组件 Drag & Drop Upload
拖拽上传(Drag & Drop Upload)是现代文件上传方式,允许用户通过简单拖拽操作将文件上传至网页。本文介绍如何在React应用中实现拖拽上传组件,涵盖HTML5拖放API、React状态管理、组件构建及常见问题解决。包括视觉反馈、文件类型和大小限制等优化措施,确保组件的用户体验和稳定性。
266 27
|
8月前
|
前端开发 JavaScript UED
React 拖拽排序组件 Draggable List
在现代Web应用中,拖拽排序功能显著提升用户体验。使用React结合`react-dnd`库,可以轻松创建高效且易于维护的拖拽排序组件。通过简单的拖拽操作,用户能直观调整列表项顺序,适用于任务管理、看板工具等场景。实现步骤包括项目初始化、安装依赖、创建基础组件、添加拖拽功能及管理状态和事件。常见问题如拖拽效果不流畅、顺序未更新等可通过性能优化、正确处理索引交换等方式解决。移动端支持也需考虑,确保跨平台的良好体验。
478 25
|
8月前
|
移动开发 前端开发 数据可视化
React 拖拽布局组件 Drag & Drop Layout
本文介绍了如何在React中构建拖拽布局组件,涵盖基础知识、常见问题及解决方案。首先解释了拖拽操作的三个阶段:开始、过程中和结束。接着推荐了几个常用的拖拽库,如`react-beautiful-dnd`,并详细展示了如何使用该库创建基础拖拽组件,包括安装依赖、初始化容器和处理拖拽结束事件。文章还探讨了常见问题,如拖拽不生效、性能优化、嵌套拖拽和跨浏览器兼容性,并提供了进阶技巧,如自定义样式、多列布局和集成其他UI组件。通过这些内容,读者可以掌握构建高效拖拽布局的方法。
512 16
|
11月前
|
移动开发 前端开发 JavaScript
React DnD:实现拖拽功能的终极方案?
本文首发于微信公众号“前端徐徐”,介绍了一个强大的 React 拖拽库——React DnD。React DnD 帮助开发者轻松创建复杂的拖拽界面,适用于 Trello 风格的应用、列表重排序、可拖拽的 UI 组件等场景。文章详细介绍了 React DnD 的基本信息、主要特点、使用场景及快速上手指南。
933 3
React DnD:实现拖拽功能的终极方案?
|
10月前
|
移动开发 前端开发 API
React 拖拽组件 Drag & Drop
本文介绍了在 React 中实现拖拽功能的方法,包括使用原生 HTML5 Drag and Drop API 和第三方库 `react-dnd`。通过代码示例详细讲解了基本的拖拽实现、常见问题及易错点,帮助开发者更好地理解和应用拖拽功能。
818 10
|
运维 JavaScript 前端开发
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
204 2