React Hooks - Как передать реквизиты от дочернего компонента к родительскому - PullRequest
2 голосов
/ 16 июня 2020

В приведенном ниже примере, как передать imageAsUrl.imgUrl из дочернего компонента (ImageUpload) в родительский компонент (UpdateCard).

CHILD Component

import React, { useState, useEffect } from 'react';
import { storage } from '../firebase';

const ImageUpload = () => {
  const allInputs = { imgUrl: '' };
  const [imageAsUrl, setImageAsUrl] = useState(allInputs);
  const [image, setImage] = useState(null);

  const handleChange = (e) => {
    if (e.target.files[0]) {
      setImage(e.target.files[0]);
    }
  };

  useEffect(() => {
    if (image) {
      const uploadTask = storage.ref(`images/${image.name}`).put(image);

      uploadTask.on(
        'state_changed',
        (snapshot) => {},
        (error) => {
          console.log(error);
        },
        () => {
          storage
            .ref('images')
            .child(image.name)
            .getDownloadURL()
            .then((fireBaseUrl) => {
              setImageAsUrl((prevObject) => ({
                ...prevObject,
                imgUrl: fireBaseUrl,
              }));
            });
        }
      );
    }
  }, [image]);

  return (
    <>
      <label className='custom-file-upload'>
        <input type='file' onChange={handleChange} />
      </label>
      <img src={imageAsUrl.imgUrl} alt='sample' />
    </>
  );
};

export default ImageUpload;

РОДИТЕЛЬСКИЙ компонент

import React, { useState } from 'react';
import firebase from '../firebase';
import ImageUpload from './ImageUpload';

const UpdateCard = ({ card }) => {
  const [originalText, setOriginalText] = useState(card.originalText);
  const [translatedText, setTranslatedText] = useState(card.translatedText);

  const onUpdate = () => {
    const db = firebase.firestore();
    db.collection('FlashCards')
      .doc(card.id)
      .set({ ...card, originalText, translatedText });

    timeOutScroll();
  };

  return (
    <>
      <div>
        {card.imageURL ? (
          <img src={card.imageURL} alt='' className='img' />
        ) : (
          <textarea
            className='upload-textarea'
            value={originalText}
            onChange={(e) => {
              setOriginalText(e.target.value);
            }}
          />
        )}
        <ImageUpload />
      </div>

      <textarea
        value={translatedText}
        onChange={(e) => {
          setTranslatedText(e.target.value);
        }}
      />
      <button onClick={onUpdate}>Update</button>
    </>
  );
};

export default UpdateCard;

1 Ответ

1 голос
/ 16 июня 2020

Внутри родителя, вы можете определить функцию обратного вызова как prop ref, которая будет вызываться внутри дочернего элемента.

const ImageUpload = ({getURLtoParent}) =>{                       <--------------------
    const [imageAsUrl, setImageAsUrl] = useState(allInputs);

    useEffect(() => {
     uploadTask.on(
         ..............
         ...
     );

     if(imageAsUrl.imgUrl !== '')
         getURLtoParent(imageAsUrl.imgUrl)           <-----------------------

    },[image])

}

const UpdateCart = () => {
    const[imgURL,setimgURL] = useState(null)

    return (
    ......
    <ImageUpload getURLtoParent={ (url) => setimgURL(url) } />      <----------------
    .........
    )

}
...