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