|
|
2
devserkan
6 年前
这是工作版本。
class App extends React.Component {
state = {
items: [ "Pumpkin Pie", "Spaghetti", "Onion Pie" ],
ingredients: [
[ "Pumpkin Puree", "Sweetened Condensed Milk", "Eggs", "Pumpkin Pie Spice", "Pie Crust" ],
[ "Noodles", "Tomatoe", "Sauce", "Meatballs" ],
[ "Onion", "Pie Crust" ],
],
}
render() {
return (
<div className="box">
<Item items={this.state.items} ingredients={this.state.ingredients} />
</div>
);
}
}
const Item = props => (
<div>
<div className="Recipe-Item-Container" key={props.text}>
{props.items.map( ( item, index ) => (
<div className="Recipe-Item" key={item}>
<h3>{item}</h3>
<ul>
{
props.ingredients[ index ].map( ingredient =>
<li key={ingredient}>{ingredient}</li> )
}
</ul>
<div className="buttons-container">
<button className="edit-button" onClick={() => props.edit( item, index )}>Edit</button>
<button className="delete-button" onClick={() => props.delete( item, index )}>Delete</button>
</div>
</div>
) )}
</div>
</div>
);
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
但如果我是你,我会改变我的状态。诸如此类:
class App extends React.Component {
state = {
items: [
{
name: "Pumpkin Pie",
ingredients: [
"Pumpkin Puree",
"Sweetened Condensed Milk",
"Eggs",
"Pumpkin Pie Spice",
"Pie Crust"
]
},
{
name: "Spaghetti",
ingredients: ["Noodles", "Tomatoe", "Sauce", "Meatballs"]
},
{
name: "Onion Pie",
ingredients: ["Onion", "Pie Crust"]
}
]
};
removeItem = item => {
const newItems = this.state.items.filter(el => el.name !== item.name);
this.setState({ items: newItems });
};
editItem = item => alert(`${item.name} will be edited`);
renderItems = () =>
this.state.items.map(item => (
<Item
key={item.name}
item={item}
removeItem={this.removeItem}
editItem={this.editItem}
/>
));
render() {
return <div className="box">{this.renderItems()}</div>;
}
}
const Item = props => {
const { item, removeItem, editItem } = props;
const handleRemove = () => removeItem(item);
const handleEdit = () => editItem(item);
return (
<div>
<div className="Recipe-Item-Container" key={props.text}>
<div className="Recipe-Item">
<h3>{item.name}</h3>
<ul>
{item.ingredients.map(ingredient => (
<li key={ingredient}>{ingredient}</li>
))}
</ul>
<div className="buttons-container">
<button className="edit-button" onClick={handleEdit}>
Edit
</button>
<button className="delete-button" onClick={handleRemove}>
Delete
</button>
</div>
</div>
</div>
</div>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
<脚本src=”https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js“></script>
<脚本src=”https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js“></script>
<div id=“root”></部门>
变化
-
状态形状:我们不是保留两个数组,而是每个项目保留一个对象。这个物体有一个
name
和
ingredients
所有物也许在未来,它可能会有一个独特的
id
? 物体是灵活的。
-
而不是将所有项目传递给
Item
组件中,我们正在映射父组件中的项,并只将一个项传递给
项目
组成部分
-
我们仍然在父级中定义了处理函数。但是,我们并没有直接在按钮的回调函数中使用箭头函数。因此,它们不会在每次渲染中重新创建。此外,我们不必使用索引将项目传递回父级。我们有
item
自立!您可以看到我们如何处理删除功能:使用
.filter
您可以将相同的功能应用于其他功能。
.map
,
滤器
,
Object.assign
或扩展语法都是很好的工具。只是,避免直接改变你的状态。
|