使用forwardRef进行反应始终会更新子组件,即使使用备忘录

时间:2020-06-15 10:03:27

标签: javascript reactjs ref react-forwardref create-ref

因此我有一个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();

我错过了什么吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您正在使用createRef创建一个引用,这在每次重新渲染时都会返回一个新的引用实例,因此会导致无法优化使用React.memo的子渲染。

您应该改用useRef钩子为功能组件创建引用

const datePickerRef = useRef<DatePicker>();