2016-11-16 7 views
3

私はフォームから状態を更新する反応コンポーネントを持っているとします。Reactに状態を保存するのはいつ安全ですか?

class Form extends React.Component { 
    constructor(props) { 
    super(props); 
    this.handleChange = this.handleChange.bind(this); 
    this.state = { 
     someCheckboxState: false, 
    } 
    } 
    render() { 
    return (
     <input onChange={this.handleChange} checked={this.state.someCheckboxState} /> 
    ); 
    } 
    handleChange(event) { 
    this.setState({ 
     someCheckboxState: event.target.checked, 
    }); 
    } 
} 

ここで、その状態をサーバー(またはどこか)に送信したいとします。私はちょうどこの

handleChange(event) { 
    this.setState({ 
    someCheckboxState: event.target.checked, 
    }); 
    SendStateToServer(JSON.stringify(this.state)); // BAD! Not yet mutated 
} 

をすれば、私はrenderにそれを置くことができますが、それは最初のサーバーに送信されますだけでなく、ほかのレンダリング、関数がrenderと呼ばれる状態を送信するために愚かなようです。

状態を永続化/シリアル化するのは大丈夫ですか?

+1

SETSTATEのための2番目のパラメータは、状態変化が完了した後に実行されるコールバックです – MichaelB

答えて

10

ReactのsetStateの第2引数は、状態遷移が完了した後に起動されるコールバックです。

this.setState(newState,() => console.log(this.state)); 

だから、あなたのケースで:

handleChange(event) { 
    this.setState({ 
    someCheckboxState: event.target.checked, 
    },() => { 
    SendStateToServer(JSON.stringify(this.state)); 
    }); 
} 
1

はい、setState()second parameter、完璧な方法は、そのようなことを行います。

class Form extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    this.handleChange = this.handleChange.bind(this); 
 
    this.state = { 
 
     someCheckboxState: false, 
 
    } 
 
    } 
 
    render() { 
 
    return (< input type = "checkbox" 
 
     onChange = { 
 
     this.handleChange 
 
     } 
 
     checked = { 
 
     this.state.someCheckboxState 
 
     } 
 
     /> 
 
    ); 
 
    } 
 
    handleChange(event) { 
 
    this.setState({ 
 
    someCheckboxState: event.target.checked, 
 
    },() => { // do your work 
 
     console.log(JSON.stringify(this.state)); 
 
    }); 
 
} 
 
} 
 

 
ReactDOM.render(< Form/> , document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="root"></div>

関連する問題