问题描述
我是 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())
解决方法
我认为您的问题是 datesStore
根本没有改变,对象是相同的,但里面的值正在改变。
您可以尝试像这样更改您的依赖项:
useEffect(()=>{//your function body},[datesStore.startDate,datesStore.endDate]);
,
使用 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.endDate]);
return (
<Container></Container>
);
};
export default observer(TeamDashboard);