问题描述
useEffect
不会在第二次更改时触发,但会在启动时触发两次(React 钩子和 apollo-graphql 钩子)。
在 console.logs 中,我描述了何时触发更改以及何时不触发。
我没有更多线索可以添加。
import React,{ useEffect,useState } from 'react'
import Calendar from '../components/Calendar';
import { useHallsQuery } from '../generated/graphql';
const schedule = () => {
const { data,loading,error,refetch:refetchSessions } = useHallsQuery();
const [sessions,setSessions] = useState([] as any);
const [owners,setowners] = useState([] as any);
useEffect(() => {
console.log('On launch trigger twice,on first change trigger once,on second doesn't trigger and later trigger correctly,but it's one change delay');
if(loading === false && data){
const colors: any = [
'#FF3333','#3333FF','#FFFF33','#33FF33','#33FFFF','#9933FF','#FF9933','#FF33FF','#FF3399','#A0A0A0'
];
let pushSessions:any = [];
let owners:any = [];
data?.halls?.map(({sessions,...o},index) =>{
owners.push({id:o.id,text:o.name,color: colors[index%10]});
sessions.map((session:any) => {
pushSessions.push({...session,ownerId: o.id});
})
})
setSessions(pushSessions);
setowners(owners);
}
},[loading,data])
if (loading) return <div>Loading...</div>
if (error) return <div>Error: {error.message}</div>
return (
<div>
<Calendar sessions={sessions} owners={owners} refetchSessions={refetchSessions} />
</div>
)
}
export default schedule
以及我获取道具并触发 refetchSessions 的组件部分。
const Calendar = (props: any) => {
let { sessions,owners,refetchSessions } = props;
const [moveSession] = useMoveSessionMutation();
...
const commitChanges = ({ added,changed,deleted }: any) => {
if (added) {
//
}
if (changed) {
console.log('trigger on all changes! Correct')
const id = Object.keys(changed)[0];
moveSession({variables:{
input: {
id: parseInt(id),...changed[id]
}
},refetchQueries: refetchSessions
})
}
if (deleted !== undefined) {
//
}
};
return (
// Some material-ui components and @devexpress/dx-react-scheduler-material-ui components in which commitChanges function is handled
)
export default Calendar;
钩子是用 graphql-codegen(generated/graphql.tsx) 生成的:
export function useHallsQuery(baSEOptions?: Apollo.QueryHookOptions<HallsQuery,HallsQueryVariables>) {
return Apollo.useQuery<HallsQuery,HallsQueryVariables>(HallsDocument,baSEOptions);
}
export function useHallsLazyQuery(baSEOptions?: Apollo.LazyQueryHookOptions<HallsQuery,HallsQueryVariables>) {
return Apollo.useLazyQuery<HallsQuery,baSEOptions);
}
export type HallsQueryHookResult = ReturnType<typeof useHallsQuery>;
这是架构(graphql/hall.graphql):
query Halls {
halls {
id
name
sessions{
id
title
startDate
endDate
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)