我想检查当你多次使用this.set状态时会发生什么(为了讨论,两次)。我以为组件会被渲染两次,但显然它只被渲染了一次。我的另一个期望是,第二个setState调用可能会超过第一个,但是你猜对了——工作正常。
链接到JSFIDLE
var Hello = React.createClass({
render: function() {
return (
<div>
<div>Hello {this.props.name}</div>
<CheckBox />
</div>
);
}
});
var CheckBox = React.createClass({
getInitialState: function() {
return {
alex: 0
};
},
handleChange: function(event) {
this.setState({
value: event.target.value
});
this.setState({
alex: 5
});
},
render: function() {
alert('render');
return (
<div>
<label htmlFor="alex">Alex</label>
<input type="checkbox" onChange={this.handleChange} name="alex" />
<div>{this.state.alex}</div>
</div>
);
}
});
ReactDOM.render(
<Hello name="World" />,
document.getElementById('container')
);
正如您将看到的,在每个渲染上都会弹出一个“渲染”警报。
你能解释为什么它工作正常吗?
setState()方法不会立即更新组件的状态,它只是将更新放在稍后处理的队列中。React可以将多个更新请求批处理在一起,以使渲染更加高效。因此,当您尝试根据组件的先前状态更新状态时,必须采取特殊的预防措施。
例如,以下代码仅将state value属性增加1,即使调用了4次:
class Counter extends React.Component{
constructor(props){
super(props)
//initial state set up
this.state = {value:0}
}
componentDidMount(){
//updating state
this.setState({value:this.state.value+1})
this.setState({value:this.state.value+1})
this.setState({value:this.state.value+1})
this.setState({value:this.state.value+1})
}
render(){
return <div>Message:{this.state.value}</div>
}
}
要在更新后使用状态,请执行回调参数中的所有逻辑:
//this.state.count is originally 0
this.setState({count:42}, () => {
console.log(this.state.count)
//outputs 42
})
setState(updater,[callback])方法可以将updater函数作为其第一个参数,根据以前的状态和属性更新状态。updater函数的返回值将与以前的组件状态进行简单合并。该方法异步更新状态,因此在状态完全更新完成后将调用一个选项回调。
例子:
this.setState((prevState, props) => {
return {attribute:"value"}
})
以下是一个如何基于先前状态更新状态的示例:
class Counter extends React.Component{
constructor(props) {
super(props)
//initial state set up
this.state = {message:"initial message"}
}
componentDidMount() {
//updating state
this.setState((prevState, props) => {
return {message: prevState.message + '!'}
})
}
render(){
return <div>Message:{this.state.message}</div>
}
}
对事件处理程序和生命周期方法中发生的状态更新作出反应。因此,如果在
明确地说,这只适用于反应控制的合成事件处理程序和生命周期方法。例如,状态更新不会在AJAX和
setTimeout
事件处理程序中成批进行。
问题内容: 我想检查一下当您多次使用this.setState时发生了什么(为了讨论而两次)。我认为该组件将被渲染两次,但显然它仅被渲染一次。我的另一个期望是,对setState的第二个调用可能会在第一个调用之上运行,但是您猜到了- 运行良好。 链接到JSfiddle 如您所见,每个渲染器上都会弹出一个警告,提示“渲染器”。 您是否对其正常工作有解释? 问题答案: React批处理状态更新发生在事
在react项目中,子组件通过useImperativeHandle将自身的两个setState方法暴露给父组件,父组件通过ref调用这些方法的时候其中一个状态(skuBreak)出现了异常,又会再次被初始化成false,但是getDisabledLabel代码运行是没问题的,打印出来的skuBreak虽然又变回了false,但是展示在页面上依然是‘xxx’, 子组件: 父组件调用 希望大佬告知原
我是新来的反应,什么来理解为什么console.log在渲染函数内部被调用两次? 如果我不从组件扩展,而是使用功能,控制台只打印一次
本文向大家介绍描述下在react中无状态组件和有状态组件的区别是什么?相关面试题,主要包含被问及描述下在react中无状态组件和有状态组件的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 1,无状态组件主要用来定义模板,接收来自父组件props传递过来的数据,使用{props.xxx}的表达式把props塞到模板里面。无状态组件应该保持模板的纯粹性,以便于组件复用。创建无状态组件如下: v
打字稿:2.8。3 @类型/反应:16.3。14 函数组件中的返回类型是,当我将组件声明为(React.StatelessComponent的别名)。 出现了三个错误: >
我第一次尝试React钩子,一切似乎都很好,直到我意识到当我获取数据并更新两个不同的状态变量(数据和加载标志)时,我的组件(数据表)会呈现两次,尽管对状态更新器的两次调用都发生在同一个函数中。下面是我的api函数,它将两个变量都返回到我的组件中。 在普通的类组件中,您只需调用一次来更新状态,状态可能是一个复杂的对象,但“挂钩方式”似乎是将状态拆分为更小的单元,其副作用似乎是在单独更新时多次重新呈现
问题内容: 我试图在ES6中使用有状态的React组件,但是当我定义一个构造函数时,在多次渲染该组件(从其父对象)时,构造函数将仅被调用一次。示例如下所示。 这不会更新渲染的输出(它将始终为),但是日志将输出: 这是一个JSFiddle:http : //jsfiddle.net/jor0xu1a/1/ 我知道该示例不需要状态,但是我尝试使其尽可能简单以显示我的问题。 我想念什么? 问题答案: 我
问题内容: 我正在尝试新的React Hooks,并有一个带有计数器的Clock组件,该计数器应该每秒增加一次。但是,该值不会增加到超过一。 问题答案: 原因是传递给的闭包中的回调仅访问第一个渲染器中的变量,而无法访问后续渲染器中的新值,因为第二次未调用。 回调中的值始终为0 。 就像您熟悉的状态挂钩一样,状态挂钩有两种形式:一种是处于更新状态的状态,另一种是将当前状态传入的回调形式。您应该使用第