Как обновить переменные состояния сразу в React JS

Мое требование: со страницы 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: []
        };

Сообщите мне, как назначить сразу все переменные состояния в методе монтирования компонента. Заранее спасибо.

Вы хотите знать, в каком жизненном цикле должно быть установлено состояние?

Bad Code 14.08.2018 10:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы не используете обратный вызов для JSON.parse (это функция «оживления», которая помогает десериализовать данные). Вместо этого возьмите результатJSON.parse и передайте его в setState:

this.setState(JSON.parse(formdata));

Более:

Также стоит отметить, что 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 ..)

Я пробовал это. это не работает. Значения все еще пустые

Cherry g 14.08.2018 10:46

@Cherryg - это то, как вы это делаете, поэтому, если вы получаете пустые значения, это говорит нам о том, что что-то еще неверно, например, regData не имеет той структуры, которую вы думаете. Если вы покажете нам, что такое текст JSON, хранящийся в regData, мы, возможно, сможем вам помочь, но все, что мы можем сделать, это сказать: «Вот как вы это делаете».

T.J. Crowder 14.08.2018 10:47

Краудер: Это работает ... на самом деле проблема пары ключ-значение. разрешился. благодаря.

Cherry g 14.08.2018 10:54

Вы можете попробовать это, установив состояние один раз: -

   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, вы должны использовать обратный звонок.

T.J. Crowder 14.08.2018 10:43

это один из способов использования json parse: - w3schools.com/js/tryit.asp?filename=tryjson_parse_reviver

Atul 14.08.2018 10:47

Нет, это не так. Вы неправильно понимаете цель обратного вызова. Я предлагаю почитать больше, возможно, Страница MDN.

T.J. Crowder 14.08.2018 10:48

Хорошо, спасибо, я понимаю, что для этого варианта использования это не нужно.

Atul 14.08.2018 10:50

Чтобы не болтать об этом, приведенное выше не просто «не нужно», это неправильно, по двум причинам: 1. obj.key = value; будет многократно устанавливать свойство key (вы, вероятно, имели в виду obj[key] = value;), и 2. Даже если вы исправите это , приведенный выше код полностью разрушает структуру данных: jsfiddle.net/gpdb6f3c

T.J. Crowder 14.08.2018 10:59

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

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).

Я также считаю, что хранить пароль пользователя в хранилище сеанса - не лучшая идея.

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