I\'m looking to modify and array in react and insert elements on specific index. This is how my state looks like:
this.state = {arr: [\'\', \'\', \'\', \'\' ]}
<
use spread operator https://codeburst.io/javascript-es6-the-spread-syntax-f5c35525f754
let newChild = "newChild"
this.setState({
children: [
...this.state.children,
newChild
]
})
Clone the current state using slice(). By doing this, the original state remains unaffected till setState(). After cloning, do your operations over the cloned array and set it in the state. The previous answer will mutate the state. Read about this here
let a = this.state.arr.slice(); //creates the clone of the state
a[index] = "random element";
this.setState({arr: a});
Two Ways to do:
NOTE: It is not allowed to use the array push method, because it mutates the array. It doesn’t leave the array intact but changes it. Instead, there should be a new array created which is used to update the state.
Array concat method creates a new array, leaving the old array intact, but also returning a new array from it.
this.state = {
value: '',
list: ['a', 'b', 'c'],
};
this.setState(state => {
const list = state.list.concat(state.value);
return {
list,
value: '',
};
});
this.state = {
value: '',
list: ['a', 'b', 'c'],
};
this.setState(state => {
const list = [...state.list, state.value]; <--insert in end -->``
const list = [state.value, ...state.list]; <--Or insert in start -->
return {
list,
value: '',
};
});
Reference : https://www.robinwieruch.de/react-state-array-add-update-remove/
UPDATE
Just use Object.assign() as suggested here to make a copy of your state.
Thus, you can do it as follows :
let new_state = Object.assign({}, this.state);
let a = new_state.arr;
a[index] = "random element";
this.setState({arr: a});
Hope it helps.
Immer is a common dependency to help with this kind of thing. In this example, you would do something like
import {useImmer} from "use-immer"
export default function MyComponent(props) {
const [state, setState] = useImmer({arr: ['', '', '', '' ]})
// .... some time later
setState(draft => {
draft.arr[index] = newValue
})
}
And Immer will take care of making sure that your state is updated immutably and correctly.