Установка начального состояния в нулевое и передача файлового объекта в режим предварительного просмотра

Я создаю режим предварительного просмотра для просмотра определенного изображения по щелчку. Мой мыслительный процесс заключается в том, чтобы установить для свойства состояния значение null, щелкнув изображение, я затем устанавливаю состояние для определенного файла и отображаю путь к изображению в качестве источника изображения. Однако Typescript это не нравится, и он указывает Object is possibly null.

  • Я попытался добавить selectedFile: Asset в свои расширенные реквизиты, но мне выдается ошибка в родительском компоненте, ожидающем, что он передаст файл. Я не хочу, чтобы он так себя вел.
  • Я пытался написать это как selectedFile: Asset<{}>(), но Typescript жалуется, что я использую его как тип, а не как значение.
import * as React from "react"
import { Company } from "data/companies"
import { Asset } from "data/companies"
import Modal from "components/Modal"

interface MediaLibraryProps {
  company: Company
}

class MediaLibrary extends React.Component<MediaLibraryProps> {
  state = {
    mediaLibrary: [],
    editModalIsOpen: false,
    selectedFile: null
  }

  toggleEditModal = () => {
    this.setState({ editModalIsOpen: !this.state.editModalIsOpen })
  }

  openEditModal = (file: Asset) => {
    this.setState({
      editModalIsOpen: true,
      selectedFile: file
    })
  }

  getMediaLibrary = async () => {
    await fetch(
      `${process.env.REACT_APP_SA_API_URL}/${this.props.company.id}/images`,
      {
        headers: {
          Authorization: `Bearer ${localStorage.getItem("token")}`,
        },
      }
    ).then(blob => blob.json())
      .then(function (data: any) {
        return data.map((file: Asset) => Object.assign(file, {
          assetId: file.assetId,
          path: file.path
        }))
      }).then((data) => this.setState({ mediaLibrary: [...data] }))
  }

  render() {
    const files = this.state.mediaLibrary.map((file: Asset) => (
      <div key = {file.assetId} onClick = {() => this.openEditModal(file)}>
        <div>
          <img src = {`${process.env.REACT_APP_SA_CDN_URL}${file.path}`} />
        </div>
      </div>
    ))

    return (
      <div>
        <div>
          <h2>Media Library</h2>
        </div>
        {files}
        <hr />
        <Modal isOpen = {this.state.editModalIsOpen} toggleOpenness= 
          {this.toggleEditModal}>
          <img
            src = {this.state.selectedFile.path}
            onClick = {this.toggleEditModal}
          />
        </Modal>
      </div>
    )
  }
}

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

Ответы 1

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

Я уверен, что есть более чистый способ сделать это, но я исправил его, установив

state = {
    selectedFile: {
      path: ""
    }
  }

openEditModal = (file: Asset) => {
    this.setState({
      editModalIsOpen: true,
      selectedFile: {
        path: file.path
      }
    })
  }

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