跳到主要内容

如何使用 React 更改节点的 zIndex?

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

直接使用 Konva 时,可以通过多种方法更改节点顺序,例如 node.zIndex(5)node.moveToTop() 等。请参阅 教程

但使用 React 框架时,不建议使用这些方法。

react-konva 严格遵循组件中定义的节点顺序。因此,不要手动更改 zIndex,只需正确更新应用 state。

不要为 Canvas 组件使用 zIndex

如果要将节点临时移动到另一个容器,例如显示覆盖层,请参阅 Canvas Portal 示例

操作说明:尝试拖动圆形。观察它如何移动到最上层。此示例通过操作 state,使组件按正确顺序渲染。

import React, { Component } from 'react';
import Konva from 'konva';
import { Stage, Layer, Circle } from 'react-konva';

function generateItems() {
const items = [];
for (let i = 0; i < 10; i++) {
items.push({
x: Math.random() * window.innerWidth,
y: Math.random() * window.innerHeight,
id: 'node-' + i,
color: Konva.Util.getRandomColor(),
});
}
return items;
}

const App = () => {
const [items, setItems] = React.useState(generateItems());

const handleDragStart = (e) => {
const id = e.target.name();
const itemsCopy = items.slice();
const item = itemsCopy.find((i) => i.id === id);
const index = itemsCopy.indexOf(item);
// remove from the list:
itemsCopy.splice(index, 1);
// add to the top
itemsCopy.push(item);
setItems(itemsCopy);
};

const onDragEnd = (e) => {
const id = e.target.name();
const itemsCopy = items.slice();
const item = items.find((i) => i.id === id);
const index = items.indexOf(item);
// update item position
itemsCopy[index] = {
...item,
x: e.target.x(),
y: e.target.y(),
};
setItems(itemsCopy);
};

return (
<Stage width={window.innerWidth} height={window.innerHeight}>
<Layer>
{items.map((item) => (
<Circle
key={item.id}
name={item.id}
draggable
x={item.x}
y={item.y}
fill={item.color}
radius={50}
onDragStart={handleDragStart}
onDragEnd={onDragEnd}
/>
))}
</Layer>
</Stage>
);
};

export default App;