首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InfernoJS/ReactJS -为什么我的for循环在我的渲染中返回相同的索引?

InfernoJS/ReactJS -为什么我的for循环在我的渲染中返回相同的索引?
EN

Stack Overflow用户
提问于 2018-01-09 13:01:40
回答 2查看 96关注 0票数 0

我在我的渲染函数中有一个for循环,它应该渲染fontawesome库中的5颗星,评级为3应该渲染3颗满星和2颗空星……

我遇到的问题是,我的迭代器"i“对所有这些参数都返回5。至少在我的onClick处理程序中是这样。但真正奇怪的是,如果使用相同的迭代器变量"i“作为id或元素的任何其他自定义属性,它会显示正确的1、2、3、4或5。

代码语言:javascript
复制
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>;
}
}
EN

回答 2

Stack Overflow用户

发布于 2018-01-09 15:14:03

拖了两个小时后,我像这样重新赋值解决了这个问题。

代码语言:javascript
复制
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>;
}

我不知道这是如何工作的,但它做到了。

票数 0
EN

Stack Overflow用户

发布于 2018-01-09 17:07:29

令可以是变量i的语句在块级作用域中,每个循环i的等价物只在当前块级作用域中使用,因此i是唯一的,所以i= 1,2,3,4,5。与Var等价的全局作用域语句I,在i引用周期相同后,i始终等于5。您还可以使用闭包来缓存i,或者在循环中使用let而不是var i,如下所示

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48161689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档