Мое требование: со страницы 1 на страницу 2 (при отправке формы) пользователь перемещается по некоторым действиям. если Пользователь переходит со страницы 2 на страницу 1 (назад), тогда все поля формы на странице 1 должны быть заполнены. Итак, я сохранил все данные в сеансе, но при обратной навигации не смог назначить все значения состояния из сеанса.
код компонента page1:
componentWillMount() {
if (sessionStorage.getItem("regData")) {
let formdata = sessionStorage.getItem("regData");
JSON.parse(formdata, (key, value) => {
this.setState({key:value});});
}
}
//state variables
this.state = {
username: "",
password: "",
email: "",
name: "",
mobile: "",
city: "",
redirectToReferrer: false,
error: {
email_error: "",
password_error: "",
name_error: "",
username_error: "",
mobile_error: "",
showError: false,
errorMessage: engTranslations.global.faild
},
value: "",
suggestions: [],
selectedCity: []
};
Сообщите мне, как назначить сразу все переменные состояния в методе монтирования компонента. Заранее спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не используете обратный вызов для JSON.parse (это функция «оживления», которая помогает десериализовать данные). Вместо этого возьмите результатJSON.parse и передайте его в setState:
this.setState(JSON.parse(formdata));
Более:
JSON.parsesetStatesetState, но многие обновления состояния основаны на состоянии или реквизитах, а для те вы должны использовать форму обратного вызова setState)Также стоит отметить, что componentWillMount не является подходящим методом жизненного цикла для этого. Поскольку здесь нет асинхронной операции, правильным местом будет ваш конструктор, а ваш конструктор - это место один, которое вы можете назначить непосредственно для this.state, поэтому:
constructor() {
this.state = Object.assign(
{/*...default state here...*/},
JSON.parse(sessionStorage.getItem("regData")) // see note
);
}
(Если нет regData, getItem вернет null, который пройдет через JSON.parse [он преобразуется в "null", а затем обратно в null] и игнорируется Object.assign, поэтому нам не нужен оператор if.)
(Если бы была задействована асинхронная операция, это была бы componentDidMount, и вместо этого вы использовали бы setState ..)
Я пробовал это. это не работает. Значения все еще пустые
@Cherryg - это то, как вы это делаете, поэтому, если вы получаете пустые значения, это говорит нам о том, что что-то еще неверно, например, regData не имеет той структуры, которую вы думаете. Если вы покажете нам, что такое текст JSON, хранящийся в regData, мы, возможно, сможем вам помочь, но все, что мы можем сделать, это сказать: «Вот как вы это делаете».
Краудер: Это работает ... на самом деле проблема пары ключ-значение. разрешился. благодаря.
Вы можете попробовать это, установив состояние один раз: -
if (sessionStorage.getItem("regData")) {
let formdata = sessionStorage.getItem("regData");
let obj = {};
JSON.parse(formdata, (key, value) => {
obj.key = value;
});
let newState= {...this.state, ...obj};
this.setState(newState);
}
Это не то, как вы используете JSON.parse и искажаете данные, и это не то, как вы используете setState по нескольким причинам. Во-первых, нормально предоставлять только те свойства состояния, которые вы хотите обновить (поэтому нет необходимости в ...this.state), а во-вторых, если вы являются предоставляете информацию о состоянии на основе существующей информации о состоянии, вы не можете использовать объектную форму setState, вы должны использовать обратный звонок.
это один из способов использования json parse: - w3schools.com/js/tryit.asp?filename=tryjson_parse_reviver
Нет, это не так. Вы неправильно понимаете цель обратного вызова. Я предлагаю почитать больше, возможно, Страница MDN.
Хорошо, спасибо, я понимаю, что для этого варианта использования это не нужно.
Чтобы не болтать об этом, приведенное выше не просто «не нужно», это неправильно, по двум причинам: 1. obj.key = value; будет многократно устанавливать свойство key (вы, вероятно, имели в виду obj[key] = value;), и 2. Даже если вы исправите это , приведенный выше код полностью разрушает структуру данных: jsfiddle.net/gpdb6f3c
Я не совсем уверен, правильно ли я понял требование, но я предполагаю, что вам нужно сделать, предполагая, что значение хранилища сеанса содержит все поля, которые вам нужны, вместо этого:
JSON.parse(formdata, (key, value) => {
this.setState({key:value});});
});
Сделай это:
this.setState(JSON.parse(formdata));
Также в качестве примечаний примите во внимание, что использование componentWillMount для установки состояния считается анти-шаблоном (https://vasanthk.gitbooks.io/react-bits/anti-patterns/04.setState-in-componentWillMount.html).
Я также считаю, что хранить пароль пользователя в хранилище сеанса - не лучшая идея.
Вы хотите знать, в каком жизненном цикле должно быть установлено состояние?