Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ReactJS:如何在更改状态后立即更新组件_Javascript_Reactjs - Fatal编程技术网

Javascript ReactJS:如何在更改状态后立即更新组件

Javascript ReactJS:如何在更改状态后立即更新组件,javascript,reactjs,Javascript,Reactjs,我的页面需要从服务器获取数据,这可能需要几秒钟的时间。因此,我希望在获取时显示“加载…”。因此,我有一个布尔状态变量loading,用于指示它是否正在获取数据。如果load为true,render()函数显示“立即加载”,否则显示“未加载”。然而,事实证明,在将load设置为true之后,react无法重新渲染组件 这是你的电话号码 var Hello=React.createClass({ getInitialState:函数(){ 返回{ 加载:false, }; }, handleClic

我的页面需要从服务器获取数据,这可能需要几秒钟的时间。因此,我希望在获取时显示“加载…”。因此,我有一个布尔状态变量
loading
,用于指示它是否正在获取数据。如果
load
true
render()
函数显示“立即加载”,否则显示“未加载”。然而,事实证明,在将
load
设置为true之后,react无法重新渲染组件

这是你的电话号码

var Hello=React.createClass({
getInitialState:函数(){
返回{
加载:false,
};
},
handleClick:function(){
这是我的国家({
加载:正确
},函数(){
//模拟提取数据的虚拟循环

对于(var i=0;i,因为JS是单线程的。当您运行循环时,整个页面冻结。所以它不会对这个问题做出反应

获取数据是异步操作,它不会冻结页面。 您可以使用
setTimeout
对其进行仿真。在这种情况下,所有这些都可以正常工作

例如:

handleClick: function(){
  this.setState({
    loading: true
  }, function(){
    setTimeout(function() {
      this.setState({
        loading: false,
     });
    }.bind(this), 3000)
  }.bind(this));
},

因为JS是单线程的。当你运行循环时,整个页面都会冻结。所以它不会对这个问题做出反应

获取数据是异步操作,它不会冻结页面。 您可以使用
setTimeout
对其进行仿真。在这种情况下,所有这些都可以正常工作

例如:

handleClick: function(){
  this.setState({
    loading: true
  }, function(){
    setTimeout(function() {
      this.setState({
        loading: false,
     });
    }.bind(this), 3000)
  }.bind(this));
},

你可以试着这样想

var Hello = React.createClass({
    getInitialState: function(){
    return {
        loading: false
    };
  },

  handleClick: function(){
    fetch("http://sampleurl.com")
    .then(function(data){
      //if success
      this.setState({loading: true})
    })
  },

  render: function() {
  var result;
  if(this.state.loading == true){
    result = <p>Loading Now</p> 
  } else {
    result = <p>Not Loading</p>
  }
    return (
       <div>
         <button onClick={this.handleClick}>load</button>
         {/*render variable result here*/}
         {result}
       </div>);
  }
});
var Hello=React.createClass({
getInitialState:函数(){
返回{
加载:错误
};
},
handleClick:function(){
取回(“http://sampleurl.com")
.then(功能(数据){
//如果成功
this.setState({loading:true})
})
},
render:function(){
var结果;
if(this.state.loading==true){
结果=立即加载

}否则{ 结果=未加载

} 返回( 负载 {/*此处呈现变量结果*/} {result} ); } });
你可以这样想

var Hello = React.createClass({
    getInitialState: function(){
    return {
        loading: false
    };
  },

  handleClick: function(){
    fetch("http://sampleurl.com")
    .then(function(data){
      //if success
      this.setState({loading: true})
    })
  },

  render: function() {
  var result;
  if(this.state.loading == true){
    result = <p>Loading Now</p> 
  } else {
    result = <p>Not Loading</p>
  }
    return (
       <div>
         <button onClick={this.handleClick}>load</button>
         {/*render variable result here*/}
         {result}
       </div>);
  }
});
var Hello=React.createClass({
getInitialState:函数(){
返回{
加载:错误
};
},
handleClick:function(){
取回(“http://sampleurl.com")
.then(功能(数据){
//如果成功
this.setState({loading:true})
})
},
render:function(){
var结果;
if(this.state.loading==true){
结果=立即加载

}否则{ 结果=未加载

} 返回( 负载 {/*此处呈现变量结果*/} {result} ); } });
代码中没有
获取
变量。你是说
加载
?是的。我会编辑它。代码中没有
获取
变量。你是说
加载
?是的。我会编辑它。太棒了!我不知道。谢谢!太棒了!我不知道。谢谢!关于你的信息,集合的第二个参数tate是在更新完成后调用的回调。请参阅setState的第二个参数是在更新完成后调用的回调。