J'essaie de comprendre pourquoi je suis incapable de mettre à jour l'état dans l'exemple ci-dessous. Calling Quelqu'un pourrait-il m'aider s'il vous plaît à comprendre cela? P> J'ai reproduit le problème sur CodePen ici < / p> SupprimerFromOrder CODE> fonctionne directement comme prévu, mais dès que je l'appelle à partir de
déducteurCount code>, l'état ne sera-t-il pas à jour.
4 Réponses :
Il vous manque l'essentiel, alors vous appelez le déductionCount code>, vous mettez à jour deux fois la commande
Je pense que vous n'avez pas besoin d'appeler RemoveFromOrderOrder () à l'intérieur de la fonction déductordercount () car il mettra à jour l'état deux fois en tant que mise à jour deux fois donnera à deux étages p>
C'est parce que vous devriez retourner cette fonction.ReMoveFromOrderOrder () pour ne plus mettre de côté après l'avoir appelé. P>
si inséré de:
aller avec:
si (commande] === 0) this.removefromorder (clé) // Supprimer l'ordre [Touche] Code> P>
si (commande [touche] === 0) renvoie ceci.removefromorder (clé) // Supprimer l'ordre [Touche] Code> P>
Merci pour les réponses, effectivement je mettais à jour l'État deux fois. Je dois le voir en ajoutant juste un Settimeout ((() => {this.setstate ({commande})}, 3000) code> dans
déducteurCount code>. Et puis j'ai vu que l'article a été retiré de l'état une fois que
Retirezfromorder code> a été invoqué, puis est apparu à nouveau.
class Order extends React.Component {
renderOrder = (key) => {
const item = this.props.items[key];
const count = this.props.order[key];
return (
<li key={key}>
{count} pieces of {item.name}
<button onClick={() => this.props.deductOrderCount(key)}>−</button>
<button onClick={() => this.props.removeFromOrder(key)}>×</button>
</li>
)
}
render() {
const orderIds = Object.keys(this.props.order);
return (
<div>
{orderIds.map(this.renderOrder)}
</div>
);
}
}
class App extends React.Component {
state = {
items: { item1: { name: 'chocolate', price: 100}, item2: { name: 'bread', price: 50}},
order: { item1: 3, item2: 2 }
};
removeFromOrder = key => {
// 1. take a copy of state
const order = { ...this.state.order };
// 2. remove item from order
delete order[key];
// 3. call setState to update our state object
this.setState({ order });
};
deductOrderCount = (key) => {
// 1. take a copy of state
const order = { ...this.state.order };
// 2. deduct 1 from the count and when it hits 0 remove from the order
order[key] = (order[key] > 1) ? (order[key] - 1) : 0;
if (order[key] === 0) this.removeFromOrder(key); //delete order[key]
// 3. call setState to update our state object
setTimeout(() => {this.setState({ order })}, 3000)
}
render() {
return (
<div>
<Order
order={this.state.order}
items={this.state.items}
removeFromOrder={this.removeFromOrder}
deductOrderCount={this.deductOrderCount}
/>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("main"));
Sur
commande [clé] === 0 code> Vous mettez à jour l'état deux fois, une fois à partir de
revefromorder code>, puis vous le remplacez avec
this.setstate ({commande}) < / code>