javascript - 从事件中获取 vue 组件

标签 javascript typescript vue.js vuejs2

我正在我的应用程序中构建拖放功能,拖放区域如下所示:

<template>
  <div class="layers-panel" @dragover="onDragOver" @drop="onDragDrop">
    <layer
      v-for="(layer, index) in layers"
      :key="layer.name"
      :info="layer"
      :offset="index"
      ref="layer"
    ></layer>
  </div>
</template>

然后可拖动的项目看起来像这样:

<template>
  <div class="layer" draggable="true" @dragstart="onDragStart">
    <!-- Content of draggable element -->
  </div>
</template>

在我的拖动事件中,我想获取元素相关的当前组件,所以当我将一个项目拖动到 <div class="layer"...> 上时element 我想得到那个组件。我不确定如何访问它,因为一个事件被传递给了 @dragover="onDragOver"事件只允许我访问 html 元素而不是 Vue 组件。

这就是我现在的dragover事件看起来像:

    public onDragOver(evt: DragEvent) {
      evt.preventDefault()
      if (!evt.target) return
      let layer = (evt.target as HTMLElement).closest('.layer') as HTMLElement
    }

如何获取该元素所属的组件?

最佳答案

Vue 当然可以让你 access a component instance但是我认为没有必要实现您的实际目标:通过拖放重新排序组件。

拖放意味着我们受限于 DragEvent 提供的内容:

您无法确定元素的放置位置,因为您放置的元素包含所有层。相反,如果每一层都是一个放置元素,那么您可以通过 dragover 确定它是哪一层。通过 event.target

我们还需要确定哪个元素对应于我们正在拖放的 layers 数组。这可以通过将每个 layer 的索引绑定(bind)为一个属性来实现,这样我们就可以通过 event.target 访问它。

为简单起见,我将使用 id 属性,以便稍后可以通过 event.target.id 访问它:

<div
  v-for="(layer, idx) in layers"
  :key="idx"
  :id="idx"
  draggable="true"
  @dragstart="dragstart"
>
  <div
    :id="idx"
    class="draggable"
    @dragover="dragover"
    @drop="drop"
  >
    {{ layer }}
  </div>
</div>

请注意,我将相同的索引绑定(bind)到 id,以便我可以正确识别目标层。

我们还需要确保我们可以识别被拖动的元素,因为在 drop 上我们将仅通过 event.target 放置元素。我们可以通过在第一次开始拖动时在 DataTransfer 中设置数据来做到这一点:

dragstart(event) {
  event.dataTransfer.setData("selectedIdx", event.target.id);
},

现在在 drop 上,我们可以访问两者并可以根据需要操作 layers:

drop(event) {
  var selectedIdx = event.dataTransfer.getData("selectedIdx");
  var targetIdx = event.target.id;
  var selected = this.layers.splice(selectedIdx, 1)[0];
  this.layers.splice(targetIdx, 0, selected);
},

Example codepen

关于javascript - 从事件中获取 vue 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58964476/

相关文章:

javascript - 如何根据包含所有信息的对象数组绘制成绩图表?

javascript - 自动完成仅显示来自特定国家或邮政编码的结果

javascript - 如何在 Angular JS 中将特定的 JSON 数据从一个工厂传递到另一个工厂?

typescript - 在 VS Code 中调试不适用于 Typescript Vue 应用程序

javascript - Vue 3 + vue-i18n-next : what am I doing wrong?

javascript - 如何居中和调整jqwidget模拟时钟的大小?

angular - 在 npm 包中引用本地文件

angular - 在 Angular 组件包装器中创建电话文本框

typescript - TypeError : this. postgres.Pool 不是构造函数

vue.js - 如何使用 props 和 slots 的默认值扩展 Vue 组件?