vue实现图标拖拽框选功能

此博客展示了Vue中父子组件通信及数据管理的实现。通过`@changePlanData`事件处理函数,父组件`index.vue`接收并更新`PlanTime`子组件的数据。子组件`PlanTime.vue`包含一个可交互的计划时间表,用户可通过点击或拖动选择录像时段,改变数据状态。同时,使用了鼠标监听事件来处理拖拽选择操作,实现了区域选择和数据更新的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果:

QQ录屏20220718094326

index.vue

<template>
  <plan-time :planData="planData" @changePlanData="changePlanData" />
</template>
<script>
import PlanTime from "@/components/PlanTime";
const pd = [
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
];
export default {
  components: { PlanTime },
  data() {
    return {
      planData: pd,
    };
  },
  methods: {
    changePlanData(id, fv) {
      this.planData = this.planData.map((v, index) => {
        return index === id ? fv : v;
      });
    },
  },
};
</script>

PlanTime.vue

<template>
  <div class="plans-div" title="" style="user-select: none">
    <span style="color: #8e8b8b; font-style: italic; line-height: 24px">
      录像时段 蓝色表示保留 灰色表示删除 单击选择或取消
      <!--      录像时段  蓝色表示保留 灰色表示删除 单击选择或取消 单击不放滑动可快速选择 单击标题可反选行或列-->
    </span>
    <div class="plans" @mousedown="handleMouseDown">
      <div class="plan-row-header">
        <div class="plan-day plan-header" style="cursor: pointer">
          <i title="点击还原" class="fa fa-refresh"></i>
        </div>
        <div class="plan-hours">
          <!-- <div
            v-for="(item, i) 
Vue.js 是一个流行的前端框架,它并不直接提供内置的拖拽图片并自动实现框选功能,但你可以通过一些第三方库如 Vue-Draggable 或者 Element UI 的 draggable 组件来实现这个功能Vue-Draggable 可以帮助你在 Vue 中轻松地创建可拖动元素,并添加像开始、结束拖动时的行为以及实时更新位置等功能。例如,当你在图片上拖动一个标记图标时,可以监听 dragstart 和 dragend 事件,当鼠标按下并移动时,显示一个跟随鼠标的矩形框,松开鼠标则记录拖拽区域,这通常涉及到计算鼠标位置和元素的相对位置。 Element UI 的 draggable 组件也可以实现类似的功能,只需要配置好允许拖动的元素和相应的回调函数即可。 下面是基本步骤: 1. 安装所需的库: ```bash npm install vue-draggable ``` 2. 在组件中导入并使用 draggable: ```html <draggable v-model="items" @start="dragStart" @end="dragEnd"> <img :src="item.src" class="draggable-item" /> </draggable> ``` 3. 编写 Vue 实例中的数据和方法: ```javascript export default { data() { return { items: [], // 图片数组 }; }, methods: { dragStart(event) { this.dragging = true; this.startPosition = { x: event.pageX, y: event.pageY }; }, dragEnd(event) { this.dragging = false; // 计算拖拽后的区域并更新数据 let endPosition = { x: event.pageX, y: event.pageY }; const selectedArea = { start: { x: this.startPosition.x, y: this.startPosition.y }, end: { x: endPosition.x, y: endPosition.y }, }; // 更新 items 中对应图片的选择状态 }, } } ``` 4. 样式部分,你需要为拖动时显示的框选择样式,可能需要 CSS 滑块或伪元素来实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值