如何动态显示模式中显示的内容

时间:2018-08-11 14:44:31

标签: javascript reactjs object debugging

如果我在<Modal>之间输入内容,则单击相应的按钮后,成功在模式中显示所选食物的类型

<p>{this.state.cTaco}</p>
<p>{this.state.bTaco}</p>
<p>{this.state.cBurrito}</p>

但是,我希望它不是使用1或1逐一写出,而是使用某种映射或循环动态显示。

使用我当前的代码,它将在模态上显示对象中所有项目的名称,而不是实际的食物名称。

cTacoClicked

cTaco

bTacoClicked

bTaco

cBurritoSelected

cBurrito

它应该显示(同样,如果我以1到1的形式写出状态,它的确显示如下):

Chicken Taco

Beef Taco

Chicken Burrito

我如何正确使用循环使它动态发生。

这是我的代码:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import Modal from 'react-modal';

import Aux from '../../../../hoc/Aux';
import FoodButton from '../FoodButtons/FoodButton';
import CheckoutButton from '../CheckoutButton/CheckoutButton';
import axios from '../../../../axios-foodChosen';

import { CLOSE_MODAL, OPEN_MODAL } from "../../../../store/action/NoNameAction";

class TacoTypes extends Component {
    state = {
        items: {
            cTacoClicked: false,
            cTaco: '',

            bTacoClicked: false,
            bTaco: '',

            cBurritoSelected: false,
            cBurrito: ''
        }
    }

    componentWillMount() {
        // for modal
        Modal.setAppElement('body');
    }

    chickenTaco() {
        // modal
        const cTacoSelected = "Chicken Taco";
        this.setState({cTacClicked: true, cTaco: cTacoSelected});
    }

    beefTaco() {
        // modal
        const bTacoSelected = "Beef Taco";
        this.setState({bTacoClicked: true, bTaco: bTacoSelected});
    }

    chickenBurrito() {
        // modal
        const cBurritoSelected = "Chicken Burrito";
        this.setState({cBurritoSelected: true, cBurrito: cBurritoSelected });
    }

    render() {
        return (
            <Aux>
                <FoodButton clicked={() => this.chickenTaco()} label={"Chicken Taco"}/>
                <FoodButton clicked={() => this.beefTaco()} label={"Beef Taco"}/>
                <FoodButton clicked={() => this.chickenBurrito()} label={"Chicken Burrito"}/>

                <CheckoutButton clicked={() => this.props.openModalRedux()}/>

                <Modal isOpen={this.props.isOpen}>
                    <p>
                        {
                            Object.keys(this.state.items).map(i => (
                                <p>{i}</p>
                            ))
                        }
                    </p>
                    <button onClick={() => this.props.closeModalRedux()}>Close</button>
                </Modal>
            </Aux>
        );
    }
}

const mapStateToProps = state => {
    return {
        // props for modal
        isOpen: state.global.isModalOpen,
    }
};

const mapDispatchToProps = dispatch => {
    return {
        // Modal handlers
        openModalRedux: () => dispatch({type: OPEN_MODAL}),
        closeModalRedux: () => dispatch({type: CLOSE_MODAL})
    }
};

export default connect(mapStateToProps, mapDispatchToProps)(TacoTypes);

2 个答案:

答案 0 :(得分:1)

您当前仅在使用items对象的键。您想获取键在state对象中具有的值。

<Modal isOpen={this.props.isOpen}>
  <p>
    {Object.keys(this.state.items).map(key => (
      <p key={key}>{this.state[key]}</p>
    ))}
  </p>
  <button onClick={() => this.props.closeModalRedux()}>Close</button>
</Modal>

答案 1 :(得分:0)

您的代码非常混乱。您的代码结构是固定的,这意味着每种炸玉米饼类型必须分别声明并使用不同的方法...

代码的主要问题是,您在读取状态下拥有items,但是在*Taco()方法和chickenBurrito()方法中,您设置了this.state.cTaco(例如),而不是this.state.items.cTaco

但是您一般的代码可以应该进行改进。您可以执行以下操作,而不是针对每种炸玉米饼类型使用单独的方法:

将您的状态结构更改为:

this.state = {
  selectedItem: '',
};

并在构造函数中声明以下对象:

this.items = {
  // If you'll have more attributes for each item, it's best that you set
  // each item as an object with a name and the other attributes.
  chickenTaco: 'Chicken Taco',
  beefTaco: 'Beef Taco',
  chickenBurrito: 'Chicken Burrito',
};

然后您可以使用一种方法,而不是三种方法(或者您拥有许多项):

selectItem(item) {
  this.setState({selectedItem: item});
}

所以现在您的Modal内容将如下所示:

{this.items.map(item => (<p key={item}>{item}</p>)}

远距离清洁器。这样,项目是动态的,您可以轻松添加属性和项目。在现实生活中,您可能会从后端获取此信息,无法在其中预测每个项目需要创建哪些方法,或者将拥有多少个项目(如果有)。