Использование перехвата реакции в отдельном файле для компонента

#javascript #reactjs #react-hooks

#javascript #reactjs #реагирующие перехваты

Вопрос:

Я хочу создать файл данных для своего проекта вместо того, чтобы иметь все в одном файле, однако я использую перехваты реакции для загрузки в изображения. Это становится проблемой, когда я хочу иметь все в отдельных файлах. Код выдает мне сообщение «Недопустимый вызов перехвата», которое я понимаю, почему это неправильно, но не могу понять, как заставить его работать на меня.

EventData.js

 import React from "react"
import Image from "gatsby-image"
import { graphql, useStaticQuery } from "gatsby"

const getImages = graphql`
  {
    btu: file(relativePath: { eq: "eventImage/btu.jpeg" }) {
      childImageSharp {
        fixed(height: 120, width: 500) {
          ...GatsbyImageSharpFixed_withWebp_tracedSVG
        }
      }
    }
  }
`

const data = useStaticQuery(getImages)
export const details = [
  {
    id: 1,
    img: <Image fixed={data.btu.childImageSharp.fixed} />,
    date: "2 Oct 2020",
    distance: "30km - 160km",
    name: "Brisbane Trail Ultra",
    location: "Brisbane, QLD",
  },
]
  

EventCalendar.js

 const EventCalendar = () => {
  return (
    <Layout>
      <section>
        {details.map(details => {
          return <EventCard key={details.id} {...details}></EventCard>
        })}
      </section>
    </Layout>
  )
}
  

Комментарии:

1. Единственное основное правило здесь — перехваты должны вызываться изнутри компонента. Здесь вы запускаете его извне, что не сработает. Необязательно, чтобы вы помещали все в один файл, но вам нужно добиться этого с помощью разбивки компонентов (и функций), и вы могли бы переместить сломанные компоненты и функции в отдельные файлы.

2. Возился с моим кодом на основе ваших предложений, и я просто не понимаю

Ответ №1:

Вы должны определить пользовательский перехват, который в вашем случае выглядит примерно так:

 import React from "react"
import Image from "gatsby-image"
import { graphql, useStaticQuery } from "gatsby"

const getImages = graphql`
  {
    btu: file(relativePath: { eq: "eventImage/btu.jpeg" }) {
      childImageSharp {
        fixed(height: 120, width: 500) {
          ...GatsbyImageSharpFixed_withWebp_tracedSVG
        }
      }
    }
  }
  `;

export function useDetails() {    
  const data = useStaticQuery(getImages);

  return [
    {
      id: 1,
      img: <Image fixed={data.btu.childImageSharp.fixed} />,
      date: "2 Oct 2020",
      distance: "30km - 160km",
      name: "Brisbane Trail Ultra",
      location: "Brisbane, QLD",
    },
  ];
}
  

Чтобы определить пользовательские перехваты, определите функцию, которая возвращает нужные вам значения. В этой функции вы можете использовать все перехваты, доступные из API react.

Затем в вашем основном файле напишите

 const EventCalendar = () => {
  const details = useDetails();

  return (
    <Layout>
      <section>
        {details.map(detail => {
          return <EventCard key={details.id} {...detail}></EventCard>
        })}
      </section>
    </Layout>
  )
}
  

Комментарии:

1. Спасибо за ваш ответ. Однако я пытаюсь фактически импортировать файл graphql. Это было бы здорово. Я получаю сообщение об ошибке в загрузчике gatsby graphql.

Ответ №2:

Только перехваты вызовов из функций React не вызывают перехваты из обычных функций JavaScript. Вместо этого вы можете:

✅ Перехваты вызовов из компонентов функций React.

✅ Вызывайте перехваты из пользовательских перехватов (мы узнаем о них на следующей странице). Еще одна вещь: внутри карты вы должны изменить details на detail, потому что это элемент

 const EventCalendar = () => {
  return (
    <Layout>
      <section>
        {details.map(detail => {
          return <EventCard key={details.id} {...detail}></EventCard>
        })}
      </section>
    </Layout>
  )
}
  

Вы можете прочитать о перехвате здесь: https://reactjs.org/docs/hooks-rules.html

Мое предложение заключается в том, что вы можете обернуть его в компонент таким образом:

 const ImageHook = () => {
  const data = useStaticQuery(getImages)
  return <Image fixed={data.btu.childImageSharp.fixed}/>
}

export const details = [
  {
    id: 1,
    img:  <ImageHook />,
    date: "2 Oct 2020",
    distance: "30km - 160km",
    name: "Brisbane Trail Ultra",
    location: "Brisbane, QLD",
  },
]
  

Комментарии:

1. Я знаю, как работают перехваты реакции. Я спрашиваю, могу ли я заставить его работать в ‘data.js — досье.

2. что, если у меня тогда будет несколько изображений в моем запросе? Я упростил свой код, но мой фактический код загружает 3 разных изображения