【发布时间】:2020-03-09 16:45:17
【问题描述】:
我的搜索栏组件改变了布局组件的状态。因此,Layout 组件会触发其所有子组件的重新渲染。我尝试实现 React.memo(),但对我没有帮助。请纠正我。提前谢谢!
布局组件:
export default class Layout extends Component {
state = {
cityName: "",
date: "",
icon: "",
};
searchbarSubmitHandler = e => {
const cityName =
e.target.children[0].firstChild.children[0].value;
this.setState({
cityName: cityName
});
console.log(this.state.cityName);
e.preventDefault();
};
searchbarChangeHandler = e => {
this.setState({
cityName: e.target.value
});
};
render() {
return (
<div>
<Searchbar
submit={this.searchbarSubmitHandler}
change={this.searchbarChangeHandler}
/>
<Switch>
<Route
exact
path="/"
component={() =>
<CurrentWeather icon={this.state.icon} />
}
/>
<Route
path="/24h-weather"
component={HourlyWeather}
/>
</Switch>
</div>
);
}
}
搜索栏组件:
const searchbar = props => {
return (
<div className="searchbar">
<form onSubmit={props.submit}>
<div className="inputs">
<div className="inputTextWrapper">
<input
className="inputText"
type="text"
placeholder="City name..."
onChange={props.change}
/>
</div>
<input
className="inputSubmit"
type="submit"
value="Search"
/>
</div>
</form>
</div>
);
};
export default searchbar;
我不想重新渲染的 CurrentWeather 组件:
const currentWeather = props => {
return (
<div className="container">
<h3>London, UK</h3>
<img
src={`http://openweathermap.org/img/wn/${props.icon}.png`}
alt="weather icon"
/>
</div>
);
};
const areEqual = (prevProps, nextProps) => prevProps === nextProps;
export default React.memo(currentWeather, areEqual);
【问题讨论】:
-
你能为此做一个codepen吗?我建议将路由器组件中的开关分开,并为功能提供更多信息的名称。
标签: javascript reactjs optimization react-hooks