javascript - React overwriting state variables in an object -


when try update variable in object in state react seems over-write other variables in object. write book.title, , book.author when log book displays last value had written it.

thanks in advance.

stepone.js

class createlisting extends component {        constructor(props) {          super(props);          this.handletitletextfieldchange = this.handletitletextfieldchange.bind(this);          this.handleauthortextfieldchange = this.handleauthortextfieldchange.bind(this);          this.handleyeartextfieldchange = this.handleyeartextfieldchange.bind(this);          this.handlepricetextfieldchange = this.handlepricetextfieldchange.bind(this);          this.handledesctextfieldchange = this.handledesctextfieldchange.bind(this);          this.handleisbntextfieldchange = this.handleisbntextfieldchange.bind(this);          this.log = this.log.bind(this);            this.setstate({              book: {                  title: '',                  author: '',                  year: '',                  isbn: '',                  price: '',                  desc: ''              }          })        }        log() {          console.log(this.state.book);      }        handletitletextfieldchange(e) {          this.setstate({              book: {title: e.target.value}          });      }      handleauthortextfieldchange(e) {          this.setstate({              book: {author: e.target.value}          });      }      handleyeartextfieldchange(e) {          this.setstate({              book: {year: e.target.value}          });      }      handleisbntextfieldchange(e) {          this.setstate({              book: {isbn: e.target.value}          });      }      handlepricetextfieldchange(e) {          this.setstate({              book: {price: e.target.value}          });      }      handledesctextfieldchange(e) {          this.setstate({              book: {desc: e.target.value}          });      }        render() {          return (              <div>                  <h3 classname="home-title">create listing</h3>                  <h4 classname="create-subtitle">step 1 - fill in book details</h4>                    <div classname="create-title">                      <div classname="create-title-icon">                          <i classname="fa fa-book fa-1.8x"></i>                      </div>                      <textfield                          hinttext="what book title?"                          style={style.textfield}                          multiline={true}                          onchange={this.handletitletextfieldchange}                      />                  </div>                      <div classname="create-author">                      <div classname="create-author-icon">                          <i classname="fa fa-user fa-1.8x"></i>                      </div>                      <textfield                          hinttext="who book authors?"                          style={style.textfield}                          multiline={true}                          onchange={this.handleauthortextfieldchange}                      />                  </div>                    <div classname="create-year">                      <div classname="create-year-icon">                          <i classname="fa fa-calendar fa-1.8x"></i>                      </div>                      <textfield                          hinttext="what year book published?"                          style={style.textfield}                          multiline={true}                          onchange={this.handleyeartextfieldchange}                      />                  </div>                    <div classname="create-isbn">                      <div classname="create-isbn-icon">                          <i classname="fa fa-barcode fa-1.8x"></i>                      </div>                      <textfield                          hinttext="what book isbn?"                          style={style.textfield}                          multiline={true}                          onchange={this.handleisbntextfieldchange}                      />                  </div>                    <div classname="create-price">                      <div classname="create-price-icon">                          <i classname="fa fa-gbp fa-1.8x"></i>                      </div>                      <textfield                          hinttext="what desired price?"                          style={style.textfield}                          multiline={true}                          onchange={this.handlepricetextfieldchange}                      />                  </div>                    <div classname="create-desc">                      <div classname="create-desc-icon">                          <i classname="fa fa-bookmark fa-1.8x"></i>                      </div>                      <textfield                          hinttext="short description condition?"                          style={style.textfield}                          multiline={true}                          onchange={this.handledesctextfieldchange}                      />                  </div>                    <div classname="create-next-button">                      <raisedbutton                          label="next"                          backgroundcolor={colors.pink500}                          labelcolor={colors.white}                          fullwidth={true}                          ontouchtap={this.log}                          style={style.button}/>                  </div>              </div>          );      }  }

react's setstate shallow merge of new , previous state, i.e. nested objects replaced.

instead, take care of deep merge yourself:

this.setstate({     book: object.assign({}, this.state.book, {         title: e.target.value     }) }); 

Comments

Popular posts from this blog

sql server - Cannot query correctly (MSSQL - PHP - JSON) -

php - trouble displaying mysqli database results in correct order -

C++ Linked List -