2016-11-10 3 views
1

私の状態のオブジェクト内の変数を更新しようとすると、そのオブジェクト内の他の変数を上書きするように見えます。私はbook.titleに書いてからbook.authorに書きます。しかし、私が本を記録するとき、それは私が書いた最後の値しか表示しません。オブジェクト内の状態変数を上書きすることに反応します

ご協力いただきありがとうございます。

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 a listing</h3> 
 
       <h4 className="create-subtitle">Step 1 - Fill in the 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 is the 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 are the 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 was the 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 is the 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 is the 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 about the 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> 
 
     ); 
 
    } 
 
}

答えて

2

あなたがオブジェクト全体だけでなく、値を変更しています。

は、book状態を、タイトルのみを含むオブジェクトに変更します。 また、コンストラクタはsetStateを呼び出すべきではありません。それは、あなたがちょうどあなたがこの本オブジェクトは、あなたの全体の状態を含んでいる場合、あなたのコンポーネントは、例えば、設定されている方法を再考したい場合がありますthis.state = {...};

行うことができますする必要があります。

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.State({ 
      title: '', 
      author: '', 
      year: '', 
      isbn: '', 
      price: '', 
      desc: '' 
    }) 

} 

log() { 
    console.log(this.state.book); 
} 

handleTitleTextFieldChange(e) { 
    this.setState({ 
     title: e.target.value 
    }); 
} 
3

React's setState only does a shallow merge of the new and previous state、すなわちネストされたオブジェクトが完全に置換されています。

代わりに、深い自分自身をマージするの世話をする:

this.setState({ 
    book: Object.assign({}, this.state.book, { 
     title: e.target.value 
    }) 
}); 
+0

ああ私は、素晴らしい作品を参照してください、ありがとう! –

0
this.setState({ 
    book: {...this.state.book, title: e.target.value} 
}) 

を私は」なかったのそれをテストしますが、それは動作するはずです...

関連する問題