【发布时间】:2016-05-19 07:57:37
【问题描述】:
React 文档指出 render 函数应该是 pure 这意味着它不应该在其中使用 this.setState 。但是,我相信当状态被依赖时在“远程”上,即来自 ajax 调用的结果。唯一的解决方案是 setState() 在 render 函数中
在我的例子中。我们的用户应该能够登录。登录后,我们还需要检查用户的访问权限(ajax 调用)来决定如何显示页面。代码是这样的
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>
}
}
})
ajax 调用不能出现在componentDidMount 中,因为当用户单击登录按钮时,页面会重新呈现,并且还需要 ajax 调用。所以我想setState 的唯一位置是在 render 函数内部违反React 原则
有更好的解决方案吗?提前致谢
【问题讨论】:
-
无论您拨打
this.setState({ callAjax: true }),请拨打$.ajax。 -
@Pavlo "callAjax" 最初为 true,我将其设置为 false,因为我不想第二次调用。或者是render和setState的无限循环
-
能否提供一个完整的例子,包括组件的使用?
-
@Pavlo 谢谢。我想我已经知道答案了。 render 函数中的 setState 只要是异步的,就没有任何问题。例如事件监听器(正常方式)或ajax调用。我刚刚测试过,如果你直接在render.exception中调用setstate,就会抛出异常。如果你把它包装在一个 seTimeout 回调中。它很好
-
这里是组件facebook.github.io/react/tips/initial-ajax.html中正确AJAX调用的示例
标签: asynchronous reactjs reactive-programming