2016-12-30 25 views
3

私は働くコードがないことをお詫びしますが、これを行う方法についてはわかりません。私はToggleBoxの状態が変更されたときにAppクラスのthis.state.countを更新したいと考えています。私はこれが以前におかげで、以前に頼まれていると確信しています。ReactJS - 子の状態が変更されたときに親の状態を更新する

import React, { Component } from 'react'; 
import ToggleBox from '../components/ToggleBox'; 
class App extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
     total : 60, 
     count: 0 
    }; 
    } 
    getToggles() { 
     let toggles = []; 
     for (let i = 0; i < this.state.count; i++) { 
     toggles.push(<ToggleBox checked={false} key={i} />); 
     } 
    return toggles; 
    } 

    render() { 
    let toggles = this.getToggles(); 
    return (
     <div className="App"> 
     {{this.state.count}} - {{this.state.total}} 
     <div className="container-toggle-box"> 
      {toggles} 
     </div> 
     </div> 
    ); 
    } 
} 

export default App; 

...とコンポーネント:

import React, {Component} from 'react'; 
class ToggleBox extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     active = this.props.checked 
    }; 
    this.handleClick= this.handleClick.bind(this); 
    } 
    handleClick() { 
    this.setState({active: (this.state.active) ? false : true} 
    } 
    render() { 
    let mark = (this.state.active) ? 'x' : 'o' 
     return (
     <span> 
      {mark} 
     </span> 
    ); 
    } 
} 

export default ToggleBox; 
+0

コンポーネントをレンダリングしているだけで、マーク上のonClickイベントで状態を変更したいのですか?その小道具を設定し、関数を渡します。 – bntzio

答えて

4

あなたはToggleBoxに、カウントを更新機能を渡す必要があります。例えば

toggles.push(<ToggleBox 
    checked={false} 
    key={i} 
    incrementCount={() => this.setState({count: this.state.count + 1})} 
/>); 

その後、あなたは自分の子コンポーネントでそのメソッドを呼び出します。

handleClick() { 
    this.setState({active: (this.state.active) ? false : true}; 
    this.props.incrementCount(); 
} 

このパターンは、しばしば「フラックス」と呼ばれている(または、より正確にするために、これはFluxパターン全体の一部です)、それはReactがどのように使われるように設計されたかの中心的な部分です。このように関数を渡すことで、子コンポーネントは、countの仕組みや増分の仕方について何も知る必要はありません。これは子供にとって簡単なことですが、もっと重要なのは、カウントの仕組みを変更したいときには、それを制御する場所(親コンポーネント)が1つしかないので、もっと簡単になります。

+2

パーフェクト、ありがとう。時には私は物事を思い知らされ、小道具としての機能を忘れることもあります。 – smykes

+0

親コンポーネントから状態がトグル可能な場合はどうなりますか?私はthis.props.incrementCount(-1)を実行するためにcomponentDidUpdateを使用しようとしています。各トグルボックスの代わりに1回だけタイトが実行されます。 – smykes

+0

あなたが正しくあなたを理解している場合、状態は親コンポーネントによって制御され、トグル関数を渡す必要があります。そうでない場合は、新しい質問を開始することをお勧めします。コメントに収まる)。 – machineghost

関連する問題