Реагируйте, последнее изменение ввода не сохраняется в хранилище сеансов при обновлении или изменении страницы, например, при возврате или ссылке

#javascript #reactjs #react-hooks #material-ui

Вопрос:

Я пытаюсь сохранить значения <from> моего хранилища сеансов, чтобы, если пользователь перейдет на другую страницу веб-сайта, например, нажав на ссылку, чтобы создать нового «Автора», когда пользователь вернется к <from> все значения все еще там.

Но если я нажму на ссылку после ввода некоторых значений <TextField> , все последние значения каждого поля будут отсутствовать, когда я вернусь в свою форму.

напр.. Я пишу hello на своем вводе, если я обновлю, у меня есть hell

Надеюсь, все ясно, и кто-нибудь сможет просветить меня о том, чего мне не хватает, это было бы здорово. Ниже приводится выдержка из моего кода.

 const initialValues = {
  title: '',
  //... and other stuff
}

export default function BookForm() {

  const [values, setValues] = useState(initialValues);

  const handleChange = (event) => {
    if (event.target.value) {
      setValues({...values, [event.target.name]: event.target.value})
      sessionStorage.setItem('values', JSON.stringify(values))
    }
    else {
      setValues({...values, [prop]: initialValues[prop]})
      sessionStorage.setItem('values', JSON.stringify(values))
    }
  };

  useEffect(() => {
    if(!isLoaded) {
      loadAutocomplete()
    }
    if (sessionStorage.getItem('values')){
      setValues(JSON.parse(sessionStorage.getItem('values')))
    }
  }, [isLoaded])

}

return (
    <form className={classes.root} onSubmit={sendForm}>
      <Grid container>
        <Grid item xs={12}>

          {/*TITRE OK*/}
          <LineForm>
            <TextField
              fullWidth
              name={"title"}
              id="book-title"
              label="TITRE"
              required
              value={values.title}
              onChange={handleChange}
              InputLabelProps={{
                shrink: true,
              }}
            />
          </LineForm>

// ...


 

Редактировать:

 let formValues = {...values, [event.target.name]: event.target.value}
    if (event.target.value) {
      setValues(formValues)
      sessionStorage.setItem('values', JSON.stringify(formValues))
    }
 

кажется, это работает

Ответ №1:

Ваша проблема setState в том, что при выполнении функции значения состояния не обновляются немедленно, в вашем случае, когда вы это делаете:

       setValues({...values, [event.target.name]: event.target.value})
      sessionStorage.setItem('values', JSON.stringify(values))
 

вы задаете переменную в хранилище сеансов values , но она не является самой обновленной.

Просто сохраните значение, на которое вы отправляете setValues , и используйте его для обновления хранилища сеансов.

Редактировать:

как бы это выглядело:

  const handleChange = (event) => {
    if (event.target.value) {
      const newValues = {...values, [event.target.name]: event.target.value};

      setValues(newValues)
      sessionStorage.setItem('values', JSON.stringify(newValues))
    }
    else {
      setValues({...values, [prop]: initialValues[prop]})
      sessionStorage.setItem('values', JSON.stringify(values))
    }
  };
 

Комментарии:

1. « пусть значения формы = {…значения, [event.target.name]: событие.цель.значение} если (событие.цель.значение) { Значения набора(значения формы) sessionStorage.setItem(«значения», JSON.stringify(значения формы)) } ` Что-то вроде этого ? это действительно работает

2. Я отредактирую свой ответ, чтобы добавить решение @PaulChoppin