【发布时间】:2021-05-15 15:15:30
【问题描述】:
我正在使用 React 进行我的前几个实验,在这个组件中,我正在调用一个外部 API 来获取所有 NBA 球员的列表,通过作为组件的 prop 接收的 teamId 过滤他们,最后渲染被过滤的玩家。
一个考虑因素是,由于我调用 API 并获得了一个大列表,因此我将其保持在组件的状态中,以便对该组件的新调用将使用该状态,而不是再次调用 API。这不是生产代码,我不拥有 API,所以我这样做是因为我收到了“请求太多”的消息,因为我一直在尝试一些东西。
无论如何,当我尝试这段代码时,我得到了已经很有名的:
已超过最大更新深度。这可能发生在组件 在 componentWillUpdate 内重复调用 setState 或 组件更新。 React 将嵌套更新的数量限制为 防止无限循环。
我已经查看了标记,我认为我没有进行任何会导致渲染方法再次触发的方法调用等等,所以我不知道为什么会发生这种情况。
提前感谢您的帮助。
这是有问题的代码:
class Players extends Component {
nbaPlayersUrl = "https://someUrl.com";
state = {
players: null,
selectedTeamPlayers: null
};
render() {
if (this.props.teamId === null) return null;
if (this.state.players !== null) {
var selectedTeamPlayers = this.filterPlayersByTeamId(this.state.players);
var markup = this.getMarkup(selectedTeamPlayers);
this.setState({selectedTeamPlayers: markup});
} else {
this.getPlayersList();
}
return (
this.state.selectedTeamPlayers
);
}
getPlayersList() {
let api = new ExternalApi();
let that = this;
api.get(this.nbaPlayersUrl).then(r => {
r.json().then(result => {
let players = result.data.map(p => ({
id: p.id,
firstName: p.first_name,
lastName: p.last_name,
position: p.position,
heightInches: p.height_inches,
heightFeet: p.height_feet,
weightPounds: p.weight_pounds,
teamId: p.team.id
}));
that.setState({players: players});
var selectedTeamPlayers = that.filterPlayersByTeamId(players);
var markup = that.getMarkup(selectedTeamPlayers);
that.setState({selectedTeamPlayers: markup});
});
});
}
filterPlayersByTeamId(players) {
return players.filter(p => {
return p.teamId === this.props.teamId;
});
}
getMarkup(players) {
var result = players.map(p => {
<li key={p.id}>
<div>
<label htmlFor="firstName">First Name</label> <input type="text" name="firstName" value={p.firstName} readOnly></input>
</div>
<div>
<label htmlFor="lastName">Last Name</label> <input type="text" name="lastName" value={p.lastName} readOnly></input>
</div>
<div>
<label htmlFor="position">Position</label> <input type="text" name="position" value={p.position} readOnly></input>
</div>
</li>
});
return (
<ul>
{result}
</ul>
);
}
}
export default Players;
【问题讨论】:
-
不应该将 getPlayersList() 写成异步回调吗?
标签: javascript reactjs