Инициализация реакции-кроппера из API

Я использую пакет react-cropper для создания веб-сайта.

import React from 'react';
import Cropper from 'react-cropper';
...

export default MyComponent() {
  ...
  const [imageSrc, setImageSrc] = useState(null);
  const [cropper, setCropper] = useState(null);
  ....
  
  useEffect(() => (
    ....

    const profile = api.get('/profile');
    setImageSrc(profile.src);

    ....
  ), [])

  return (
    ...

    <Cropper
      style = {{ height: 400, width: '100%' }}
      guides = {false}
      initialAspectRatio = {16 / 9}
      src = {previewImage}
      ref = {(crop) => setCropper(crop)}
    />
    ...
  )
}

Здесь, когда я использую путь статического изображения в useEffect, я вижу инициализированное изображение.

setImageSrc("https://raw.githubusercontent.com/roadmanfong/react-cropper/master/example/img/child.jpg);

Но когда я загружаю изображение из API, я не вижу инициализированного изображения.

Надеюсь на ваше сотрудничество.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
273
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что api.get() — это асинхронная функция, и когда вы устанавливаете состояние imageSrc, profile — это просто отложенное обещание, а profile.src — это undefined. Если вы установите для своего состояния значение undefined, вы не увидите инициализированное изображение.

Чтобы решить эту проблему, вы можете либо использовать промисы, либо async/await. Посмотрите фрагмент ниже, где я оборачиваю метод API get в асинхронную функцию и использую await для ожидания результата, прежде чем он будет передан в setImageSrc:

useEffect(() => (
  // ....

  const fetchProfile = async () => {
    const profile = await api.get('/profile');
    setImageSrc(profile.src);
  };
  fetchProfile();

  // ....
), [])

Другие вопросы по теме