Mobx - 更改依赖项列表中的项时不执行 UseEffect 挂钩

时间:2021-03-02 17:32:03

标签: reactjs use-effect mobx

我是 React 和 Mobx 的新手。

我希望在更改日期时执行下面代码中的 useEffect 钩子。日期变量位于商店内。每当我更改日期时,我都希望我的组件中的 useEffect 执行,但它仅在组件首次初始化时执行。

我将商店添加为 useEfftcts 依赖项列表中的一个项目,但没有运气。任何帮助将不胜感激。

这是我的组件

const TeamDashboard: React.FC<IProps> = ({ teams, teamName, teamSchedule }) => {
  const teamsStore = useContext(TeamsStore);
  const datesStore = useContext(DatesStore);

  let teamIds: number[] = [];

  useEffect(() => {
    teams.map((team) => {
      teamIds.push(team.id);
    });

    teamsStore.loadScheudle(
      teamSchedule,
      teamIds,
      datesStore.startDate,
      datesStore.endDate
    );
  }, [datesStore]);

  return (
    <Container></Container>
  );
};
export default observer(TeamDashboard);

这是我的日期商店

class DatesStore {
    @observable startDate: Date = new Date();
    @observable endDate: Date = new Date('2021-04-05');

    @action setStartDate = (event: any, data: any, ) => {
        data.value > this.endDate
        ? this.startDate = new Date()
        : this.startDate = data.value === null ? seasonStartDate : data.value;
    }

    @action setEndDate = (event: any, data: any) => {
        console.log(data.value);
        this.endDate = data.value === null ? seasonEndDate : data.value;
    }
}

export default createContext(new DatesStore())

2 个答案:

答案 0 :(得分:0)

我认为您的问题是 datesStore 根本没有改变,对象是相同的,但里面的值正在改变。

您可以尝试像这样更改您的依赖项:

useEffect(()=>{//your function body}, [datesStore.startDate, datesStore.endDate]);

答案 1 :(得分:0)

使用 Mobx 版本 6 中的 makeAutoObservable 并删除 action 和 observables 装饰器,解决了当我的商店中的日期更改时要执行的 useEffect。 下面是我的代码现在是如何设置的。

日期存储

export default class DatesStore {
    startDate: Date = new Date();
    endDate: Date = new Date();

    constructor() {
        this.endDate.setDate(this.startDate.getDate() + parseInt('30'));
        makeAutoObservable(this);
    }

    setStartDate = (event: any, data: any, ) => {
        data.value > this.endDate
        ? this.startDate = new Date()
        : this.startDate = data.value === null ? seasonStartDate : data.value;
    }

    setEndDate = (event: any, data: any) => {
        this.endDate = data.value === null ? seasonEndDate : data.value;
    }
}

存储所有存储的根存储和一个自定义钩子以在我的组件中使用存储

interface Store {
    teamsStore: TeamsStore,
    datesStore: DatesStore
}

export const store: Store = {
    teamsStore: new TeamsStore(),
    datesStore: new DatesStore()
}

export const StoreContext = createContext(store);

export function useStore() {
    return useContext(StoreContext)
}

有问题的组件

const TeamDashboard: React.FC<IProps> = ({ teams, teamName, teamSchedule }) => {
  const { teamsStore, datesStore } = useStore();

  teams.slice().sort((a, b) => b.points - a.points);
  let teamIds: number[] = [];

  useEffect(() => {
    teams.map((team) => {
      teamIds.push(team.id);
    });

    teamsStore.loadScheudle(
      teamSchedule,
      teamIds,
      datesStore.startDate,
      datesStore.endDate
    );
  }, [datesStore.startDate, datesStore.endDate]);

  return (
    <Container></Container>
  );
};
export default observer(TeamDashboard);