我有一个待办事项列表应用程序,当组件呈现时,我试图从后端获取任务。但是,数据是重复的,我不明白为什么。可能是因为useEffect钩子被调用了两次吗?我怀疑是因为当可观察到的变化时,观察者重新呈现,所以它可能会被第二次调用,但这样不会变成一个无限循环吗?所以我不太明白。
TaskList.tsx:
const TaskList = () => {
const [update, setUpdate] = useState<string>('');
useEffect(() => {
TaskStore.fetchTasks();
}, []);
const onChangeValue = (e: any) => {
console.log(e);
setUpdate(e.target.value);
};
return (
<div>
<p>
update input <input onChange={onChangeValue} value={update} />
</p>
{TaskStore.tasks.map((value: any, key) => {
console.log(value);
return (
<div>
<p>
{value.task}
<DeleteTask value={value} taskList={TaskStore} />
<UpdateTask value={update} current={value} taskList={TaskStore} />
</p>
</div>
);
})}
</div>
);
};
export default observer(TaskList);
taskStore.ts:
interface Task {
task: string;
}
class TaskStore {
constructor() {
makeAutoObservable(this);
}
tasks = [] as Task[];
@action fetchTasks = async () => {
try {
const response: any = await axios.get('http://localhost:5000/test');
this.tasks.push(...response.data.recordset);
} catch (error) {
console.error(error);
}
};
}
export default new TaskStore();
2条答案
按热度按时间n6lpvg4x1#
这是由于开发中的React默认启用了严格模式。
https://reactjs.org/docs/strict-mode.html
这意味着捕捉与此完全类似的场景,其中额外的重新渲染可能会导致问题。
为了解决这个问题,你应该在每次取任务时重新初始化tasks数组。
v8wbuo2f2#
我怀疑它是因为taskStore.ts
this.tasks.push(...response.data.recordset);
中的这一行而重复的。请尝试this.tasks = [...response.data.recordset];
。如果fetch调用的行为不像无限滚动,则此方法是最佳解决方案,在我看来,当useEffect
运行两次时,它不会在开发模式下重复数据