我发现当更改数组中的元素时, React 不会更新组件。相反,必须克隆一个新数组并放在其位置。
例如,我有一个_suggestedPeople
数组。当点击代表其中一个人的UI元素时,我想通过调用selectPerson
来注册它。
我希望React在执行此操作后更新:
selectPerson: function(personID, selected) {
var person = _.find(_suggestedPeople, {id: personID});
if (person) {
person.selected = selected;
}
return person;
},
但是,我最终会这样做,这似乎是不必要的:
selectPerson: function(personID, selected) {
var index = _.findIndex(_suggestedPeople, {id: personID});
var found = index !== -1;
if (found) {
var people = _.cloneDeep(_suggestedPeople);
people[index].selected = selected;
_suggestedPeople = people;
}
return found;
},
这是后者更新React组件的数组数据的正确方法吗?或者我错过了什么?
答案 0 :(得分:0)
您似乎没有使用React的内置状态管理。如果你这样做,你的两种更新状态方法之间的中间地位将起作用。当组件的状态或属性发生变化时,组件将重新呈现。
编辑:此代码已过时,不是很好的做法。请参阅下面更新的jsfiddle
通过实施
初始化组件状态getInitialState: function () {
var whereverItComesFrom = [
{id: 1, selected: false},
{id: 2, selected: false}
];
return {
suggestedPeople: whereverItComesFrom
}
}
你的渲染方法由此呈现:
render: function () {
var _this = this;
var peeps = this.state.suggestedPeople.map(function(person, index){
return <label key={index}><input type='checkbox' checked={person.selected} value={person.id} onChange={_this.handlePersonClick}/>{person.id}</label>;
});
return <div>{peeps}</div>;
},
handlePersonClick可以是您的方法的合并:
handlePersonClick: function(e) {
var selectedId = e.target.value;
var checked = e.target.checked;
var peeps = this.state.suggestedPeople;
var index = _.findIndex(peeps, {id: selectedId});
peeps[index].selected = checked;
this.setState({suggestedPeople: peeps});
}
编辑:上面对我的反应非常不明智。我已经更新了下面的小提琴链接,它应该是解决这个问题的一个很好的基本例子。
完整jsfiddle