J'utilise Preact (à toutes fins utiles, React) pour rendre une liste d'éléments, sauvegardés dans un tableau d'état. Chaque élément a un bouton "remove" à côté de lui. Mon problème est le suivant : lorsque le bouton est cliqué, l'élément approprié est supprimé (je l'ai vérifié plusieurs fois), mais les éléments sont rendus à nouveau avec l'attribut dernier manquant, et celui qui a été enlevé est toujours là. Mon code (simplifié) :
import { h, Component } from 'preact';
import Package from './package';
export default class Packages extends Component {
constructor(props) {
super(props);
let packages = [
'a',
'b',
'c',
'd',
'e'
];
this.setState({packages: packages});
}
render () {
let packages = this.state.packages.map((tracking, i) => {
return (
<div className="package" key={i}>
<button onClick={this.removePackage.bind(this, tracking)}>X</button>
<Package tracking={tracking} />
</div>
);
});
return(
<div>
<div className="title">Packages</div>
<div className="packages">{packages}</div>
</div>
);
}
removePackage(tracking) {
this.setState({packages: this.state.packages.filter(e => e !== tracking)});
}
}
Qu'est-ce qui ne va pas ? Dois-je procéder à un re-rendu actif d'une manière ou d'une autre ? S'agit-il d'un cas n+1 d'une manière ou d'une autre ?
Clarification : Mon problème n'est pas la synchronicité de l'État. Dans la liste ci-dessus, si je choisis de supprimer "c", l'état est correctement mis à jour et devient ['a','b','d','e']
mais les composants rendus sont ['a','b','c','d']
. A chaque appel à removePackage
la bonne est retirée du tableau, l'état correct est affiché, mais une liste erronée est rendue. (J'ai supprimé le console.log
afin de ne pas donner l'impression qu'il s'agit de mon problème).