Вы должны использовать $merge
вместо $set
.
$set
заменить объект
$merge
заменить или добавить свойство, но сохранить свойства объекта
Но проблема в том, что вам нужно включить позицию в массив, возможно вам понадобится, чтобы draftboard
был бы объектом вместо массива:
Я дам оба решения:
- Продолжите с эта структура:
// state structure
state = {
draftboard: [
{
1: {team:'', player: ''}
},
{
2: {team:'', player: ''}
},
{
3: {team:'', player: ''}
},
{
4: {team:'', player: ''}
}
]
}
// Test it in componentDidMount and it works
componentDidMount() {
// this will change position 0 in `draftboard` and key 1 inside the object
this.setState(
prevState =>
update(prevState, {
draftboard: {
0: {
1: {
$merge: {
team: "hey"
}
}
}
}
}),
() => {
// this will change position 1 in `draftboard` and key 2 inside the object
this.setState(prevState =>
update(prevState, {
draftboard: {
1: {
2: {
$merge: {
team: "how"
}
}
}
}
})
);
}
);
}
// state structure
state = {
draftboard: {
1: { team: "", player: "" },
2: { team: "", player: "" },
3: { team: "", player: "" }
}
};
// Test it in componentDidMount and it works
componentDidMount() {
this.setState(
prevState =>
update(prevState, {
draftboard: {
1: {
$merge: {
team: "team1"
}
}
}
}),
() => {
this.setState(prevState =>
update(prevState, {
draftboard: {
1: {
$merge: {
player: "team1"
}
}
}
})
);
}
);
}
Теперь, если вы хотите изменить свойства числа во втором примере на строки, окончательно структура
// state structure
state = {
draftboard: {
pick1: { team: "", player: "" },
pick2: { team: "", player: "" },
pick3: { team: "", player: "" }
}
};
// update structure
// We will change property player of key `pick1` in draftboard
this.setState(prevState =>
update(prevState, {
draftboard: {
['pick1']: {
$merge: {
player: "team1"
}
}
}
})
);