当前位置: 首页 > 知识库问答 >
问题:

仅当组件第一次以惯用且优雅的方式呈现时,才执行react apollo hooks useQuery

马欣德
2023-03-14

我正在使用最优秀的react-apollo-hooks库,特别是useQuery钩子:

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:

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));
    }
    ...
}

这很好。但我能做得更好吗?

共有1个答案

禄源
2023-03-14

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

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])

@罗伯特,我发现你在阿波罗上提出了这个问题。我发现有一个答案帮助我解决了这个问题,因此在这里也添加了这个答案,这样可以帮助其他人。

 类似资料:
  • 问题内容: 在Python 2.7中执行元组算术的最优雅,简洁的方法(不创建带有运算符重载的我自己的类)? 可以说我有两个元组: 我的预期结果是 我目前使用: 我也尝试过: 但结果是。我相信以上内容是嵌套的for循环,导致4次迭代和4个值。 问题答案: 如果您正在快速寻找,可以使用numpy: 如果您想将其保存在一个元组中:

  • 我在一个表单上有一个TextField输入,问题是当我在它上键入时,刚刚键入的值的显示/呈现有一种延迟,我想防止这种延迟。 代码:

  • 我试图建立一个连接4的游戏,它有一个由7列组件组成的板组件,所有包含6个空间组件。每个列的上方都有一个拖放按钮,该按钮将用于将该件拖放到列中。为了在“红色”和“黑色”玩家之间交替,我创建了一个状态“redorblue”,它返回一个布尔值。 简而言之,当单击Drop按钮时,我希望切换“redorblue”的值,以跟踪轮到谁了。我已经将onClick函数设置为setState({redorblue:!

  • 第二次渲染成功,但副作用是my child组件使用其父级的上下文值作为初始状态(使用useState挂钩)将其初始状态设置为空数组。我正在使用React挂钩(useState、useContext、useReducer、useffect) 应用程序。js: 我的子组件Main Page.jsx 结果:结果图像 如您所见,尽管uniqueList已经填充了数组,但uniqueType状态仍然为空。我

  • 基本上,对象(结构)是通过组合不同的组件来构造的。每个具体组件都很容易被与接口匹配的另一个组件交换(我猜是特征)。 我目前正在尝试使用一些特征来实现,这让我陷入了一些错误,并让我开始思考这是否是 Rust 中的常见做法。 这背后的主要思想是实现游戏中常用的组件模式。基本上,游戏将包含许多不同的对象,行为和包含的数据略有不同。没有一个大的类层次结构,对象是由标准组件组成的,更完整的例子是。

  • 问题内容: 我有一个大的可迭代项,实际上,由以下给定: 我想访问百万分之一的元素。我确实以不同的方式解决了问题。 强制迭代到列表并获取第1000000个元素: 手动跳过直到999999的元素: for i in xrange(999999): p.next() return p.next() 手动跳过元素v2: for i, element in enumerate(p): if i == 999