【问题标题】:How to use ES6 map function in React stateless component如何在 React 无状态组件中使用 ES6 映射功能
【发布时间】:2018-10-10 17:17:13
【问题描述】:

在我的 React 应用程序中,我有一个通过 api 响应获得的对象数组。我想在手风琴中显示每个对象的细节。我正在使用 react-accessible 手风琴并创建了一个 React 无状态组件。我希望我的每个手风琴都代表数组的一个对象。我在 dataProp 中有我的对象数组并对其进行迭代 我已经编写了如下所示的组件-

import React from 'react';
import ReactDOM from 'react-dom';
import ChildAccordion from './ChildAccordion'
import { setData } from '../actions/action'
import { connect } from 'react-redux'

import {
    Accordion,
    AccordionItem,
    AccordionItemTitle,
    AccordionItemBody,
} from 'react-accessible-accordion';


import 'react-accessible-accordion/dist/fancy-example.css';
import 'react-accessible-accordion/dist/minimal-example.css';


class ParentAccordion extends React.Component {

    componentWillMount() {
      //call to action
      this.props.setData();
  }

  getMappedData = (dataProp) =>{
      if (dataProp) { 
         return dataProp.map(item =>{
            return <div>{dataProp[item]}</div>
        })
      }
      else {
       return "";
      }
}

    render(){
        const { dataProp } = this.props;
        return (
            // RENDER THE COMPONENT
                <Accordion>
        <AccordionItem>
            <AccordionItemTitle>
                <h3>Details: 
               { 
                this.getMappedData(item[name])
               }

                </h3>
            </AccordionItemTitle>
            <AccordionItemBody>
            <ChildAccordion {...dataProp} />
            </AccordionItemBody>
        </AccordionItem>
    </Accordion>
        );
    }
}


const mapStateToProps = state => {
    return {
        dataProp: state.dataProp
    }
};

const mapDispatchToProps = dispatch => ({
  setData(data) {
    dispatch(setData(data));
  }
})
export default connect (mapStateToProps,mapDispatchToProps) (ParentAccordion)

这样做时,这给了我错误-

Uncaught ReferenceError: item is not defined

谁能告诉我哪里出错了?提前致谢。

【问题讨论】:

    标签: javascript reactjs es6-map


    【解决方案1】:

    我认为您缺少两件事 - 首先,您的 getMappedData 方法没有右花括号。其次,if条件需要返回一个值:

    getMappedData = (dataProp) =>{
          if (dataProp) { 
            return dataProp.map(item =>{
                return item;
            })
          }
          else {
           return "";
          }
    }
    

    另外,方法调用应该是this.getMappedData 而不是this.props.getMappedData,因为方法是在类上定义的,而不是从道具进来的

    另一个问题是,你不能只从getMappedData方法返回一个数组,你需要返回jsx,所以它可能应该是这样的:

    getMappedData = (dataProp) =>{
          if (dataProp) { 
            return dataProp.map(item =>{
                return <div>{item}</div>;
            })
          }
          else {
           return "";
          }
    }
    

    假设item 是一个字符串或数字。如果它是一个对象或数组,它将不起作用。

    你的渲染方法也可以只使用{this.getMappedData()},不需要那里的道具,你的getMappedData方法可以使用道具:

    getMappedData() {
          const { dataProp } = this.props;
          if (dataProp) { 
            return dataProp.map(item =>{
                return <div>{item}</div>;
            })
          }
          else {
           return "";
          }
    }
    

    【讨论】:

    • 我已添加更改,但在调用该方法时出现错误 - Uncaught ReferenceError: item is not defined
    • 您能否复制新代码并将其粘贴到您原来的问题下方 - 可能将其命名为“编辑”或其他内容
    • 你的回报看起来不对 - 它不应该是 return &lt;div&gt;dataProp[item]&lt;/div&gt; 查看我的代码 - 它应该是 &lt;div&gt;{item}&lt;/div&gt; 假设 item 不是对象
    • 正确,我修改并添加了花括号,仍然是同样的问题:(
    【解决方案2】:

    回答您最初的问题: dataProp 数组可以简单地以如下方式呈现:

      render(){
          const { dataProp } = this.props;
    
          return <Accordion>
                {
                  dataProp && dataProp.map(item =>
                  <AccordionItem>
                    <AccordionItemTitle>
                      <h3>
                        Details: {item.title}
                      </h3>
                    </AccordionItemTitle>
                    <AccordionItemBody>
                      {item.body}
                    </AccordionItemBody>
                  </AccordionItem>
                )}
              </Accordion>
            }
    

    【讨论】:

      【解决方案3】:

      将您的电话 this.props.getMappedData(item[name]) 更新为 this.getMappedData(item[name])

      找不到的原因是 props 通常用于将数据从父级传递给子级。这篇博文很好地解释了它。 https://medium.com/@ruthmpardee/passing-data-between-react-components-103ad82ebd17

      【讨论】:

      • 我的错,这是一个错字。我只使用 this.getMappedData(item[name]) 。已编辑帖子。感谢您指出。
      猜你喜欢
      • 2020-12-22
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多