setState сохраняет значение со второго раза

123
11 мая 2021, 16:00

На странице реализована возможность сохранения настроек. На форме присутствует 3 поля. 1 обычный input и 2 textarea. Использую react-bootstrap.

Описано это следующим образом:

<Form>
                <Form.Group className='col-xs-2'>
                    <Form.Label>Логин:</Form.Label>
                    <Form.Control type='text' name='username' value={this.state.username} onChange={this.handleChange.bind(this)}/>
                </Form.Group>
                <Form.Group>
                    <Form.Label>Список URL для мониторинга:</Form.Label>
                    <Form.Control as='textarea' rows='10' name='featurelist' value={this.state.featurelist} onChange={this.handleChange.bind(this)}/>
                </Form.Group>
                <Form.Group>
                    <Form.Label>Список URL для точечного мониторинга:</Form.Label>
                    <Form.Control as='textarea' rows='10' name='detailedlist' value={this.state.detailedlist} onChange={this.handleChange.bind(this)}/>
                </Form.Group>
                <Button onClick={this.handleSubmit.bind(this)} variant="success">Сохранить</Button><div />
                <br />
            </Form>

Значения сохраняются в State следующим образом:

handleChange(event){
    const target = event.target;
    const value = target.value;
    const name = target.name;
    this.setState({[name]: value})
  };

Сохранение реализовано следующим образом:

handleSubmit(){
      if(this.state.username){
        this.setState({savedUsername: this.state.username});
        localStorage.setItem('username', this.state.username);
      }
      if(this.state.featurelist){
        let featurelist = this.state.featurelist.replace(/^\s*[\r\n]/gm, '')
        this.setState({featurelist: featurelist});
        let savedFeatureList = featurelist.split('\n')
        savedFeatureList = savedFeatureList.filter((el)=> el !== '')
        this.setState({savedFeatureList: savedFeatureList});
        this.forceUpdate();
        localStorage.setItem('featurelist', this.state.savedFeatureList);
      }
      if(this.state.detailedlist){
            let detailedlist = this.state.detailedlist.replace(/^\s*[\r\n]/gm, '');
            this.setState({detailedlist: detailedlist});
            let savedDatailedList = detailedlist.split('\n');
            savedDatailedList = savedDatailedList.filter((el)=> el !== '')
            this.setState({savedDatailedList: savedDatailedList});
            localStorage.setItem('detailedlist', savedDatailedList)
      } 
      //this.props.handleSave(this.state);
      console.log(this.state);
      NotificationManager.warning('Сохранено');
  }

Основная проблема, что все поля сохраняются с первого раза, а вот в savedFeatureList только со второго, т.е. 2 раза надо нажать кнопку Сохранить.

Как это побороть?

Answer 1

Ваш код слишком много обращается в state, это занимает время. Я немного переписал, так как заметил что вы лишний раз используете setState.

let {featurelist} = this.state;
let newFL = featurelist.replace(/^\s*[\r\n]/gm, '').split('\n').filter((el)=> el !=='');
this.setState({savedFeatureList: newFL});
localStorage.setItem('featurelist',newFL);

SetState выполняется асинхронно, для того чтобы убедится что ваш код выполнится сразу после SetState вы можете указать внутри него функцию callback вот так this.setState({Example:111}, ()=>{doSomething()}); В этом случае doSomething() выполнится точно после того как обновится состояние.

READ ALSO
Route не рендерит компонент. У Двух компонентов одинаковый путь но Route рендерит только один компонент

Route не рендерит компонент. У Двух компонентов одинаковый путь но Route рендерит только один компонент

Есть два компонента и нужно чтобы они оба рендерились по одному путиКомпонент PostWrap будет меняться а компонент People будет меняться редко

110
Post запрос axios vue js

Post запрос axios vue js

Хочу отправить значение data_state = false на сервер после клика на картинкуКод скрипта:

104
Использование в объекте своих же свойств

Использование в объекте своих же свойств

Никак не могу понять в чём ошибка, неужели так делать нельзя

92