Я использую состояние реакции (v0.14), чтобы удерживать пары значений значений несохраненных идентификаторов и пользовательских объектов. Например:Правильный способ удаления ключа из состояния реакции
onChange = (user, field) => {
return (event) => {
let newUser = _.clone(this.state[user.uuid] || user);
_.assign(newUser, {[field]: event.target.value});
this.setState({
[user.uuid]: newUser
});
}
}
render() {
let usersJsx = users.map((user, i) => {
return <div key={i}>
<input type="text" value={user.name}
onChange={this.onChange(user, 'name')}/>
</div>;
});
let numberUnsavedUsers = _.keys(this.state).length;
// ... etc
}
Это все работает отлично, пока я не пришел к методу сохранения:
persistUsers = (event) => {
let unsavedUsers = _.toArray(this.state);
updateUsers(unsavedUsers, {
onSuccessCb: (savedUsers) => {
// Would prefer to remove these two lines and replace
// with `this.setState({});` but this doesn't work... i.e.
// the state is left untouched rather than being
// replaced with `{}`. This makes sense. I guess I was hoping
// someone might point me towards a this.replaceState()
// alternative.
this.setState({nothing: true}); // triggers a state change event.
this.state = {}; // wipes out the state.
}
});
}
Я искал вокруг, но только нашли людей, изменяющих вложенные объекты или массивы и ключевые значения не верхнего уровня.
Yeah @zerkms Я думаю, что единственным способом обойти это было бы поместить всех несохраненных пользователей в объект в состоянии, например: 'this.state = {unsavedUsers: {}};' Этот способ, вызывающий это. setState ({unsavedUsers: {}}) должен работать. – AJP
вы не сможете называть 'this.state = {something}' в будущем, он будет бросать. –