Saya mempunyai komponen berikut yang menghasilkan pautan boleh klik untuk muat naik fail
import { gql, useLazyQuery, useMutation } from '@apollo/client'; import { useEffect, useState } from 'react'; import type FileUpload from '@app/data/models/FileUpload'; import { ExternalLink } from '@app/mcui/components/atoms/business-process/shared/ExternalLink'; import { isNonEmptyString } from '@divvy-homes/utils'; export type Props = { uploadId: FileUpload['id']; }; const FILE_UPLOAD_QUERY = gql` query ($id: UUID!) { getFileUpload(id: $id) { id fileName url } } `; const SIGN_FILE_MUTATION = gql` mutation ($url: String!) { signAdminUploadUrl(url: $url) } `; export const FileUploadLink = ({ uploadId }: Props) => { const [fileUrl, setFileUrl] = useState<string>(); const [fileName, setFileName] = useState<string>(); const [getFileData] = useLazyQuery<{ getFileUpload: { url: string; fileName: string; }; }>(FILE_UPLOAD_QUERY, { onError: console.error, onCompleted: (data) => { setFileName(data.getFileUpload.fileName); setFileUrl(data.getFileUpload.url); }, variables: { id: uploadId, }, }); useEffect(() => { void getFileData({ variables: { uploadId } }); }, [getFileData, uploadId]); const [createSignedDocumentUrl] = useMutation<{ signAdminUploadUrl: string }>( SIGN_FILE_MUTATION, { onError: console.error, onCompleted: (urlData) => { const signedUrl = urlData.signAdminUploadUrl; window.open(signedUrl, '_blank', 'noreferrer'); }, }, ); return isNonEmptyString(fileUrl) ? ( <ExternalLink onClick={() => void createSignedDocumentUrl({ variables: { url: fileUrl } })} text={fileName ?? ''} /> ) : undefined; };
Setiap kali saya memuat naik fail menggunakan komponen ini, saya mendapat ralat tindak balas渲染的钩子比上次渲染期间更多。
. React menunjukkan bahawa susunan cangkuk telah berubah seperti berikut
client.js:1 Warning: React has detected a change in the order of Hooks called by BusinessProcessDetails. This will lead to bugs and errors if not fixed. For more information, read the Rules of Hooks: https://reactjs.org/link/rules-of-hooks Previous render Next render ------------------------------------------------------ 1. useContext useContext 2. useContext useContext 3. useContext useContext 4. useContext useContext 5. useRef useRef 6. undefined useState
Melihat kod saya, saya tidak faham mengapa ralat ini berlaku. React mengatakan bahawa baris pertama komponen yang memanggil useState yang menyebabkan ralat, tetapi itu tidak masuk akal kepada saya. Memanggil cangkuk reaktif tanpa syarat menyebabkan perkara ini, dan baris pertama komponen yang melontar ralat ini tidak sepadan dengan susunan cangkuk berubah.
Saya menggunakan react 18.2.0, typescript 4.9.5
Ternyata masalahnya terletak pada cara komponen dipanggil. Paparan komponen induk
FileUploadLink
kelihatan seperti iniPembetulannya adalah dengan membalut komponen dalam tag, iaitu