Форма React Hook и постоянные данные при перезагрузке страницы

Я использую React Hook Form v7 и пытаюсь сделать свою форму данных постоянной при перезагрузке страницы. Я прочитал официальный документация РХФ, в котором предлагается использовать маленькая государственная машина, и попытался реализовать его, но безуспешно. Есть ли лучший способ сделать это? Однако...

Первая проблема, с которой я столкнулся при его использовании, заключается в том, что мои данные представляют собой сложный объект, поэтому updateAction это должно быть не так просто.

Вторая проблема заключается в том, что я не знаю, когда и как запустить updateAction для сохранения данных. Должен ли я запускать его при размытии ввода? При изменении входа?

Вот мой тестовый код:

Форма React Hook и постоянные данные при перезагрузке страницы

Под перезагрузкой страницы вы имеете в виду, обновляет ли пользователь все приложение?

Monstar 19.03.2022 17:57

@HugoBp Что вы подразумеваете под «всем приложением»? Я имею в виду, что если пользователь нажимает кнопку обновления браузера, данные сохраняются.

KaMZaTa 19.03.2022 21:31

Хорошо, я действительно спрашивал, говорите ли вы о сохранении данных при изменении страницы в вашем приложении, потому что об этом говорится в документации RHF, на которую вы ссылаетесь. Теперь я понимаю, что это не то, что вам нужно.

Monstar 19.03.2022 23:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
177
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Само состояние не будет сохранять никаких данных при перезагрузке страницы.
Вам нужно добавить данные о состоянии в локальное хранилище.
Затем загрузите его обратно в состояние на componentDidMount (useEffect с пустым массивом зависимостей).

const Form = () => {
  const [formData, setFormData] = useState({})
  
  useEffect(() => {
    if (localStorage) {
      const formDataFromLocalStorage = localStorage.getItem('formData');
      if (formDataFromLocalStorage) {
        const formDataCopy = JSON.parse(formDataFromLocalStorage)
        setFormData({...formDataCopy})
      }
    }
  }, []);
  
  useEffect(() => {
    localStorage && localStorage.setItem("formData", JSON.stringify(formData))
  }, [formData]);
  
  const handleInputsChange = (e) => {
    setFormData({
      ...formData,
      [e.target.name]: e.target.value
    })
  }
  
  return (
    <div>
      <input 
        type = "text" 
        name = "firstName"
        placeholder='first name'
        onChange = {e => handleInputsChange(e)}
        value = {formData?.firstName}
      />
      <input 
        type = "text" 
        name = "lastName"
        placeholder='last name'
        onChange = {e => handleInputsChange(e)}
        value = {formData?.lastName}
      />
    </div>
  )
}

Edit gracious-hoover-oehb0w

Спасибо за ваш ответ, но он не работает для моего примера (пожалуйста, проверьте мой CodeSandbox). Я использую RHF, и мои данные формы представляют собой сложный объект.

KaMZaTa 20.03.2022 15:59

Я имею в виду, что использование useEffect для установки localStorage, я думаю, может быть хорошей идеей использовать little-state-machine, но как я могу обновить весь объект состояния RHF? Я мог бы наблюдать за каждым изменением, используя methods.watch(), но тогда я должен обновить состояние RHF новым. Как?

KaMZaTa 20.03.2022 20:47
Ответ принят как подходящий

Если вам помогает сохранение в localStorage, вот как я этого добился.

Определите пользовательский хук для сохранения данных

export const usePersistForm = ({
  value,
  localStorageKey,
}) => {
  useEffect(() => {
    localStorage.setItem(localStorageKey, JSON.stringify(value));
  }, [value, localStorageKey]);

  return;
};

Просто используйте его в компоненте формы

const FORM_DATA_KEY = "app_form_local_data";

export const AppForm = ({
  initialValues,
  handleFormSubmit,
}) => {
  // useCallback may not be needed, you can use a function
  // This was to improve performance since i was using modals
  const getSavedData = useCallback(() => {
    let data = localStorage.getItem(FORM_DATA_KEY);
    if (data) {
     // Parse it to a javaScript object
      try {
        data = JSON.parse(data);
      } catch (err) {
        console.info(err);
      }
      return data;
    }
    return initialValues;
  }, [initialValues]);

  const {
    handleSubmit,
    register,
    getValues,
    formState: { errors },
  } = useForm({ defaultValues: getSavedData() });
  const onSubmit: SubmitHandler = (data) => {
     // Clear from localStorage on submit
     // if this doesn’t work for you, you can use setTimeout
     // Better still you can clear on successful submission
    localStorage.removeItem(FORM_DATA_KEY);
    handleFormSubmit(data);
  };

  // getValues periodically retrieves the form data
  usePersistForm({ value: getValues(), localStorageKey: FORM_DATA_KEY });

  return (
    <form onSubmit = {handleSubmit(onSubmit)}>
      ...
    </form>
   )
}

Не могли бы вы отредактировать мой пример CodeSandbox и показать мне, как это сделать в этом конкретном случае? Я пытался, но, похоже, не работает с моим примером формы. Я получаю много Uncaught TypeError: Cannot destructure property 'zip' of 'watch(...)' as it is undefined.. Как я уже писал, я имею дело со сложным объектом состояния.

KaMZaTa 24.03.2022 20:24

Я редактировал CodeSandbox, попробуйте здесь codeandbox.io/embed/…

kwaku hubert 24.03.2022 21:12

Я отредактировал сообщение, чтобы исправить ошибку, вам нужно проанализировать строки объекта для объекта javaScript, иначе он выдаст ошибку.

kwaku hubert 24.03.2022 21:20

Спасибо, кажется, работает как шарм

KaMZaTa 27.03.2022 16:33

Другие вопросы по теме