Skip to main content

如何在 Vue 中更改节点的 zIndex?

如何在 vue-konva 中更改 zIndex 并重新排序组件?

当你直接使用 Konva 时,有许多方法可以更改节点的顺序,比如 node.zIndex(5)node.moveToTop() 等。有关更多详细信息,请参见 分层教程

然而,在使用 Vue 时,建议遵循 Vue 的声明式方法,而不是使用这些命令式的方法。

vue-konva 精确遵循你在 <template> 中描述的节点顺序。你不应该手动更改 zIndex,而应该更新应用的数据,以使 <template> 中的组件保持正确的顺序。

示例展示了如何:

  1. 创建一个具有随机位置和颜色的圆形数组
  2. 处理拖拽事件以更新形状的视觉顺序
  3. 通过调整数组顺序来维护正确的堆叠顺序
  4. 遵循 Vue 的响应式系统进行状态管理

记住:不要为你的画布组件使用 zIndex 属性。相反,依赖于模板和数据结构中元素的顺序。

操作说明:尝试拖动一个圆形。当你开始拖动时,它将自动移动到堆栈的顶部。这是通过在我们的数据中调整圆形数组实现的,而不是手动更改 zIndex。

<template>
  <v-stage :config="stageSize">
    <v-layer>
      <v-circle
        v-for="item in items"
        :key="item.id"
        :config="item"
        @dragstart="handleDragstart"
        @dragend="handleDragend"
      />
    </v-layer>
  </v-stage>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import Konva from 'konva';

const stageSize = {
  width: window.innerWidth,
  height: window.innerHeight
};

const items = ref([]);
const dragItemId = ref(null);

const generateItems = () => {
  const newItems = [];
  for (let i = 0; i < 10; i++) {
    newItems.push({
      x: Math.random() * stageSize.width,
      y: Math.random() * stageSize.height,
      radius: 50,
      id: "node-" + i,
      fill: Konva.Util.getRandomColor(),
      draggable: true
    });
  }
  return newItems;
};

const handleDragstart = (e) => {
  // 保存拖动的元素:
  dragItemId.value = e.target.id();
  // 通过重新排列 items 数组将当前元素移动到顶部:
  const item = items.value.find(i => i.id === dragItemId.value);
  const index = items.value.indexOf(item);
  items.value.splice(index, 1);
  items.value.push(item);
};

const handleDragend = () => {
  dragItemId.value = null;
};

onMounted(() => {
  items.value = generateItems();
});
</script>