GraphQl Refetch并不总是在TextField清除值上工作
我正在使用GraphQl查询数据库记录。我用材料图textfield创建了一个过滤器组件,并在更新过滤器值后,用refetch运行查询。
有时在清除值后,查询不会再次调用(例如,在日期字段上)。
这是我的代码:
const newDate = new Date();
const [date, setDate] = useState(newDate);
const { data, loading, error, refetch } = useQuery(GET_ALL, {
variables: { first: 100, task: task, status: status, week: week, date: date, responsible_entity: responsible, no_incident: no_incident, site: site }, onCompleted: (
) => { setItems(data.getAll)
}
});
<TextField
id="dateFilter"
type="date"
defaultValue={dateToString(myDate)}
variant="outlined"
className={classes.textField}
onChange={(e, v) => { setDate(e.target.value); refetch() }}
/>
<Controller
control={control}
name="responsible"
render={({ field: { onChange, value }, fieldState: { error } }) => (
<Autocomplete
id="responsible"
options={responsiblesList}
defaultValue={{ 'DISTINCT': responsible || '' }}
getOptionLabel={(option) => option.DISTINCT}
style={{ width: 300 }}
className={classes.textField}
onInputChange={(event, newInputValue, reason) => {
if (reason === 'clear') {
setResponsible(null)
return
} else {
setResponsible(newInputValue)
}
}}
renderInput={(params) => <TextField {...params}
label="select responsible"
variant="outlined"
defaultValue={responsible}
/>}
/>
)}
/>
I am using graphQl to query database records. I created a filter component with materialUi TextField with refetch to run the query after the filter values have been updated.
Sometimes after clearing the values the query is not called once again (e.g. on the date field).
This is my code:
const newDate = new Date();
const [date, setDate] = useState(newDate);
const { data, loading, error, refetch } = useQuery(GET_ALL, {
variables: { first: 100, task: task, status: status, week: week, date: date, responsible_entity: responsible, no_incident: no_incident, site: site }, onCompleted: (
) => { setItems(data.getAll)
}
});
<TextField
id="dateFilter"
type="date"
defaultValue={dateToString(myDate)}
variant="outlined"
className={classes.textField}
onChange={(e, v) => { setDate(e.target.value); refetch() }}
/>
<Controller
control={control}
name="responsible"
render={({ field: { onChange, value }, fieldState: { error } }) => (
<Autocomplete
id="responsible"
options={responsiblesList}
defaultValue={{ 'DISTINCT': responsible || '' }}
getOptionLabel={(option) => option.DISTINCT}
style={{ width: 300 }}
className={classes.textField}
onInputChange={(event, newInputValue, reason) => {
if (reason === 'clear') {
setResponsible(null)
return
} else {
setResponsible(newInputValue)
}
}}
renderInput={(params) => <TextField {...params}
label="select responsible"
variant="outlined"
defaultValue={responsible}
/>}
/>
)}
/>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
实际上,您不需要调用date 状态。当您调用
refetch()
,因为您的查询使用setDate(e.target.value)
时,将使用更新的date
召回usequery
。在这种情况下,回想refetch()
就像做同样的事情两次。删除它,它可能会解决您的问题。You actually don't need to call
refetch()
, since your query is usingdate
state. When you callsetDate(e.target.value)
, your component re-renders, anduseQuery
will be recalled with the updateddate
. Recallingrefetch()
in this case is like doing the same thing two times. Remove it, it may resolve your issue.