如何在React无状态组件中使用ES6映射函数

时间:2018-10-10 17:17:14

标签: javascript reactjs es6-map

在我的React应用程序中,我有一个对象数组,这些对象是通过api响应获得的。我想在手风琴中显示每个对象的细节。我正在使用可访问React的手风琴,并创建了一个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

有人可以让我知道我要去哪里了吗?预先感谢。

3 个答案:

答案 0 :(得分:1)

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

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

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

另一个问题是,您不能只从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 "";
      }
}

答案 1 :(得分:0)

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

找不到道具的原因通常用于将数据从父级传递到子级。这篇博客文章在解释它方面做得很好。 https://medium.com/@ruthmpardee/passing-data-between-react-components-103ad82ebd17

答案 2 :(得分:0)

要回答您的第一个问题: 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>
        }