我的組件顯示與姓名/姓氏的/ etc中的對象陣營的setState混淆對象
getInitialState: function() {
return ({
contact: {},
edit: false,
editedContact: {}
});
},
舉行,讓AJAX調用後一接觸,我的信息存儲在state.contact和editedcontact
success: function (payload) {
that.setState({ contact: payload.result, editedContact: payload.result});
}
我有一個toggleEdit功能來決定什麼,我會渲染 - 無論是聯繫人視圖或輸入編輯的聯繫人
toggleEdit: function() {
this.setState({
edit: true,
});
},
render: function() {
if(!this.state.edit){
var output = (
<div>
<div className="panel panel-default">
<div className="panel-heading">{this.state.contact.firstName</div>
...
</div>
);
} else {
output = (
<span className="cancel" onClick={this.cancelEdit}>Cancel</span>
<form onSubmit={this.handleSubmit}>
<input className="form-control" id="first-name" type="text" onChange={this.handleChange.bind(this, "firstName")} value={this.state.editedContact.firstName}/>
...
個
形式的值已經與我的editedContact,方便的用戶體驗和的onChange同步增長,他們更新了editedContact
handleChange: function (paremeter, e) {
console.log(this.state.contact.lastName);
console.log(this.state.editedContact.lastName);
var editedContact = this.state.editedContact;
editedContact[paremeter] = e.target.value;
this.setState({editedContact: editedContact});
}
我的CancelEdit改變編輯的狀態恢復到真正能再次見到了接觸,但我不明白爲什麼我仍然看到在這個視圖中對editContact所做的更改。我的handleChange只更新editedContact狀態,而不是聯繫狀態,爲什麼我通過控制檯日誌看到對聯繫狀態的更改?
哇!驚人!!謝謝!我使用了你的第二個建議,這基本上和第一個建立payload.result的副本一樣嗎? – akantoword
是的,它將第二個到「n」個對象的所有值「分配」給第一個對象。所以它改變了第一個參數,在我們的例子中是一個空的新對象。第一個做同樣的事情,但它是一個尚未發佈的JavaScript 2016功能(您需要使用Babel進行傳輸,預設爲stage-0) – ZekeDroid
這只是「語法糖」,可以使代碼更加精簡和更多簡潔 – ZekeDroid