javascript - 为什么内容按错误的选项排序?
问题描述
所以我从 API 中获取电影信息。在我的页面中,我在下拉列表中有三个选项,用于按字母、用户分数和受欢迎程度进行排序。
问题是当我选择一个选项时,它会按它之前的选项排序。例如,当我选择按用户分数排序时,它会按字母顺序排序,这是下拉列表中的选项。然后,如果我继续选择选项,它最终会变得随机并与其中任何一个进行排序。
不知道为什么会这样。我猜这与我设置状态的方式有关。
这是我的代码:
import React, {Component} from "react";
import {connect} from "react-redux";
import {crimeGenre} from "./redux";
class CrimeGenre extends Component {
constructor(){
super();
this.state = {
value: "alphabetically"
}
}
componentDidMount(){
this.props.crimeGenre();
}
sortFilms = (event) => {
this.setState({
value: event.target.value
})
if(this.state.value === "alphabetically"){
return this.props.select && this.props.select.sort((a, b) => {
return a.title < b.title ? -1 : 1;
});
}else if(this.state.value === "score"){
return this.props.select && this.props.select.sort((a, b) => {
return a.vote_average > b.vote_average ? -1 : 1;
});
}else if(this.state.value === "popularity"){
return this.props.select && this.props.select.sort((a, b) => {
return a.popularity > b.popularity? -1 : 1;
});
}
}
render(){
const mappedSelected = this.props.select && this.props.select.map((film, i) => {
return (
<div key={i}>
<h1>{film.title}</h1>
<img src={`http://image.tmdb.org/t/p/w185${film.poster_path}`}/>
<p>Avg. User Score: {film.vote_average}</p>
<p>Popularity Index: {film.popularity.toFixed(0)}</p>
</div>
)
})
return(
<div>
<form>
<label>
Sort By:
<select value={this.state.value} onChange={this.sortFilms}>
<option id="alphabetically" value="alphabetically">Alphabetically</option>
<option id="score" value="score">User Score</option>
<option id="popularity" value="popularity">Popularity</option>
</select>
</label>
</form>
{mappedSelected}
</div>
)
}
}
export default connect(state=> state, {crimeGenre})(CrimeGenre);
解决方案
ReactsetState()
不会立即反映状态值的更新,而是会创建一个挂起的状态转换。调用后访问状态setState()
可能会返回现有值。
无法保证调用的同步操作,setState
并且调用可能会被批处理以提高性能。
查看官方的ReactJS 文档,它更好地解释了这一点。
为确保您的sortFilms
函数使用新状态,请将其作为回调传递,setState()
如下所示:
sortFilms = (event) => {
this.setState({value: event.target.value}, function () {
if(this.state.value === "alphabetically"){
return this.props.select && this.props.select.sort((a, b) => {
return a.title < b.title ? -1 : 1;
});
}else if(this.state.value === "score"){
return this.props.select && this.props.select.sort((a, b) => {
return a.vote_average > b.vote_average ? -1 : 1;
});
}else if(this.state.value === "popularity"){
return this.props.select && this.props.select.sort((a, b) => {
return a.popularity > b.popularity? -1 : 1;
});
}
});
}
推荐阅读
- python - 使用 imageio (python) 向帧添加注释
- react-google-maps - React-google-maps - MarkerWithLabel - 标签重叠
- javascript - Webpack - 动态导入一个类
- android - 如何使用 jdbc 将 android studio 连接到 mysql
- java - sonar-maven-plugin 失败,超过 GC 开销限制
- vba - 未答复的旧帖子:Excel 自定义图标因多个工作簿而丢失
- angular6 - Angular 6 HttpInterceptor - 获取 401 时刷新令牌并创建相同的请求
- javascript - Leaflet.js - 根据 geojson 类别数据创建图层并添加标记?
- java - 如何在按下时更改按钮背景并在停止按下后继续更改?
- python-3.x - 如何使这个电子邮件地址验证脚本更准确?