2016-11-16 13 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
相关问题