Как реализовать usePrevious в react

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я взял этот код из документации React. Но, видимо, я неправильно его использую.

 import { useEffect, useRef } from 'react';

export default function usePreviousState(state) {
  const ref = useRef();

  useEffect(() => {
    ref.current = state;
  });
  return ref.current;
}
  

Это мой функциональный компонент:

 export default function personInfo({ data, setData }) {
  const classes = useStyles();
  const prevData = usePreviousState(data);

  function handleFieldChange(event) {
    setData({
      ...data,
      [event.target.id]: event.target.value,
    });
  }

  async function handleSaveClick(event) {
    event.preventDefault();

    const formData = normalizeData(data);
    try {
      if (JSON.stringify(data) !== JSON.stringify(prevData)) {
        await updatePeronInfo(formData);
        alert('Successfully updated personal information!');
      } else {
        await createPersonInfo(data);
        alert('Your personal information has been saved!');
      }
    } catch (error) {
      handleErrors(error);
    }
  }
  

Первая проблема заключается в том, что я не могу опубликовать информацию, она всегда выдает мне POST и PATCH, но выдает ошибку 404 Страница не найдена, поэтому она вообще не создавала и не обновляла информацию. Если я изменю оператор if с (JSON.stringify(data) !== JSON.stringify(prevData)) на (JSON.stringify(data) === JSON.stringify(prevData)) каким-то образом ему удастся ОПУБЛИКОВАТЬ данные. Но позже, если я захочу обновить информацию, кажется, что она пытается выполнить createPersonInfo, что приводит к внутренней ошибке сервера error 500, поскольку она уже создана. Любая идея, что я делаю не так, и чего мне не хватает в «ЛОГИКЕ IF». По-видимому, prevData не определено в начале. Как я должен это исправить?

Ответ №1:

Вам нужно добавить простую проверку:

 if (typeof prevData !== 'undefined') {
       if (JSON.stringify(data) !== JSON.stringify(prevData)) {...}
} else {...}