[英]Adding items to an array in javascript
承認它。 在2018年成為JavaScript新手很難。 來自C#,Java和Typescript(是js的子集......)這樣的語言,其中類型安全是關鍵,Javascript只是讓我知道。 我喜歡更新數組這樣簡單的事情。
所以我有這個React
組件,其狀態定義如下:
class Form extends React.Component {
constructor(props) {
super(props);
this.state = {
show: false,
shoes: []
};
}
....
...
}
這是一個未定義的數組(?)
此數組傳遞給無狀態組件,如下所示
const Shoelist = props => {
return (
<Wrapper>
{props.shoes.map((shoe, i) => (
<div key={i}>
<Shoe shoe={shoe} />
<Separator />
</div>
))}
</Wrapper>
);
};
我在我的Form
組件中,我有一個方法應該對onClick
方法做出反應(doh)。 在這個方法中,我得到一個參數,在這個列表中添加一個新鞋。 這是我在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.
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
};
你可以這樣做:
this.setState({
shoes: [...this.state.shoes, newShoe]
})
...
添加this.state.shoes
所有元素
通過您的更新,我們可以看到問題是addShoe
回調傳遞的方式。 它被作為函數而不是對象的方法調用,因此它會丟失上下文。
將其更改為:
<ShoeModal onClose={this.addShoe.bind(this)} />
要么
<ShoeModal onClose={shoe => this.addShoe(shoe)} />
另外, .push
返回數組的計數,因此以下行不會給出您期望的內容:
const list = state.shoes.push(shoe);
請參閱@ merko的答案以獲得解決方案。
首先,你的addShoe
方法不是箭頭函數。 使用箭頭函數,因為this
是組件的上下文。
其次,您將返回對象{list}
。 這將變量list
設置為state。 同時推送到新list
變量而不是變異狀態。 將您的功能更改為
addShoe = (shoe) => {
this.setState(state => {
let list = state.shoes;
list.push(shoe);
return {
shoes : list
};
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.