我正在使用 Preact(出于所有意图和目的,React)来呈现保存在状态数组中的项目列表。每个项目旁边都有一个删除按钮。我的问题是:单击按钮时,删除了正确的项目(我验证了几次),但是项目被重新渲染,最后一个项目丢失了,被删除的项目仍然存在。我的代码(简化):
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)});
}
}
我究竟做错了什么?我是否需要以某种方式主动重新渲染?这是一个 n+1 的情况吗?
澄清:我的问题不在于状态的同步性。在上面的列表中,如果我选择删除“c”,则状态会正确更新为['a','b','d','e']
,但呈现的组件是['a','b','c','d']
。每次从数组中删除正确的调用时,removePackage
都会显示正确的状态,但会呈现错误的列表。(我删除了这些console.log
陈述,所以看起来它们不是我的问题)。