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
Post a Comment