gpt4 book ai didi

javascript - 为什么 useQuery 调用会导致我的组件重新渲染?

转载 作者:行者123 更新时间:2023-12-04 14:44:13 26 4
gpt4 key购买 nike

正如我们所知,当它的 props 或 state 发生变化时,react 组件会重新渲染。
现在我正在使用 useQuery来自 react-apollo包如下:

import { gql, useQuery } from '@apollo/client';

const getBookQuery = gql`
{
books {
name
}
}
`;

function BookList() {
const { loading, error, data} = useQuery(getBookQuery);

if(loading) return <p>Loading....</p>
if(error) return <p>Ops! Something went wrong</p>

return (
<>
<ul>
{data.books.map(book => (
<li key={book.name}>{book.name}</li>
))}
</ul>
</>
)
}

export default BookList;
当我运行上面的代码时,我们首先得到 Loading...在 DOM 中,然后将其更新为包含查询数据的列表(一旦到达)。但是一旦从查询中接收到数据,react 如何知道重新渲染我的组件。
这些是 data , loadingerror映射到组件 Prop 的属性并且它们正在更新?如果是这样,为什么 chrome 开发工具不显示此 BookList 的任何 Prop ?零件?
enter image description here
谁能解释一下这是怎么回事 useQuery自定义钩子(Hook)在这里工作?

最佳答案

了解(大致)useQuery 中发生的事情的好方法是考虑如何自己做,例如

const MyComponent = () => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);

useEffect(async () => {
try {
setLoading(true);
const data = await GraphQL.request(getBookQuery);
setData(data);
} catch (ex) {
setError(ex);
} finally {
setLoading(false);
}
}, []);

if(loading) return <p>Loading....</p>
if(error) return <p>Ops! Something went wrong</p>

return (
<>
<ul>
{data.books.map(book => (
<li key={book.name}>{book.name}</li>
))}
</ul>
</>
);
};
在上面你可以看到你的组件有状态(不是 Prop ) data , loadingerror这会导致您的组件重新渲染。
然后你可以想象这个逻辑被包裹在你自己的 useQuery 中。钩:
const useQuery = (query, variables) => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);

useEffect(async () => {
try {
setLoading(true);
const data = await GraphQL.request(query, variables);
setData(data);
} catch (ex) {
setError(ex);
} finally {
setLoading(false);
}
}, []);

return { data, loading, error };
}

const MyComponent = () => {
const { data, loading, error } = useQuery(getBookQuery);

if(loading) return <p>Loading....</p>
if(error) return <p>Ops! Something went wrong</p>

return (
<>
<ul>
{data.books.map(book => (
<li key={book.name}>{book.name}</li>
))}
</ul>
</>
);
};
所以最终你的组件会重新渲染,因为它确实有 data , loadingerror举办于 MyComponent状态,它只是被抽象掉了。

关于javascript - 为什么 useQuery 调用会导致我的组件重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66090104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com