Javascript 将数据传递给父级-recipebook React
我正在开发配方书应用程序,并尝试实现编辑输入功能。 其工作原理是输入配方名称(如意大利面),然后输入配料(如鸡蛋、面粉、盐)。配料必须用逗号输入,并显示为列表Javascript 将数据传递给父级-recipebook React,javascript,reactjs,Javascript,Reactjs,我正在开发配方书应用程序,并尝试实现编辑输入功能。 其工作原理是输入配方名称(如意大利面),然后输入配料(如鸡蛋、面粉、盐)。配料必须用逗号输入,并显示为列表 面食 -蛋 -面粉 我可以看到它在某种程度上起作用,因为当我再次尝试编辑它时,我可以看到输入文本中的新条目(例如最初是鸡蛋、面粉、盐->鸡蛋、面粉、盐、水) 然而,额外的成分(在上面的例子中:水)并没有出现在列表中。我是否必须找到重新呈现列表的方法 更新: 我想我知道错误可能在哪里。传递数据和设置状态时出现一些问题 <EditR
- 面食
- -蛋
- -面粉
<EditRecipe recipe={this.props.recipe} editRecipe={this.editRecipe.bind(this, this.props.recipe.id, recipe)}/>
App.js
import React, { Component } from 'react';
// import logo from './logo.svg';
import './App.css';
import uuid from 'uuid';
import Modal from 'react-modal';
import RecipeList from './components/RecipeList/RecipeList';
import AddRecipe from './components/AddRecipe/AddRecipe';
class App extends Component {
constructor(props){
super(props);
this.state = {
recipes:[]
};
}
getRecipes(){
this.setState({recipes:[
{
id: uuid.v4(),
food: "pumpkin pie",
ingredients: ["pumpkin puree", "sweetened condensed milk", "eggs", "pumpkin pie spice", "pie crust"]
},
{
id: uuid.v4(),
food: "spaghetti",
ingredients: ["noodles", "tomato sauce", "meatballs"]
},
{
id: uuid.v4(),
food: "onion pie",
ingredients: ["onion", "pie crust"]
},
]});
}
componentWillMount(){
this.getRecipes();
}
handleAddRecipe(recipe){
let recipes = this.state.recipes;
recipes.push(recipe);
this.setState({recipes: recipes});
}
handleDeleteRecipe(id){
let recipes = this.state.recipes;
let index = recipes.findIndex(x => x.id === id);
recipes.splice(index,1);
this.setState({recipes: recipes});
}
handleEditRecipe(id, recipe){
let recipes = this.state.recipes;
let index = recipes.findIndex(x => x.id === id);
recipes.splice(index,1,recipe);
this.setState({recipes: recipes});
}
render() {
return (
<div className="App">
<RecipeList recipes={this.state.recipes} onDelete={this.handleDeleteRecipe.bind(this)} onEdit={this.handleEditRecipe.bind(this)}/>
<AddRecipe addRecipe={this.handleAddRecipe.bind(this)}/>
</div>
);
}
}
export default App;
import React,{Component}来自'React';
//从“/logo.svg”导入徽标;
导入“/App.css”;
从“uuid”导入uuid;
从“反应模态”导入模态;
从“./components/RecipeList/RecipeList”导入RecipeList;
从“./components/AddRecipe/AddRecipe”导入AddRecipe;
类应用程序扩展组件{
建造师(道具){
超级(道具);
此.state={
食谱:[]
};
}
getRecipes(){
此.setState({配方:[
{
id:uuid.v4(),
食物:“南瓜派”,
配料:[“南瓜泥”、“甜炼乳”、“鸡蛋”、“南瓜派香料”、“派皮”]
},
{
id:uuid.v4(),
食物:“意大利面”,
配料:[“面条”、“番茄酱”、“肉丸”]
},
{
id:uuid.v4(),
食物:“洋葱派”,
配料:[“洋葱”、“馅饼皮”]
},
]});
}
组件willmount(){
这个.getRecipes();
}
掌心药(配方){
让recipes=this.state.recipes;
配方。推送(配方);
this.setState({recipes:recipes});
}
手持电子设备(id){
让recipes=this.state.recipes;
让index=recipes.findIndex(x=>x.id==id);
配方。拼接(索引1);
this.setState({recipes:recipes});
}
HandleEdit配方(id,配方){
让recipes=this.state.recipes;
让index=recipes.findIndex(x=>x.id==id);
配方。拼接(索引1,配方);
this.setState({recipes:recipes});
}
render(){
返回(
);
}
}
导出默认应用程序;
RecipeList.js
import React, { Component } from 'react';
import Collapsible from 'react-collapsible';
import RecipeItem from '../RecipeItem/RecipeItem'
import './RecipeList.css';
class RecipeList extends Component{
deleteRecipe(id){
this.props.onDelete(id);
}
editRecipe(id, recipe){
this.props.onEdit(id, recipe);
}
render(){
let recipeItem;
if(this.props.recipes){
recipeItem=this.props.recipes.map(recipe => {
return(
<RecipeItem onEdit={this.editRecipe.bind(this)} onDelete={this.deleteRecipe.bind(this)} key={recipe.id} recipe={recipe} />
)
});
}
return(
<div className="recipeList box">
{recipeItem}
</div>
)
}
}
export default RecipeList;
import React,{Component}来自'React';
从“反应可折叠”导入可折叠;
从“../RecipeItem/RecipeItem”导入RecipeItem
导入“/RecipeList.css”;
类RecipeList扩展了组件{
删除配方(id){
this.props.onDelete(id);
}
编辑配方(id,配方){
this.props.onEdit(id,recipe);
}
render(){
让我们相互尊重;
如果(这个。道具。食谱){
recipeItem=this.props.recipes.map(recipe=>{
返回(
)
});
}
返回(
{recipeItem}
)
}
}
导出默认RecipeList;
RecipeItem.js
import React, { Component } from 'react';
import Collapsible from 'react-collapsible';
import EditRecipe from '../EditRecipe/EditRecipe';
class RecipeItem extends Component{
deleteRecipe(id){
this.props.onDelete(id);
}
editRecipe(id, recipe){
this.props.onEdit(id, recipe);
}
render(){
let recipe=this.props.recipe
let foodName=recipe.food;
let ingredientItem;
if(recipe.ingredients){
ingredientItem=recipe.ingredients.map(ingredient=>{
return(
<a className="panel-block">
{ingredient}
</a>
)
})
}
return(
<ul>
<li className="Recipe">
<Collapsible trigger={foodName} transitionTime="200" easing="ease-in-out">
<nav className="panel">
<p className="panel-heading">
Ingredients
</p>
{ingredientItem}
<div className="panel-block">
<button className="button is-warning is-outlined" onClick={this.deleteRecipe.bind(this, this.props.recipe.id)}>
Delete
</button>
<EditRecipe recipe={this.props.recipe} editRecipe={this.editRecipe.bind(this, this.props.recipe.id, recipe)}/>
</div>
</nav>
</Collapsible>
</li>
</ul>
);
}
}
export default RecipeItem;
import React,{Component}来自'React';
从“反应可折叠”导入可折叠;
从“../EditRecipe/EditRecipe”导入EditRecipe;
类RecipeItem扩展组件{
删除配方(id){
this.props.onDelete(id);
}
编辑配方(id,配方){
this.props.onEdit(id,recipe);
}
render(){
让配方=this.props.recipe
让foodName=配方食品;
让我们来讨论这个问题;
if(配方、配料){
IngreditItem=配方.配料.映射(配料=>{
返回(
{成分}
)
})
}
返回(
-
成分
{IngreditItem}
删除
);
}
}
导出默认RecipeItem;
EditRecipe.js
import React, { Component } from 'react';
import RecipeForm from '../RecipeForm/RecipeForm';
// import './EditRecipe.css';
import Modal from 'react-modal';
import uuid from 'uuid';
// import Modal from 'boron/DropModal';
// import './RecipeList.css';
class RecipeEdit extends Component{
constructor(props){
super(props);
this.state = {
revisedRecipe:{
id: this.props.recipe.id,
food: this.props.recipe.food,
ingredients: this.props.recipe.ingredients
},
modalIsOpen: false,
speed: 100
};
this.openModal = this.openModal.bind(this);
this.closeModal = this.closeModal.bind(this);
}
openModal(){
this.setState({modalIsOpen: true});
}
closeModal(){
this.setState({modalIsOpen: false});
}
handleSubmit(e){
const revised = this.state.revisedRecipe;
this.props.editRecipe(revised);
e.preventDefault();
}
handleNameChange(e){
this.setState({revisedRecipe:{
food: e.target.value
}
});
}
handleIndChange(e){
this.setState({revisedRecipe:{
ingredients: e.target.value
}
});
}
render(){
const speed = this.state.speed;
let recipe=this.props.recipe;
let foodName=this.state.revisedRecipe.food;
let ingredients=recipe.ingredients;
return(
<div>
<button className="button is-primary" onClick={this.openModal}>Edit Recipe</button>
<Modal
isOpen={this.state.modalIsOpen}
onAfterOpen={this.afterOpenModal}
onRequestClose={this.closeModal}
closeTimeoutMS={speed}
contentLabel="Example Modal"
>
<div className="field">
<h2 className="title is-2">Edit Recipe</h2>
<form>
<label className="label">Recipe</label>
<div className="control">
<input className="input" type="text" placeholder="Recipe Name" ref="recipeName" value={this.state.revisedRecipe.food} onChange={this.handleNameChange.bind(this)}/>
</div>
<div className="field">
<label className="label">Ingredients</label>
<div className="control has-icons-left has-icons-right">
<input className="input" type="text" placeholder="Enter ingredients. (if more than 1 ingredient, separate them with commas)" ref="ingredients" value={this.state.revisedRecipe.ingredients} onChange={this.handleIndChange.bind(this)}/>
<span className="icon is-small is-left">
<i className="fa fa-flask"></i>
</span>
</div>
</div>
<div className="field is-grouped">
<div className="control">
<button className="button is-primary" onClick={this.closeModal}>Edit Recipe</button>
</div>
<div className="control">
<button className="button" onClick={this.closeModal}>Cancel</button>
</div>
</div>
</form>
</div>
</Modal>
</div>
);
}
}
export default RecipeEdit;
import React,{Component}来自'React';
从“../RecipeForm/RecipeForm”导入RecipeForm;
//导入“/EditRecipe.css”;
从“反应模态”导入模态;
从“uuid”导入uuid;
//从“硼/滴落模式”导入模式;
//导入“/RecipeList.css”;
类RecipeEdit扩展组件{
建造师(道具){
超级(道具);
此.state={
修订配方:{
id:this.props.recipe.id,
食物:这个。道具。食谱。食物,
配料:这个。道具。配方。配料
},
modalIsOpen:false,
速度:100
};
this.openModal=this.openModal.bind(this);
this.closeModal=this.closeModal.bind(this);
}
openModal(){
this.setState({modalIsOpen:true});
}
closeModal(){
this.setState({modalIsOpen:false});
}
handleSubmit(e){
const revised=this.state.revisedRecipe;
此.props.editRecipe(修订版);
e、 预防默认值();
}
手形变化(e){
此.setState({ReviedRecipe:{
食物:即目标价值
}
});
}
handleIndChange(e){
此.setState({ReviedRecipe:{
成分:e.目标价值
}
});
}
render(){
const speed=this.state.speed;
让配方=this.props.recipe;
让foodName=this.state.revisedRecipe.food;
让配料=配方配料;
返回(
编辑配方
编辑配方
配方
成分
编辑配方
取消
);
}
}
导出默认的RecipeEdit;
我相信,在更新列表后尝试重新渲染时,实际上会出现错误。配方中的配料属性是一个数组(如getRecipes()
所示),但您正在设置配料的新状态
this.setState({revisedRecipe: {ingredients: e.target.value.split(',')}});
const recipe = this.state.revisedRecipe;
recipe.ingredients = e.target.value.split(',');
this.setState({revisedRecipe: recipe);