嗨,我在试着看它的工作原理是纯的。
当我使用以下代码时:
App.js
import React from 'react';
import './App.css';
import Displayer from './Components/displayer';
const days=[
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
'Sunday'
];
class App extends React.PureComponent{
constructor(props){
super(props);
this.state={day:[]};
this.increment=this.increment.bind(this);
this.decrement=this.decrement.bind(this);
}
increment(){
var demo=this.state.day;
if(this.state.day.length<7)
demo.push(days[this.state.day.length]);
this.setState({day:demo});
}
decrement(){
var demo=this.state.day;
demo.pop();
this.setState({day:demo});
}
render(){
return (
<div>
<Displayer day={this.state.day} increment={this.increment} decrement={this.decrement}/>
</div>
);
}
}
export default App;Displayer.js
import React from 'react';
class Displayer extends React.PureComponent{
render(){
var {day,increment,decrement}=this.props;
return(
<div>
<button onClick={increment}>Add Day</button>
<button onClick={decrement}>Remove Day</button>
{
day.map((item,index)=>{
return <h1 key={index}>{item}</h1>
})
}
</div>
)
}
}
export default Displayer;这并没有给我想要的结果。
但是,当我只使用React.Component时,它给了我想要的结果。

有人能帮我在React.PureComponent的帮助下得到这个吗?
发布于 2019-11-22 12:19:38
您在道具中将this.state.day作为array传递。
在将以前的道具和状态与next进行比较时,浅表比较将检查原语是否具有相同的值(例如,1等于1或true等于true)。
PureComponent永远不会执行深度比较。这就是为什么它不能在你的情况下起作用。
如果您按下面的方式稍微更新您的代码,那么它将工作。
<Displayer
dayCount={this.state.day.length} // add it to make it work.
day={this.state.day} increment={this.increment} decrement={this.decrement}/>此外,还必须从React.PureComponent类中删除App,并将其设置为Component。在那之后,它会对你起作用。
您可以在这里找到更多关于PureComponent的信息。
https://stackoverflow.com/questions/58994044
复制相似问题