Я относительно новичок в реагировании/реагировании и думаю, что делаю что-то, что не нравится реакции при рендеринге, хотя это не помогает мне понять ошибку.
Это проект машинописного текста expo/react-native.
Я хочу определить метод getStartDateTime() для CalendarEventItem, потому что я хочу реорганизовать свойство startTime, чтобы оно было числом, а не датой.
Ошибка:
Render Error: event.getStartDateTime is not a function (it is undefined)
У Typescript нет никаких претензий, судя по всему, только рендеринг/реагирующий рендерер. Прямой доступ к свойству startTime работает отлично, вызов метода приводит к этой ошибке.
Минимальный код:
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}
/>
))}
);
}
// 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).





Итак, очевидно, проблема заключалась не в реагировании/реакции, а просто в знании гораздо более базовой семантики JavaScript.
Определение метода как стрелочной функции полностью устранило все ошибки из-за контекста this, тогда как стрелочная функция сохраняет лексическую область действия this, а обычная функция may сохраняет область действия в зависимости от того, как она связана.
getStartDateTime = () => {
return new Date(this.startTime);
}
Чем больше ты знаешь!