接受。在2018年成为JavaScript新手很难。来自诸如C#,Java和Typescript(是js..yeah子集)之类的语言,其中类型安全性是关键,Java语言只是使我烦恼不已。我在尝试一些简单的事情,例如更新数组。
所以我有这个React
组件,其状态定义如下:
class Form extends React.Component {
constructor(props) {
super(props);
this.state = {
show: false,
shoes: []
};
}
....
...
}
鞋子是undefined(?)的数组
此数组传递给一个看起来像这样的无状态组件
const Shoelist = props => {
return (
<Wrapper>
{props.shoes.map((shoe, i) => (
<div key={i}>
<Shoe shoe={shoe} />
<Separator />
</div>
))}
</Wrapper>
);
};
我在Form
组件中,有一个方法应该对onClick
方法做出反应。在这种方法中,我得到了一个带有新鞋子的参数以添加到此列表中。这对我来说,在javascript中停止了一切-在过去几年中使用的所有其他语言中,这都很容易实现。
我尝试了几种方法:
1#
addShoe(shoe) {
this.setState(state => {
const list = state.shoes.push(shoe);
return {
list
};
});
}
这将导致错误:Uncaught TypeError: Cannot read property 'push' of undefined
是否需要将鞋子定义为Array
?我认为[]
足够
2#
我用谷歌搜索,我做了很多。我发现一篇博客文章中谈到了react-addons-update
。我通过运行yarn add
安装了此代码,代码如下:
addShoe(shoe) {
this.setState(update(this.state, { shoes: { $push: [shoe] } }));
}
这将导致Uncaught Error: update(): expected target of $push to be an array; got undefined.
帮助!这有多难?
编辑
我将此方法传递给另一个这样的组件:
<ShoeModal onClose={this.addShoe} />
在ShoeModal组件中,它绑定到onClick方法:
<FinishModalButton
onClick={this.props.onClose.bind(this, this.state.shoe)}>
....
</FinishModalButton>
ShoeModal.propTypes = {
onClose: PropTypes.func.isRequired
};
答案 0 :(得分:2)
您可以这样做:
this.setState({
shoes: [...this.state.shoes, newShoe]
})
...
添加来自this.state.shoes
答案 1 :(得分:1)
通过您的更新,我们可以看到问题是通过addShoe
回调传递的。它是作为函数而不是对象的方法调用的,因此会丢失上下文。
将其更改为:
<ShoeModal onClose={this.addShoe.bind(this)} />
或
<ShoeModal onClose={shoe => this.addShoe(shoe)} />
此外,.push
返回数组的计数,因此以下行不会给您期望的结果:
const list = state.shoes.push(shoe);
请参阅@merko的答案以获取解决方案。
答案 2 :(得分:0)
首先,您的addShoe
方法不是箭头函数。
使用箭头函数是因为上下文this
是组件的上下文。
第二,您将返回对象{list}
。这会将变量list
设置为状态。
另外,请推送至新的list
变量,而不要更改状态。
将功能更改为
addShoe = (shoe) => {
this.setState(state => {
let list = state.shoes;
list.push(shoe);
return {
shoes : list
};
});
}