如何使用 setState 更新狀態中的 state.item?
P粉464208937
2023-08-23 17:35:11
<p>我正在創建一個應用程序,用戶可以在其中設計自己的表單。例如。指定欄位的名稱以及應包含的其他欄位的詳細資訊。 </p>
<p>該組件可作為 JSFiddle 使用。 </p>
<p>我的初始狀態如下所示:</p>
<pre class="brush:php;toolbar:false;">var DynamicForm = React.createClass({
getInitialState: function() {
var items = {};
items[1] = { name: 'field 1', populate_at: 'web_start',
same_as: 'customer_name',
autocomplete_from: 'customer_name', title: '' };
items[2] = { name: 'field 2', populate_at: 'web_end',
same_as: 'user_name',
autocomplete_from: 'user_name', title: '' };
return { items };
},
render: function() {
var _this = this;
return (
<div>
{ Object.keys(this.state.items).map(function (key) {
var item = _this.state.items[key];
return (
<div>
<PopulateAtCheckboxes this={this}
checked={item.populate_at} id={key}
populate_at={data.populate_at} />
</div>
);
}, this)}
<button onClick={this.newFieldEntry}>Create a new field</button>
<button onClick={this.saveAndContinue}>Save and Continue</button>
</div>
);
}</pre>
<p>我想在使用者更改任何值時更新狀態,但我很難定位正確的物件:</p>
<pre class="brush:php;toolbar:false;">var PopulateAtCheckboxes = React.createClass({
handleChange: function (e) {
item = this.state.items[1];
item.name = 'newName';
items[1] = item;
this.setState({items: items});
},
render: function() {
var populateAtCheckbox = this.props.populate_at.map(function(value) {
return (
<label for={value}>
<input type="radio" name={'populate_at' this.props.id} value={value}
onChange={this.handleChange} checked={this.props.checked == value}
ref="populate-at"/>
{value}
</label>
);
}, this);
return (
<div className="populate-at-checkboxes">
{populateAtCheckbox}
</div>
);
}
});</pre>
<p>我應該如何製作<code>this.setState</code>以使其更新<code>items[1].name</code>? </p>
您可以使用
更新
不變性助手來實現此目的: p>或者,如果您不關心是否能夠使用
===
在shouldComponentUpdate()
生命週期方法中檢測此項目的更改,則可以編輯狀態直接並強制元件重新渲染- 這實際上與@limelights 的答案相同,因為它將物件拉出狀態並對其進行編輯。後期編輯新增:
#查看簡單元件通訊 react-training 中的課程,了解如何將回呼函數從持有狀態的父元件傳遞到子元件的範例需要觸發狀態變更。
以下是在沒有輔助函式庫的情況下如何做到這一點:
如果需要,您可以合併步驟 2 和 3:
或你可以在一行中完成整個事情:
注意:我將
items
建立為一個陣列。 OP使用了一個物件。但是,概念是相同的。您可以看到終端機/控制台中發生了什麼: