如何使用 reactjs 将多个项目添加到数组
How to add multiple items to array with reactjs
我有两个 类。一个拿着阵列,另一个拿着阵列道具。这些是我的 类:
//PARENT CLASS:
constructor() {
super()
this.state = {
items: []
}
this.addItem = this.addItem.bind(this)
}
componentDidMount(){
this.setState({
items: [{
name: 'Sebastian',
num: '001'
},{
name: 'Josh',
num: '002'
}]
})
}
addItem() {
??????
}
render() {
return(
<div>
<MethodA items={this.state.items} addItem={this.addItem}/>
</div>
)
}
//CHILD CLASS:
function MethodA(props) {
return(
<div>
{props.items.map((item, i) =>{
return(<div key={i}>
<span>{item.name}</span>
<span>{item.num}</span>
</div>)
})}
<button onClick={() => { props.addItem() }}>ADD ITEM</button>
</div>
)
}
目前的结果是这样的:
<div>
<span>Sebastian</span>
<span>001</span>
</div>
<div>
<span>Sebastian</span>
<span>002</span>
</div>
然后在点击 "ADD ITEM" 按钮后,这将是新的结果:
<div>
<span>Sebastian</span>
<span>001</span>
</div>
<div>
<span>Sebastian</span>
<span>002</span>
</div>
<div>
<span>New Name</span>
<span>New Num</span>
</div>
我不确定在 push() 或 concat() 或两者之间使用什么以及如何使用。有什么想法吗?
这是交易。 push() 和 concat() 之间的区别在于不变性。
如果对数组使用 push,它会改变原始数组并向该数组添加一个新值(错误)。
如果你使用 concat,它会为你创建一个新数组,保持旧数组不变(正确)。
所以你可能想按照这些思路做一些事情:
addItem(item)
this.setState(state => {
const items = state.items.concat(item);
return {
items,
};
});
}
首先,componentDidMount
中不需要设置初始状态,直接在constructor中设置即可。
constructor(props) {
super(props);
this.state = {
items: [
{
name: "Sebastian",
num: "001"
},
{
name: "Josh",
num: "002"
}
]
};
this.addItem = this.addItem.bind(this);
}
要添加项目,您可以使用 setState
的函数形式,您需要将该项目传递到子组件的回调中。
addItem(item) {
this.setState(state => ({
items: [...state.items, item]
}));
}
// Child class
function MethodA(props) {
return(
<div>
{props.items.map((item, i) =>{
return(<div key={i}>
<span>{item.name}</span>
<span>{item.num}</span>
</div>)
})}
<button onClick={() => props.addItem(item)}>ADD ITEM</button> // Pass item to the parent's method
</div>
)
}
我有两个 类。一个拿着阵列,另一个拿着阵列道具。这些是我的 类:
//PARENT CLASS:
constructor() {
super()
this.state = {
items: []
}
this.addItem = this.addItem.bind(this)
}
componentDidMount(){
this.setState({
items: [{
name: 'Sebastian',
num: '001'
},{
name: 'Josh',
num: '002'
}]
})
}
addItem() {
??????
}
render() {
return(
<div>
<MethodA items={this.state.items} addItem={this.addItem}/>
</div>
)
}
//CHILD CLASS:
function MethodA(props) {
return(
<div>
{props.items.map((item, i) =>{
return(<div key={i}>
<span>{item.name}</span>
<span>{item.num}</span>
</div>)
})}
<button onClick={() => { props.addItem() }}>ADD ITEM</button>
</div>
)
}
目前的结果是这样的:
<div>
<span>Sebastian</span>
<span>001</span>
</div>
<div>
<span>Sebastian</span>
<span>002</span>
</div>
然后在点击 "ADD ITEM" 按钮后,这将是新的结果:
<div>
<span>Sebastian</span>
<span>001</span>
</div>
<div>
<span>Sebastian</span>
<span>002</span>
</div>
<div>
<span>New Name</span>
<span>New Num</span>
</div>
我不确定在 push() 或 concat() 或两者之间使用什么以及如何使用。有什么想法吗?
这是交易。 push() 和 concat() 之间的区别在于不变性。
如果对数组使用 push,它会改变原始数组并向该数组添加一个新值(错误)。
如果你使用 concat,它会为你创建一个新数组,保持旧数组不变(正确)。
所以你可能想按照这些思路做一些事情:
addItem(item)
this.setState(state => {
const items = state.items.concat(item);
return {
items,
};
});
}
首先,componentDidMount
中不需要设置初始状态,直接在constructor中设置即可。
constructor(props) {
super(props);
this.state = {
items: [
{
name: "Sebastian",
num: "001"
},
{
name: "Josh",
num: "002"
}
]
};
this.addItem = this.addItem.bind(this);
}
要添加项目,您可以使用 setState
的函数形式,您需要将该项目传递到子组件的回调中。
addItem(item) {
this.setState(state => ({
items: [...state.items, item]
}));
}
// Child class
function MethodA(props) {
return(
<div>
{props.items.map((item, i) =>{
return(<div key={i}>
<span>{item.name}</span>
<span>{item.num}</span>
</div>)
})}
<button onClick={() => props.addItem(item)}>ADD ITEM</button> // Pass item to the parent's method
</div>
)
}