Maison  >  Questions et réponses  >  le corps du texte

Séquence de rendu et d'appels useEffect()

J'ai des composants TopPageImagePreviewFileUploader

  1. Afficher en premier FileUploader,

  2. FileUploader modifie l'état fileObj de TopPage.

  3. Ensuite, FileUploader disparaît, ImagePreview apparaît et useEffect() est appelé en même temps, mais il n'y a pas de ImagePreviewRef pour le moment.

Lorsque useState est appelé, le rendu du composant et useEffect seront appelés.

La commande est useEffect -> re-render ?

Si oui, comment puis-je résoudre ce problème ?

const TopPage = (props) =>{
    const [fileObj, setFileObj ] = useState();
    const imagePreviewRef = useRef();
    useEffect(() =>{
        console.log("useEffect() is called with fileObj:",fileObj);
        console.log("imagePrevireRef.current is ready?",imagePreviewRef.current);
        imagePreviewRef.current.loadPic(fileObj);
    },[fileObj]);

    if (fileObj){
      return <ImagePreview ref={imagePreviewRef}></ImagePreview>
    }
    else {
      return <FileUploader SetFileObj=setFileObj></FileUploader>
    }
}

const FileUploader = (props) => {
   // props.setFileObj() is called here.
}
const ImagePreview = (props) => {
   const loadPic = () =>{// loadpicture to canvas }   
}

Solution temporaire,

J'aime ça jusqu'à présent, Rendu de ImagePreview et ImagePreviewFileUploader Les composants sont basculés via display:none dès le début.

Cela semble un peu gênant... mais fonctionne très bien jusqu'à présent.

const TopPage = (props) =>{
    const [fileObj, setFileObj ] = useState();
    const imagePreviewRef = useRef();
    useEffect(() =>{
        console.log("useEffect() is called with fileObj:",fileObj);
        console.log("imagePrevireRef.current is ready?",imagePreviewRef.current);
        imagePreviewRef.current.loadPic(fileObj);
    },[fileObj]);

    if (fileObj){
      return 
<React.Fragment>
<div style={{display:"block"}}>
<ImagePreview ref={imagePreviewRef}></ImagePreview>
</div>
<div style={{display:"none"}}>
<FileUploader SetFileObj=setFileObj></FileUploader>
</div>
</React.Fragment>
    }
    else {
      return 
<React.Fragment>
<div style={{display:"none"}}>
<FileUploader SetFileObj=setFileObj></FileUploader>
</div>
<div style={{display:"block"}}>
<ImagePreview ref={imagePreviewRef}></ImagePreview>
</div>
</React.Fragment>
    }
}

const FileUploader = (props) => {
   // props.setFileObj() is called here.
}
const ImagePreview = (props) => {
   const loadPic = () =>{// loadpicture to canvas }   
}

P粉722409996P粉722409996183 Il y a quelques jours341

répondre à tous(1)je répondrai

  • P粉165522886

    P粉1655228862024-03-23 00:36:53

    Rendez uniformément, puis utilisez CSS pour afficher de manière conditionnelle les composants afin de préserver les références.

    const TopPage = (props) =>{
        const [fileObj, setFileObj ] = useState();
        const imagePreviewRef = useRef();
        useEffect(() =>{
           if(imagePreviewRef.current)
            imagePreviewRef.current.loadPic(fileObj);
        },[fileObj]);
    
        return (
          <> 
           
    {fileObj && } ) }

    répondre
    0
  • Annulerrépondre