【发布时间】:2018-12-04 23:09:15
【问题描述】:
我们如何 setState in componentDidMount 挂钩在一个参数中?
我的问题是 React notify 的警告:
Warning: Can't call setState (or forceUpdate) on an unmounted
component. This is a no-op, but it indicates a memory leak in your
application. To fix, cancel all subscriptions and asynchronous tasks in the
componentWillUnmount method.
in DiscoverPage (created by Route)
在我的DiscoverPage 组件中:
import React, { Component } from 'react';
import { Switch, Route, Redirect } from 'react-router-dom';
import TvShows from './TvShows';
import Movies from './Movies';
import MovieDetail from "../MoviePage/MovieDetail";
import TvDetail from "../TvShowPage/TvDetail";
class DiscoverPage extends Component {
constructor(props) {
super(props);
this.state = {
data: {}
}
}
getDataItem = (data) => {
this.setState({ data: data });
};
render() {
return (
<Switch>
<Route exact path="/discover/movie" render={props => <Movies data={this.getDataItem} {...props} />} />
<Route path="/discover/tv" render={props => <TvShows data={this.getDataItem} {...props} />} />
<Route path="/movie/:movie" render={props => <MovieDetail data={this.state.data} {...props} />} />
<Route path="/tv/:tv" render={props => <TvDetail data={this.state.data} {...props} />} />
<Redirect to="/discover/movie" />
</Switch>
);
}
}
export default DiscoverPage;
在子组件中(本例为Movies组件):
import React, { Component } from 'react';
import requestApi from '../api';
import MovieList from "../MoviePage/MovieList";
class Movies extends Component {
constructor(props) {
super(props);
this.state = {
data: {
page: 1,
results: []
}
}
}
componentDidMount() {
requestApi.fetchData('discover', 'movie').then(response => {
this.setState({ data: response.data, isLoading: false });
});
}
getMoviebyId = (id) => {
requestApi.fetchDataById('movie', id).then(response => {
this.props.data(response.data);
});
};
nextPage = (e) => {
const page = this.state.data.page + 1;
requestApi.fetchDataPaginate('discover', 'movie', page).then(response => {
this.setState({ data: response.data });
});
};
prevPaginate = (e) => {
const page = this.state.data.page - 1;
requestApi.fetchDataPaginate('discover', 'movie', page).then(response => {
this.setState({ data: response.data });
});
};
render() {
return (
<div className="container">
<div className="ss_media">
<h2 className="title">Discover New Movies & TV Shows</h2>
<MovieList
movie={this.getMoviebyId}
routeProps={this.props}
prevPaginate={this.prevPaginate}
nextPaginate={this.nextPage}
moviesList={this.state.data} />
</div>
</div>
);
}
}
export default Movies;
【问题讨论】:
-
看起来有点奇怪。
getDataItem方法设置新状态。为了清楚起见,您是否期望getDataItem设置新状态而不是返回state.data? -
嗨@MikhailKatrin,getDataItem 是一个回调函数。当 Movies 组件创建 AJAX 请求然后将数据传递给父组件(本例为 DiscoverPage),然后父组件(DiscoverPage)将接收数据并设置为基本状态。
-
你能说明如何在任何子组件中调用
getDataItem吗? -
@KarenGrigoryan 我更新了更多信息。请检查上面。谢谢
标签: javascript reactjs setstate unmount