cari

Rumah  >  Soal Jawab  >  teks badan

Memaparkan lebih daripada ralat pemaparan sebelumnya pada komponen tanpa menggunakan cangkuk bersyarat

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

P粉331849987P粉331849987476 hari yang lalu625

membalas semua(1)saya akan balas

  • P粉148434742

    P粉1484347422023-09-10 20:47:31

    Ternyata masalahnya terletak pada cara komponen dipanggil. Paparan komponen induk FileUploadLink kelihatan seperti ini

    export const MyComponent = ({ fileUpload }: MyProps) => {
      const values = [
        {
          label: 'MyLabel',
          value: fileUpload ? FileUploadLink({ uploadId: fileUpload }) : undefined,
        },
      ];
    
      return (
        <>
          {values.map((l, v) => {
            <div>{l}</div>;
            {
              v;
            }
          })}
        </>
      );
    };

    Pembetulannya adalah dengan membalut komponen dalam tag, iaitu

    const values = [
        {
          label: 'MyLabel',
          value: fileUpload ? <FileUploadLink uploadId={fileUpload} /> : undefined,
        },
      ];

    balas
    0
  • Batalbalas