React document states that the render
function should be pure which mean it should not use this.setState
in it .However, I believe when the state is depended on 'remote' i.e. result from ajax call.The only solution is setState()
inside a render
function
In my case.Our users can should be able to log in. After login, We also need check the user's access (ajax call )to decide how to display the page.The code is something like this
React.createClass({
render:function(){
if(this.state.user.login)
{
//do not call it twice
if(this.state.callAjax)
{
var self=this
$.ajax{
success:function(result)
{
if(result==a)
{self.setState({callAjax:false,hasAccess:a})}
if(result==b)
{self.setState({callAjax:false,hasAccess:b})}
}
}
}
if(this.state.hasAccess==a) return <Page />
else if(this.state.hasAccess==a) return <AnotherPage />
else return <LoadingPage />
}
else
{
return <div>
<button onClick:{
function(){this.setState({user.login:true})}
}>
LOGIN
</button>
</div>
}
}
})
The ajax call can not appear in componentDidMount
because when user click LOGIN button the page is re-rendered and also need ajax call .So I suppose the only place to setState
is inside the render
function which breach the React principle
Any better solutions ? Thanks in advance