报错信息为
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.
代码是这样的:
import React ,{Component} from 'react';
import { render } from 'react-dom';
import {IndexRoute,browserHistory, Router, Route, Link } from 'react-router';
import axios from 'axios';
import $ from 'jquery';
import App from './components';
function jianjie(){
return (
<h3>jianjie</h3>
)
}
class yewu extends Component{
constructor(props){
super(props)
this.state = {
loading: true,
error: null,
data: null
}
}
componentDidMount() {
$.get('https://api.github.com/search/repositories?q=javascript&sort=stars').then(
value => this.setState({loading: false, data: value}),
error => this.setState({loading: false, error: error}));
}
render(){
if (this.state.loading) {
return <span>Loading...</span>;
}
else if (this.state.error !== null) {
return <span>Error: {this.state.error.message}</span>;
}
else {
var repos = this.state.data.items;
var repoList = repos.map(function (repo, index) {
return (
<li key={index}><a href={repo.html_url}>{repo.name}</a> ({repo.stargazers_count} stars) <br/> {repo.description}</li>
);
});
return (
<div>
<h1>Most Popular JavaScript Projects in Github</h1>
<ol>{repoList}</ol>
</div>
);
}
}
}
function yewu2(){
return <yewu promise={'https://api.github.com/search/repositories?q=javascript&sort=stars'}/>
}
function lianxi(){
return (
<h3>lianxi</h3>
)
}
function test(){
return (
<h3>test</h3>
)
}
function About(){
return (
<h3>About</h3>
)
}
function Home(){
return (
<h3>Home</h3>
)
}
const ele = document.createElement('div');
document.body.appendChild(ele);
const props = {
name:"clm",
age:30
};
render(
<Router history = {browserHistory} >
<route path ="/" component={App} >
<IndexRoute component={Home} />
<route path ="/jianjie" component={jianjie} />
<route path ="/yewu" component={yewu} />
<route path ="/lianxi" component={lianxi} />
<route path ="/about" component={About} />
<route path ="/test" component={test} />
</route>
</Router>, ele)
主要是这一部分:
class yewu extends Component{
constructor(props){
super(props)
this.state = {
loading: true,
error: null,
data: null
}
}
componentDidMount() {
$.get('https://api.github.com/search/repositories?q=javascript&sort=stars').then(
value => this.setState({loading: false, data: value}),
error => this.setState({loading: false, error: error}));
}
render(){
if (this.state.loading) {
return <span>Loading...</span>;
}
else if (this.state.error !== null) {
return <span>Error: {this.state.error.message}</span>;
}
else {
var repos = this.state.data.items;
var repoList = repos.map(function (repo, index) {
return (
<li key={index}><a href={repo.html_url}>{repo.name}</a> ({repo.stargazers_count} stars) <br/> {repo.description}</li>
);
});
return (
<div>
<h1>Most Popular JavaScript Projects in Github</h1>
<ol>{repoList}</ol>
</div>
);
}
}
}
yewu组件的componentDidMount
里面有个ajax,并且在回调里面调用this.setState()
再看路由部分代码:
<Router history = {browserHistory} >
<route path ="/" component={App} >
<IndexRoute component={Home} />
<route path ="/jianjie" component={jianjie} />
<route path ="/yewu" component={yewu} />
<route path ="/lianxi" component={lianxi} />
<route path ="/about" component={About} />
<route path ="/test" component={test} />
</route>
</Router>
当路由切换到/yewu
,componentDidMount
里面的回调函数执行完成后再切换别的路由不会报错,但是如果回调没有执行,切换别的路由会报错,
在别的网站看到这样一条信息:
估计是你setState在异步的callback里执行,而这个时候由于你返回上一页,组件已经被unmount了。可以考虑在unmount的时候取消相关pendingRequest的回调,比如ajax请求的话,就abort掉。或者用isMounted183做下判断,不过根据文档,这个api可能日后被移除。
但是还是组织到怎么修正代码;
构造方法里修改this.state有问题吧,应该用getInitialState,或者写在componentDidMount里面