React 组件不会将新添加的项目附加到列表中

React component doesn't append newly added items to the list

我有一个 React 组件,可以打印出对象数组中的项目列表。每个对象可以是新创建的对象,也可以是同一个对象但更新了一些属性。

更新现有对象没有问题,但是当接收到新对象时,数组的长度增加 1,并且所有元素都成为新添加对象的副本。

这是反应组件:

{quests.map(quest => (
<div>
    <div className={styles.questTitle}>{quest.description.title}</div>
    <ul className={styles.questsList}>
    {quest.description.steps.map(step => (
        <li key={quest.id} className={styles.questStep}>{`${quest.status}/2 ${step}`}</li>
    ))}
    </ul>
</div>
))}

更新方式如下:

@action
setQuests(quest: QuestFuncReturnValue) {
// If the quest doesn't exist, append it to the quests list, else update it
const questExists = this.quests.find(oldQuest => oldQuest.id === quest.id);
if (!questExists) {
    this.quests = [...this.quests, quest];
    return;
}
const updatedQuests = this.quests.map(oldQuest => (quest.id === quest.id ? quest : oldQuest));
this.quests = updatedQuests;
console.log(this.quests);
}

我正在为状态使用 Mobx:这是数组的初始值:

@observable.ref quests: QuestFuncReturnValue[] = [];

我不确定这是否是问题所在,但在使用渲染列表的任何地方都应该有“键”。

参见 key={quest.id} 和 key={step}

{quests.map(quest => (
<div key={quest.id}>
    <div className={styles.questTitle}>{quest.description.title}</div>
    <ul className={styles.questsList}>
    {quest.description.steps.map(step => (
        <li key={step} className={styles.questStep}>{`${quest.status}/2 ${step}`}</li>
    ))}
    </ul>
</div>
))}

实际上看起来您将在更新时用相同的任务对象替换每个元素,因为:

quest.id === quest.id