2016-11-16 18 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

第二個參數是運行回調後的狀態變更完成 – MichaelB

回答

10

React的setState的第二個參數是狀態轉換完成後觸發的回調。

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>

爲的setState
相關問題