Обычно я пытаюсь переместить один объект в массиве объекта, но когда я перемещаю один и тот же объект один или два раза, он начинает перемещать другой объект в указанном массиве.
Итак, я попытался создать новый массив с .slice (), затем .shift (item) по индексу, а затем добавить его обратно по правильному индексу с помощью .splice (newIndex, 0, item), как только массив получит После обновления я отправляю его в магазин Redux, который обновляет мое приложение Megadraft (т.е. Draft.js).
Я также пытался напрямую манипулировать исходным массивом, то есть this.props.array (как вы имели в виду и в Redux), и использовать ключи внутри объектов вместо индексов.
import React from 'react';
import { MegadraftPlugin, DraftJS, CommonBlock } from "megadraft"
export default class ImageGalleryBlock extends React.Component {
_moveImgOneBack = (e, images, index) =>{
e.preventDefault()
let newPlace = index - 1
if(newPlace == -1){
newPlace = images.length
}
const image = images.shift(index)
images.splice(newPlace, 0, image)
return this.props.container.updateData({ images: images })
}
_moveImgOneForward = (e, images, index) =>{
e.preventDefault()
let newPlace = index +1
if(newPlace > images.length){
newPlace = 0
}
const image = images.shift(index)
images.splice(newPlace, 0, image)
return this.props.container.updateData({ images: images })
}
render(){
return (
<CommonBlock {...this.props} actions={this.actions} title="Image
Gallery">
<BlockContent>
<div className='gallery-cms-block'>
{ this.props.images.map((obj, index)=> {
return(
<div key={obj.key} className="image-box">
<button title="Move image back one" className="move-button"
onClick={(e)=> this._moveImgOneBack(e,
this.props.data.images, index)}>◀ {index}</button>
<img className="image" src={`${obj.image.uri}?
id=${obj.image.id}`} />
<div>
<button key={obj.key} title="Move image forward one"
className="move-button" onClick={(e)=>
this._moveImgOneForward(e, this.props.data.images,
index)}>▶</button>
</div>
</div>
)
}) }
</div>
</BlockContent>
</CommonBlockMKII>
);
}
}
Я ожидаю, что кнопка (эфир вперед или назад) переместит указанный элемент и только указанный элемент.
Результатом является то, что он будет перемещать элемент один раз ... может быть, дважды, а затем сосет, перемещая все остальные элементы в массиве.