我在我的渲染函数中有一个for循环,它应该渲染fontawesome库中的5颗星,评级为3应该渲染3颗满星和2颗空星……
我遇到的问题是,我的迭代器"i“对所有这些参数都返回5。至少在我的onClick处理程序中是这样。但真正奇怪的是,如果使用相同的迭代器变量"i“作为id或元素的任何其他自定义属性,它会显示正确的1、2、3、4或5。
import Component from "inferno-component";
import styles from "./styles";
export default class StarRating extends Component {
constructor() {
super();
this.state = {
rating: 3
};
}
rate = rating => {
console.log(rating);
this.setState({
rating: rating
});
};
render() {
var stars = [];
for (var i = 0; i < 5; i++) {
var klass = "fa fa-star";
if (this.state.rating <= i && this.state.rating != null) {
klass += "-o";
}
stars.push(
<i
style={styles.star}
className={klass}
id={i}
aria-hidden="true"
onClick={() => this.rate(i)}
/>
);
}
return <span>{stars}</span>;
}
}发布于 2018-01-09 15:14:03
拖了两个小时后,我像这样重新赋值解决了这个问题。
render() {
var stars = [];
for (var i = 0; i < 5; i++) {
var klass = "fa fa-star";
if (this.state.rating <= i && this.state.rating != null) {
klass += "-o";
}
let id = i + 1;
stars.push(
<i
style={styles.star}
className={klass}
id={i}
aria-hidden="true"
onClick={() => this.rate(id)}
/>
);
}
return <span>{stars}</span>;
}我不知道这是如何工作的,但它做到了。
发布于 2018-01-09 17:07:29
令可以是变量i的语句在块级作用域中,每个循环i的等价物只在当前块级作用域中使用,因此i是唯一的,所以i= 1,2,3,4,5。与Var等价的全局作用域语句I,在i引用周期相同后,i始终等于5。您还可以使用闭包来缓存i,或者在循环中使用let而不是var i,如下所示
for (let i = 0; i < 5; i++) {
var klass = "fa fa-star";
if (this.state.rating <= i && this.state.rating != null) {
klass += "-o";
}
stars.push(
<i
style={styles.star}
className={klass}
id={i}
aria-hidden="true"
onClick={() => this.rate(i)}
/>
);
}
for (var i = 0; i < 5; i++) {
(function(i){
var klass = "fa fa-star";
if (this.state.rating <= i && this.state.rating != null) {
klass += "-o";
}
stars.push(
<i
style={styles.star}
className={klass}
id={i}
aria-hidden="true"
onClick={() => this.rate(i)}
/>
);
})(i)
}https://stackoverflow.com/questions/48161689
复制相似问题