【发布时间】:2020-05-04 13:26:23
【问题描述】:
我有一个反应功能组件,显示标签和帖子列表 + 一些静态文本/装饰。我使用useState 钩子将当前选定的标签存储在一个状态中。使用 apollo 的 useQuery 钩子和 tag 变量获取帖子。用户应该能够选择一个标签,它将替换当前的tag 状态 - 因此useQuery(POSTS_QUERY) 将使用新的tag 变量重新运行。
const onTagSelectChange = (window: Window,
router: NextRouter,
name: string,
checked: boolean,
tagSetter: React.Dispatch<React.SetStateAction<string>>) => {
if (checked) {
setTagQueryInUrl(window, router, name)
tagSetter(name)
} else {
setTagQueryInUrl(window, router, null)
tagSetter(null)
}
}
const NewsList: NextPage = () => {
const router = useRouter()
const query = router.query as Query
// store tag in state
// initialize tag from `tag` query
const [tag, setTag] = useState(query.tag)
const { data: postsData, loading: postsLoading, error: postsError } = useQuery(
POSTS_QUERY,
{
variables: {
tag: tag
}
}
)
const { data: tagsData, loading: tagsLoading, error: tagsError } = useQuery(TAGS_QUERY)
// show error page if either posts or tags query returned error
if (postsError || tagsError) {
return <Error statusCode={500} />
}
return (
<div>
<h1>Here we have list of news, and I should not re-render everytim :(</h1>
<Tags
loading={tagsLoading}
data={tagsData}
isChecked={(name) => name === tag}
onChange={(name, checked) => onTagSelectChange(window, router, name, checked, setTag)}
/>
<Posts loading={postsLoading} data={postsData} />
</div>
)
}
我的问题是,为什么我的 h1 块会不断重新渲染,即使我没有传递任何东西给它?还是我完全误解了 react 的工作原理?
【问题讨论】:
-
您应该检查元素面板以查看
<h1>元素是否实际被更改。您看到的重新渲染可能是因为<h1>元素的兄弟姐妹正在被修改,因此它们的共享父元素得到了重排。您还可以通过将<h1>移到<div>之外来测试它,这样它就不再是同级了。 -
这能回答你的问题吗? Trace why a React component is re-rendering
-
@EmileBergeron 不,我没有将任何道具传递给
<h1>元素,因此不适用于我的情况。 -
但是封闭的组件会重新渲染,包括它的所有子组件。
-
@Wex 我看看检查员,是的,你是对的,
<h1>没有被修改。看起来<body>是被修改的那个,有一个<iframe>被添加了非常快的毫秒但我不记得添加任何<iframe>
标签: javascript reactjs typescript react-hooks next.js