我正在使用 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
陈述,所以看起来它们不是我的问题)。