如何使用 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使用了一个对象。但是,概念是相同的。您可以看到终端/控制台中发生了什么: