У меня на карте несколько строк, которые отрисовываются массивом из состояния. Затем я снова прохожу по массиву и получаю маркеры-вершины, передавая им индекс строки (lineIndex) и их индекс в массиве строк (vertexIndex).
getLines = () => {
const { linesData } = this.state;
return linesData && linesData.length ?
linesData.map((line, i) => {
return <Polyline
key={hash(i)}
positions={line.map(vertex => vertex.map(coordinate => +coordinate))}
color={'#3f51b5'}
weight={5}
onClick={this.lineOnClick}
lineIndex={i}
/>;
})
: null;
}
И вершины.
getLineVertices = () => {
const { linesData, selectedVertex } = this.state;
const { isEditing } = this.props;
const verticesData = getLineVertices(linesData);
return verticesData && verticesData.length && isEditing ?
verticesData.map((vertex, i) => {
return <Marker
key={hash(i)}
position={vertex.coordinates}
draggable={true}
icon={isVertexSelectedCheck(selectedVertex, vertex) ? vertexIconSelected : vertexIcon}
lineIndex={vertex.lineIndex}
vertexIndex={vertex.vertexIndex}
onDrag={this.vertexDrag}
onClick={this.selectVertex}
/>;
})
: null;
}
Затем я добавляю точку, щелкнув строку
lineOnClick = (event) => {
let { selectedLine, creatingNewVertices } = this.state;
const { isEditing } = this.props;
if (isEditing) {
if (!creatingNewVertices) {
this.addVertex(event);
} else {
const newSelectedLine = { lineIndex: event.target.options.lineIndex };
this.setState({ selectedLine: newSelectedLine });
}
}
}
Когда я добавляю новую вершину, я обновляю массив linesData в состоянии, новая вершина отображается и получает индекс в опциях, но другие маркеры не пересчитали свои индексы (lineIndex, vertexIndex)! Поэтому, когда я хочу перетащить вершину на одну строку, она перетаскивает вершину на другую строку.
vertexDrag = (event) => {
const { linesData } = this.state;
const newVertexLatLng = Object.values(event.target._latlng);
const lineIndex = event.target.options.lineIndex;
const vertexIndex = event.target.options.vertexIndex;
const newLinesData = [...linesData];
newLinesData[lineIndex][vertexIndex] = newVertexLatLng;
this.setState({ linesData: newLinesData });
};
Надеюсь, я достаточно ясно объяснил. Как я могу исправить такое поведение?