объектов, где каждый объект это слово, которое рендерится и отображается, нужно добавить возможность добавлять новые слова после конкретного элемента.
Я добавил функцию при клике на слово, выбранный объект добавляется в стейт (что бы понять какой сейчас активный)
При попытке добавить новое слово, в метод приходит новый объект (который нужно добавить в след за активным). Нужно найти активный объект в массиве, узнать его индекс и после чего добавить за ним новый объект.
Один из вариантов, это сделать через array.splice(index + 1, 0, {newObj}
И потом этот массив снова записать в стейт.
Но splice мутирует мой массив, есть ли ещё какие то варианты?
[...array, item]
И как ты с помощью спреда запишешь новый объект в нужное место?
а, тебе не в конец. Тогда можешь через map либо reduce
Верная идея со сплайсом, но вначале скопируй исходный массив
Ну я сделал, const new = array.slice() для копии Потом const index = new.map(x => x.Id).indexOf(activeObj.Id) Это возвращает индекс. Потом new.splice(index + 1, 0, {newObj} Потом мой new пытаюсь записать в стейт
Через slice() или просто [...old]
Без разницы, вот выше укзали верный вариант
И активное слово получается нужно обнулять, так как его индекс уже другой?
Сетай в стейт не слово а активный индекс сразу
я сетаю целый обьект, в котором и слово и его ID. а по поводу индекса, а какая разница, искать индекс и сетать его на моменте клика на слово или на моменте добавить что-то после слова?
Индекс можно сразу прокинуть в замыкании из мапа
подскажи пожалуйста, а с чем может быть связано то, что индекс внутри метода который добавляет старый, а не новый? у меня получается делиться на родителя и ребенка логика. внутри ребенка они мапяться и есть метод который слушает нажание на кнопку и если нажали вызывает колбэк родителя и передает обьект (что за кнопка и тд) в родителе внутри метода, я проверяю ActiveIndex который находится внутри стейта и делаю уже, то, что писал ранее: if (activeIndex >= 0) { const newEquation = [...equation].splice(activeIndex + 1, 0, keyEvent); setEquation(newEquation); setActiveIndex(null); } а метод который сетит активное находится у каждого слова, при мапе внутри компонента ребенка, onClick={() => setActiveIndex(index)} почему когда я выбираю первый раз слово, индекс сетиться, добавляется в массив и все окей, а при выборе следующего слова, индекс старый и добавляется не в то место?
Так сложно, нужен сендбокс
Обсуждают сегодня