【问题标题】:How can I dynamically display what appears in the modal如何动态显示模态中出现的内容
【发布时间】:2023-03-31 08:46:01
【问题描述】:

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

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

但我希望它使用某种地图或循环动态显示,而不是一一写出来。

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

cTacoClicked

cTaco

bTacoClicked

bTaco

cBurritoSelected

cBurrito

它应该显示(同样,如果我逐个写出状态,它确实会这样显示):

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);

【问题讨论】:

    标签: javascript reactjs object debugging


    【解决方案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>
    

    【讨论】:

    • 啊,我之前已经试过了,但由于某种原因它不起作用:(
    • @sp92 对不起,我误会了。尝试更新的答案。
    • 好的,现在可以了!我真的有和你以前一样的东西,它让我发疯,为什么它不起作用。谢谢你,Tholle:D!
    【解决方案2】:

    您的代码非常混乱。您的代码结构是固定的,这意味着必须以不同的方法单独声明每种 taco 类型...

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

    但您的代码通常可以并且应该得到改进。您可以执行以下操作,而不是针对每种 taco 类型使用单独的方法:

    将您的状态结构更改为:

    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>)}
    

    更干净。这样,项目是动态的,您可以轻松添加属性和项目。在实际使用中,您可能会从后端获取此信息,您无法预测需要为每个项目创建哪些方法,或者您将拥有多少项目(如果有的话)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2012-08-24
      • 2020-03-12
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多