#reactjs
#reactjs
Вопрос:
Я хочу сохранить данные формы нескольких полей ввода в localstorage
при отправке и отобразить в другом компоненте.
<code>
handleSubmit = (event) => {
event.preventDefault();
console.log(this.state);
if (formValid(this.state)) {
console.error("Form is valid");
localStorage.setItem("userSubmit", ...this.state);
} else {
console.error("Form is invalid");
}
};
</code>
Комментарии:
1. попробуйте использовать только localStorage.setItem(«userSubmit», this.state);
2. Попробуйте это:
localStorage.setItem("userSubmit", JSON.stringify(this.state));
3. Вы не можете вызвать функцию, используя оператор распространения по объекту. Это проблема, с которой вы сталкиваетесь. Если бы это был массив, это было бы прекрасно, но ожидаемое поведение не будет вашим желаемым.
Ответ №1:
Проблема в том, что вы вызываете функцию (в данном случае setItem), используя оператор распространения по простому объекту. Вы не можете этого сделать.
Вы пытаетесь это сделать:
state = { name: 'stack', lastname: 'overflow' }
localStorage.setItem('myKey', name: 'stack', lastname: 'overflow')
Это не имеет смысла, и вы делаете это там.
Оператор распространения допустим, например, для массива:
state = ['stack', 'overflow']
localStorage.setItem('myKey', 'stack', 'overflow')
В этом случае вызов будет действительным, но конечным результатом будет сохранение ‘stack’, а переполнение будет игнорироваться, и оно не будет сохранено в localStorage.
Вам нужно изменить свой код на:
При этом будет сохранена строка [object Object].
localStorage.setItem("userSubmit", this.state);
это ошибка (вы этого не хотите), поэтому вам нужно будет сохранить ваш объект в виде строки
localStorage.setItem("userSubmit", JSON.stringify(this.state));
Ответ №2:
this.state
вероятно, это объект, который на самом деле не является итеративным (и поэтому вы не можете использовать для него оператор распространения).
Если вы хотите сохранить объект в localStorage
, вы можете сохранить его в виде строки, используя:
localStorage.setItem("userSubmit", JSON.stringify(this.state));
Ответ №3:
Вы уже получили несколько хороших ответов о том, как это исправить (Stringify — хорошая идея), но почему ваш подход не работает?
Взгляните на статью MDN об операторе распространения:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Spread_syntax
Как вы можете видеть, вы можете распространять объекты только на другие объекты. Не в массивы или функции, например. Почему это так происходит? Я думаю, потому что оператор sread пытается распространить пары значений ключа на значения ключа.
Это также подводит нас к другому возможному решению:
localStorage.setItem("userSubmit", Object.values(this.state));
Таким образом, вы создаете массив значений из состояния. Конечно, это полезно только в том случае, если вам нужны только значения без соответствующих ключей, в противном случае метод stringify все равно лучше.