因此我有一个DatePicker ChildComponent ,我需要通过<{>父项的ref
访问其forwardRef
。基本上一切正常。
但是有一个问题。
每次我更新与 DatePickerChild 没有任何关系的Parent Other ChildComponents 上的某些内容时, DatePicker仍在渲染,即使不应该。
我试图删除ref从父级到子级的传递,所以每次我更新要解决的其他组件时,该组件都不再呈现。
<NativeDatePicker
ref={datePickerRef} // <-- When I comment this component is not rendering anymore.
currentDate={values.birthday}
onDateChange={handleBirthdayChange}
/>
我已经开始通过使用useCallback
进行优化来使用回调记忆,但是仍然没有运气。
以下是我的代码:
DatePicker.tsx
type Props = {
// ref: RefObject<DatePicker>;
currentDate: string | Date | undefined;
onDateChange: (newDate: string) => void;
};
const NativeDatePicker = forwardRef(
({ currentDate, onDateChange }: Props, ref: any) => {
console.log('tadah!');
return (
<DatePicker
ref={ref}
style={wrapperStyle.wrapper}
date={currentDate}
mode="date"
placeholder="select date"
format="YYYY-MM-DD"
// minDate="2016-05-01"
// maxDate={Date.now()}
confirmBtnText="Confirm"
cancelBtnText="Cancel"
customStyles={styles}
onDateChange={onDateChange}
/>
);
},
);
const MemoizedNativeDatePicker = memo(NativeDatePicker);
在我的 ParentComponent 中,我不会仅显示要传递给DatePicker的props和refs中的每个代码。
// Memoized Callback Function
const handleBirthdayChange = useCallback(
(newDate: string) => setFieldValue('birthday', newDate),
[setFieldValue],
);
const datePickerRef = createRef<DatePicker>();
const datePickerRefOnPress = () => datePickerRef.current!.onPressDate();
我错过了什么吗?感谢您的帮助。
答案 0 :(得分:2)
您正在使用createRef
创建一个引用,这在每次重新渲染时都会返回一个新的引用实例,因此会导致无法优化使用React.memo
的子渲染。
您应该改用useRef
钩子为功能组件创建引用
const datePickerRef = useRef<DatePicker>();