Was genau meinen sie? Wenn ich it richtig verstehe, kann ich nicht verwenden, wenn this.state
neuen Zustand zu berechnen, es sei denn ich eine Funktion als ersten Parameter setState()
passieren:Statusaktualisierungen können asynchron sein
// Wrong
this.setState({a: f(this.state)});
// Correct
this.setState(prevState => {return {a: f(prevState)}});
Aber ich this.state
was zu entscheiden, verwenden können, um zu tun:
if (this.state.a)
this.setState({b: 2});
Was ist mit Requisiten?
// Correct or wrong?
this.setState({name: f(this.props)});
Und angeblich kann ich nicht erwarten, dass this.state
nach this.setState
Aufruf zu ändern:
this.setState({a: 1});
console.log(this.state.a); // not necessarily 1
Dann sage ich eine Liste von Benutzern haben. Und ein wählen, wo ich aktuelle Benutzer machen kann:
export default class App extends React.Component {
...
setCurrentUserOption(option) {
this.setState({currentUserOption: option});
if (option)
ls('currentUserOption', option);
else
ls.remove('currentUserOption');
}
handleAddUser(user) {
const nUsers = this.state.users.length;
this.setState(prevState => {
return {users: prevState.users.concat(user)};
},() => {
// here we might expect any number of users
// but if first user was added, deleted and added again
// two callbacks will be called and setCurrentUserOption
// will eventually get passed a correct value
// make first user added current
if (! nUsers)
this.setCurrentUserOption(this.userToOption(user));
});
}
handleChangeUser(user) {
this.setState(prevState => {
return {users: prevState.users.map(u => u.id == user.id ? user : u)};
},() => {
// again, we might expect any state here
// but a sequence of callback will do the right thing
// in the end
// update value if current user was changed
if (_.get(this.state, 'currentUserOption.value') == user.id)
this.setCurrentUserOption(this.userToOption(user));
});
}
handleDeleteUser(id) {
this.setState(prevState => {
return {users: _.reject(prevState.users, {id})};
},() => {
// same here
// choose first user if current one was deleted
if (_.get(this.state, 'currentUserOption.value') == id)
this.setCurrentUserOption(this.userToOption(this.state.users[0]));
});
}
...
}
Haben alle Rückrufe in Folge für Charge von Änderungen in dem Zustand ausgeführt werden, wurde angewandt?
Auf den zweiten Gedanken, setCurrentUserOption
ist im Grunde wie setState
. Änderungen werden in this.state
eingereiht. Selbst wenn Callbacks nacheinander aufgerufen werden, kann ich nicht darauf vertrauen, dass this.state
durch vorherigen Callback geändert wird, kann ich? So ist es nicht am besten sein könnte setCurrentUserOption
Methode zu extrahieren:
handleAddUser(user) {
const nUsers = this.state.users.length;
this.setState(prevState => {
let state = {users: prevState.users.concat(user)};
if (! nUsers) {
state['currentUserOption'] = this.userToOption(user);
this.saveCurrentUserOption(state['currentUserOption']);
}
return state;
});
}
saveCurrentUserOption(option) {
if (option)
ls('currentUserOption', option);
else
ls.remove('currentUserOption');
}
So kann ich von Änderungen kostenlos currentUserOption
erhalten Schlange stehen.
Nur doppelte Überprüfung verwenden Sie alle staatlichen Management-Frameworks wie Redux oder Flussmittel? Antwort könnte je nach – aug
ich werde gehen. Aber jetzt möchte ich es ohne Redux machen. –