【问题标题】:React js component, map works, foreach doesn'tReact js 组件,map 有效,foreach 无效
【发布时间】:2017-07-16 13:37:09
【问题描述】:

我有一个呈现标签的组件。它遍历地图并显示数据。我尝试使用 forEach 但它不起作用。但是,如果我将地图转换为数组,它会起作用(foreach 也不适用于数组)。我在这里错过了什么?

这行得通:

render(){
    return(
        <div class="container">
            {Array.from(this.props.tags.values()).map((tag,i) => (
                <Tag
                    handleKeyDown={this.handleKeyDown.bind(this)}
                    handleBlur={this.handleBlur.bind(this)}
                    handleTouchTap={this.handleTouchTap.bind(this)}
                    handleRequestDelete={this.handleRequestDelete.bind(this)}
                    tag={tag}
                    key={i}
                />
            ))}
        </div>
    )
}

这不是:

render(){
    return(
        <div class="container">
            {this.props.tags.forEach((tag,i) => (
                <Tag
                    handleKeyDown={this.handleKeyDown.bind(this)}
                    handleBlur={this.handleBlur.bind(this)}
                    handleTouchTap={this.handleTouchTap.bind(this)}
                    handleRequestDelete={this.handleRequestDelete.bind(this)}
                    tag={tag}
                    key={i}
                />
            ))}
        </div>
    )
}

【问题讨论】:

    标签: javascript reactjs dictionary foreach


    【解决方案1】:

    Map#forEach 不返回新数组。它们都完全按照您的预期工作,即Array#map 构建一个从旧数组映射的新数组。 React.createElement 需要将其子项作为参数列表或数组。通常,您希望将您的 Map 更像是一个普通的 Object,而不是一个数组,也就是说,如果您想单独管理它的值,您可以将其转换为一个数组。

    您的Array.from 使用是一个很好的方法。这就是我通常使用Maps 的方式。如果您想使用它变得真正现代,并避免其中一次迭代(尽管我只能想象这对于最极端的情况很重要),您总是可以将迭代器函数应用于 Map 的值,然后传播迭代器。

    render() {
      const asTags = function* () {
        for (const [key, tag] of this.props.tags) {
          yield <Tag tag={tag} key={key} />;
        }
      };
    
      return (
        <div class="container">
          {[...asTags()]}
        </div>
      );
    }
    

    生成器函数是一个简单的迭代器,yields 它在 Map 中循环遍历的每个条目。我只在那里使用数组,因为我不完全确定如何在 JSX 中传播参数(我不使用 JSX 的一个原因)。如果您将React.createElement 导入为ce,则可以在渲染中简单地说ce('div', { class: 'container' }, ...asTags())

    【讨论】:

    • 谢谢!除了将地图转换为数组并在其上使用地图之外,还有更好的方法吗?
    • 当然@Gopid,我已经使用生成器的示例更新了答案,这样您就不必迭代一次以转换为数组,并让您直接迭代并将条目映射到您的新格式.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多