首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行react-apollo-hooks useQuery只在组件第一次以习惯用法和优雅的方式呈现时执行

执行react-apollo-hooks useQuery只在组件第一次以习惯用法和优雅的方式呈现时执行
EN

Stack Overflow用户
提问于 2019-05-10 01:06:31
回答 1查看 1.4K关注 0票数 6

我使用的是最优秀的钩子,特别是useQuery react-apollo-hooks library

代码语言:javascript
复制
function Index() {
    ...
    const [dialogOpen, setDialogOpen] = useState({ show: false, id: '0' });
    ...   
    const { data, error } = useQuery(GET_JOBS, { suspend: true });
    if (error) {
        return <div>Error! {error.message}</div>;
    }
    const jobs = data.cxJobs; //This is our data
    ....
    function editCallback(e, more) {
        setDialogOpen({ show: true, id: e });
    }
....
}

当然,只要我更改了dialogOpen状态,组件就会重新呈现,graphql查询就会再次执行。根据对库github repo的建议,我重写了代码,以便与useEffect一起设置一些状态:

代码语言:javascript
复制
function Index() {
    ...
    const [dialogOpen, setDialogOpen] = useState({ show: false, id: '0' });
    const [jobs, setJobs] = useState([]);

    useEffect(_=> {fetchData()}, []);

    const fetchData = async _ => {
        const result = await client.query({query:GET_JOBS});
        setJobs(get(['data','cxJobs'], result));
    }

    async function onEventChanged(id, event) {
        await mutateOne(client, jobGQL, eventToJob(event));
    }
    ...
}

这是非常好的。

EN

回答 1

Stack Overflow用户

发布于 2020-09-30 02:21:05

你可以做这样的事情。此外,您可能还希望避免将查询结果设置为useState,而直接使用数据。

代码语言:javascript
复制
const [skip, setSkip] = React.useState(false)
const { loading, data } = useQuery(QUERY, { skip })

React.useEffect(() => {
  // check whether data exists
  if (!loading && !!data) {
    setSkip(true)
  }
}, [data, loading])

@Robert,我发现你在apollo-hooks github上提出了这个问题。我发现有一个答案帮助我解决了这个问题,因此也在这里添加了它,这样它就可以帮助其他人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56064366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档