Что не так с моей функцией добавления JavaScript?

#javascript #reactjs #lodash

#javascript #reactjs #Lodash

Вопрос:

В приведенном ниже методе объект o добавляется к списку объектов qs . Прокомментированная часть не работает, теперь раскомментированная часть работает. Что не так с прокомментированной частью?

 onCreate(o) {

    // This works (using lodash)
    this.setState({ qs: _.concat(this.state.qs, { id: this.getNextID(), ...o }) });

    // Is this not the same like the above?
    // let newQuestionnaire = {id: this.getNextID(), title: o.title, description: o.description};
    // let questionnaires = this.state.qs.push(newQuestionnaire);
    // this.setState({
    //     qs: questionnaires,
    // });
}
 

Редактировать: может быть, это кому-то поможет: первое, что появляется в Google, это push :
введите описание изображения здесь

—> Не делайте этого.

Комментарии:

1. Не используйте .push() для изменения состояния. Это не чисто. Состояние должно быть изменено только с помощью чистых операций. Кроме того, .push() возвращает длину измененного массива, а не массива. Если вы хотите сделать это без Lodash, вы можете сделать let questionnaires = this.state.qs.concat(newQuestionnaire);

2. Я не знаю Lodash, но изменять состояние, как вы это делали (через push), — преступление. Сначала вы должны скопировать состояние типа (здесь я его мелко копирую): let questions = […this.state.qs]; а затем questions.push(newQuestionnaire); И в конце this.setState …

Ответ №1:

Возврат в массив

Новое свойство длины объекта, для которого был вызван метод

попробуйте это

 let newQuestionnaire = {id: this.getNextID(), title: o.title, description: o.description};
this.setState({qs: [...this.state.qs, thisquestionnaires]})