typescript 为什么当我用mobx action获取任务时,我的数据被复制了?

wmvff8tz  于 2023-01-18  发布在  TypeScript
关注(0)|答案(2)|浏览(105)

我有一个待办事项列表应用程序,当组件呈现时,我试图从后端获取任务。但是,数据是重复的,我不明白为什么。可能是因为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();
n6lpvg4x

n6lpvg4x1#

这是由于开发中的React默认启用了严格模式
https://reactjs.org/docs/strict-mode.html
这意味着捕捉与此完全类似的场景,其中额外的重新渲染可能会导致问题。
为了解决这个问题,你应该在每次取任务时重新初始化tasks数组。

@action fetchTasks = async () => {
  try {
    const response: any = await axios.get('http://localhost:5000/test');
    this.tasks = response.data.recordset;
  } catch (error) {
    console.error(error);
  }
};
v8wbuo2f

v8wbuo2f2#

我怀疑它是因为taskStore.tsthis.tasks.push(...response.data.recordset);中的这一行而重复的。请尝试this.tasks = [...response.data.recordset];。如果fetch调用的行为不像无限滚动,则此方法是最佳解决方案,在我看来,当useEffect运行两次时,它不会在开发模式下重复数据

相关问题