Почему я получаю ошибку рендеринга (неопределенная ошибка функции) при вызове метода, но свойство в порядке?

Я относительно новичок в реагировании/реагировании и думаю, что делаю что-то, что не нравится реакции при рендеринге, хотя это не помогает мне понять ошибку.

Это проект машинописного текста expo/react-native.

Я хочу определить метод getStartDateTime() для CalendarEventItem, потому что я хочу реорганизовать свойство startTime, чтобы оно было числом, а не датой.

Ошибка: Render Error: event.getStartDateTime is not a function (it is undefined)

У Typescript нет никаких претензий, судя по всему, только рендеринг/реагирующий рендерер. Прямой доступ к свойству startTime работает отлично, вызов метода приводит к этой ошибке.

Минимальный код:

  • Компонент.tsx
const Component = () => {

  const events: CalendarEventItem[] = useCalendarStore((state) => state.events); // Zustand store

  const calculatePositionOffset(startTime: Date, gap: number, rowHeight: number) => {
    return (startTime.getHours() + startTime.getMinutes() / 60) * rowHeight + gap;
  }

  return (

    {events.length &&
      events.map((event) => (

        <EventContainer
          event = {event}
          position = {{
            top: calculatePositionOffset(event.getStartDateTime(), 3, 30), // <-- Error occurs here
            left: 100,
          }}
          key = {"event-" + event.id}
        />

     ))}

  );
}
  • CalendarEvent.ts
// Probably can ignore mixins, including just for completeness

abstract class CalendarEvent extends extendSchedulableItem(extendAgendaObject(class {})) {
  abstract getStartDateTime(): Date; // this is here because I ultimately want to define 
                                     // this method on a grandparent class, removing does not 
                                     // affect the error
}

class CalendarEventItem extends CalendarEvent {

  startTime: Date; // want to refactor this to number, hence the need for a method

  constructor(params) {
    super(params); // this.startTime is initialized by a grandparent constructor in SchedulableItem
  }

  getStartDateTime() {
    return new Date(this.startTime);
  }
}

export { CalendarEvent, CalendarEventItem }

Для меня самое интересное заключается в том, что:

top: calculatePositionOffset(event.startTime, 3, 30), // <-- Works absolutely fine
top: calculatePositionOffset(event.getStartDateTime(), 3, 30), // <-- Produces the render error

Что я делаю не так?

Я пробовал разные способы переопределить метод, в том числе в родительских классах и миксинах. Кажется, это не работает, даже если оно просто определено независимо в конечном классе. Искусственный интеллект-помощник не помог понять или решить проблему.

Я также попробовал обернуть CalculPositionOffset с помощью useCallback, на случай, если это будет более удобно для рендеринга, но с тем же конечным результатом (немного другая ошибка, но, тем не менее, вытекающая из неопределенного параметра startTime).

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

Ответы 1

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

Итак, очевидно, проблема заключалась не в реагировании/реакции, а просто в знании гораздо более базовой семантики JavaScript.

Определение метода как стрелочной функции полностью устранило все ошибки из-за контекста this, тогда как стрелочная функция сохраняет лексическую область действия this, а обычная функция may сохраняет область действия в зависимости от того, как она связана.

getStartDateTime = () => {
  return new Date(this.startTime);
}

Чем больше ты знаешь!

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