即使使用备忘录,使用forwardRef做出反应也总是更新子组件

joy*_*yce 4 javascript ref reactjs react-forwardref create-ref

所以我有一个 DatePicker ChildComponent,我需要从Parentref访问它。基本上一切正常。forwardRef

但有一个问题。

每次我更新与DatePickerChild没有任何关系的Parent Other ChildComponents上的某些内容时,DatePicker 仍然会呈现,即使它不应该呈现。

我尝试删除从父级到子级的引用传递,然后每次我对我想要解决的其他组件进行更新时,该组件就不再重新渲染。

<NativeDatePicker
  ref={datePickerRef} // <-- When I comment this component is not rendering anymore.
  currentDate={values.birthday}
  onDateChange={handleBirthdayChange}
/>
Run Code Online (Sandbox Code Playgroud)

我已经开始通过使用useCallback来优化回调记忆,但仍然没有运气。

下面是我的代码:

日期选择器.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);
Run Code Online (Sandbox Code Playgroud)

我不会显示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();
Run Code Online (Sandbox Code Playgroud)

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

Shu*_*tri 5

您正在使用 创建一个 ref createRef,它在每次重新渲染时都会返回一个新的 ref 实例,因此将导致使用 优化子重新渲染失败React.memo

您应该使用useRef功能组件的钩子来创建引用

const datePickerRef = useRef<DatePicker>();
Run Code Online (Sandbox Code Playgroud)