我的问题是关于React添加和编辑项目。我想在数组中添加对象(包含数量,数量单位,数组中名称的对象)console.log可以,但是未添加对象。在我的表格上无法显示此功能的结果。我想从API添加ingredietns列表的新对象。我不知道我有不好的道具或状态
import React, { Component } from "react";
import {
FormGroup,
FormControl,
ControlLabel,
InputGroup
} from "react-bootstrap";
export default class AddIngredient extends Component {
constructor(props) {
super(props);
this.state = {
ingredients: [],
amount: " ",
amountUnit: " ",
name: " "
};
}
onChangeAmount = e => {
this.setState({ amount: e.target.value });
console.log("amount was changed");
};
onChangeAmountUnit = e => {
this.setState({ amountUnit: e.target.value });
console.log("amount unit was changed");
};
onChangeName = e => {
this.setState({ name: e.target.value });
console.log("name was changed");
};
onClickAddIngredient = e => {
const { amount, amountUnit, name } = this.state;
const newIngredient = { amount, amountUnit, name };
this.setState({ ingredients: [...this.state.ingredients, newIngredient] });
console.log("was added");
};
render() {
const { amount, amountUnit, name } = this.props;
return (
<React.Fragment>
<FormGroup>
<ControlLabel>Přidat ingredienci</ControlLabel>
<InputGroup className="frow">
<FormControl
type="number"
placeholder="Množství"
min="0"
value={amount}
onChange={this.onChangeAmount}
/>
<FormControl
type="text"
placeholder="Jednotka"
value={amountUnit}
onChange={this.onChangeAmountUnit}
/>
</InputGroup>
<InputGroup>
<FormControl
type="text"
placeholder="Název"
value={name}
onChange={this.onChangeName}
/>
<InputGroup.Addon>
<button onClick={this.onClickAddIngredient} className={"addon"}>
Přidat
</button>
</InputGroup.Addon>
</InputGroup>
</FormGroup>
</React.Fragment>
);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
import React, { Component } from "react";
import IngredientItems from "./IngredientItems";
import AddIngredient from "./AddIngredient";
import Directions from "./Directions";
import { FormGroup, Button, ButtonGroup, Grid } from "react-bootstrap";
import BasicInfo from "./BasicInfo";
export default class RecipeForm extends Component {
constructor(props) {
super(props);
this.state = {
title: props.title || "",
servingCount: props.servingCount,
preparationTime: props.preparationTime,
sideDish: props.sideDish,
directions: props.directions,
ingredients: props.ingredients
};
}
onChange = (key, value) => {
this.setState({ [key]: value });
};
render() {
const { onCancel } = this.props;
const {
ingredients,
title,
servingCount,
sideDish,
preparationTime,
directions
} = this.state;
return (
<Grid>
<ButtonGroup
className="pull-right"
size="lg"
aria-label="Basic example"
>
<Button onClick={this.onSave} bsStyle="success">
Uložit
</Button>
<Button onClick={onCancel} bsStyle="default">
Zrušit
</Button>
</ButtonGroup>
<BasicInfo
title={title}
preparationTime={preparationTime}
servingCount={servingCount}
sideDish={sideDish}
onChange={this.onChange}
/>
<IngredientItems ingredients={ingredients} />
<Directions directions={directions} onChange={this.onChange} />
<AddIngredient onChange={this.onChange} />
<FormGroup />
</Grid>
);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
答案 0 :(得分:1)
您的ingredients
组件中有本地状态AddIngredient
,但从未实际呈现。
您似乎想要做的就是将处理程序传递给该组件,该组件将更新父组件中的ingredient
数组。
AddIngredient.js
onClickAddIngredient = e => {
const { amount, amountUnit, name } = this.state;
const newIngredient = { amount, amountUnit, name };
// call handler from parent and update there
this.props.onAdd(newIngredient);
console.log("was added");
};
RecipeForm.js
onAddIngredient = (newIngredient) => {
this.setState({ ingredients: [...this.state.ingredients, newIngredient] });
};
而且看起来好像不需要将onChange
传递给此组件,因为输入字段只是保持在其本地状态。因此,您只需添加新的处理程序即可像这样渲染它:
<AddIngredient onAdd={this.onAddIngredient} />
然后,您可以删除子组件中的本地状态ingredients
,因为它未被使用。