На странице реализована возможность сохранения настроек. На форме присутствует 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 раза надо нажать кнопку Сохранить.
Как это побороть?
Ваш код слишком много обращается в 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()
выполнится точно после того как обновится состояние.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть два компонента и нужно чтобы они оба рендерились по одному путиКомпонент PostWrap будет меняться а компонент People будет меняться редко
Хочу отправить значение data_state = false на сервер после клика на картинкуКод скрипта:
Никак не могу понять в чём ошибка, неужели так делать нельзя