#javascript #arrays #reactjs #react-hooks #use-state
Вопрос:
Я пытаюсь добавить объект в определенную точку в моем массиве «данные», который находится в этом состоянии компонентов. Следующее не работает, массив просто опустошается.
addNewBulletAfterActive = () => {
const array = this.state.data;
const newBulletPoint = {
id: this.state.data.length = 1,
title: 'Click to add'
};
const newData = array.splice(this.state.activeBulletPointId, 0, newBulletPoint);
this.setState({
data: newData
});
}
Идея заключается в том, что если у меня есть список из 10 пунктов, пользователь может нажать на 4-й пункт и нажать enter, чтобы добавить новый пункт сразу после этого. У меня не было никаких проблем с добавлением элементов в конец массива, но похоже, что .splice вызывает проблемы.
Ответ №1:
Я считаю, что это должно сделать то, что вам нужно.
function addAfter(array, index, newItem) {
return [
...array.slice(0, index),
newItem,
...array.slice(index)
];
}
Эта функция возвращает новый массив с новым элементом, вставленным в середину. Он не изменяет ваш исходный массив и поэтому будет хорошо работать с состоянием компонента и его исправлением.
Затем вы можете назначить выходные данные этой функции своему состоянию.
Комментарии:
1. Я думаю, что этот ответ должен быть принят
Ответ №2:
splice
возвращает сращенные элементы (которые пусты, так как вы сращиваете 0 элементов) и изменяет исходный массив.
const newData = array.slice(0); // copy
newData.splice(this.state.activeBulletPointId, 0, newBulletPoint);
this.setState({
data: newData
});
Комментарии:
1.
splice
изменит состояние, что, как правило, является плохой практикой2. @Валентин, я добавил срез перед сращиванием 🙂
3. Пока это единственный ответ, который на самом деле объясняет, почему код операции не сработал.
4. Это именно то, чего я добивался. Спасибо @YuryTarabanko
Ответ №3:
Я думаю, что это может быть более простым и быстрым способом сделать это
/*Just plain JS*/
function AddAfter(array, newObject){
array.unshift(newObject);
}
/*In react If updating state*/
var _prev = this.state.your_array; //getting the current value for the state object
var newInfo = {id: 1, more: 'This is a new object'};
_prev.unshift(newInfo);