触发该错误是因为您正在使用setText
直接在渲染函数中。该函数在调用后呈现组件。因为在接下来的渲染中,data
and error
仍然设置,它调用setText
again.
你是对的useEffect
. With useEffect
你可以确保setText
仅当数据发生更改时才调用函数。就你而言,这是为了data
and/or error
变量。
import { useEffect } from 'react';
const EmailVerification = () => {
const [showMessage, setShowMessage] = useState(true);
const [text, setText] = useState("...Loading. Do not close.");
const { data, error } = useQuery(VERIFY_EMAIL);
useEffect(() => {
if (error) setText('message');
if (data) setText('emailVerificationMessage');
}, [error, data]);
return (
<Wrapper>
<Message setShowMessage={setShowMessage} text={text} />
</Wrapper>
)
}
但是,由于您只是更改text
使用已经存在的 props 的变量,您也可以仅在 JS(X) 中执行此操作:
const EmailVerification = () => {
const [showMessage, setShowMessage] = useState(true);
const { isLoading, data, error } = useQuery(VERIFY_EMAIL);
const text = isLoading ? 'Loading... Do not close' : error || !data ? 'Error message' : 'emailVerificationMessage';
return (
<Wrapper>
<Message setShowMessage={setShowMessage} text={text} />
</Wrapper>
)
}
这使用了嵌套三元运算符(不是扇形),可以用任何其他方法替换。