ОБНОВЛЕНИЕ № 1:
mergeLocationData(){
let mergedList = [];
// you either have to setup initial state for conLocations in your reducer to `undefined` or to `null`.
if(this.props.conLocations !== undefined && this.state.configuredList !== null){
const { configuredList } = this.state;
const { conLocations } = this.props;
mergedList = configuredList;
this.props.conLocations.forEach(location => {
const locationAdded = mergedList.find(_location => _location.mruCode === location.mruCode);
if(!locationAdded){
mergedList.push(location)
}
});
}
// instead of setting state, return the mergedList
return mergedList; //[ always an array of elements ]
}
И затем, при методе рендеринга: вместо получения списка из состояния, мы просто вызываем функцию.
<thead>
{
this.mergeLocationData().map((locc,index)=> (
<tr key={index}>
<th>
<b>{locc.mruCode} - {_labels[locc.division]} - {locc.country}</b>
</th>
<th className="text-right">
<img
alt="DeleteIcon"
onClick={()=>{this.removeConfigLocation(index)}}
className="deleteIconStyle"
src="img/delete_large_active.png" />
</th>
</tr>
)
}
</thead>
В коде нет ничего плохого, я полагаю, что он работает правильно, но логика неверна, вы рендерите оба массива в вашем рендере, вы не используете функцию getLocationData
в своих программах. компонент, даже если concat
не решит проблему.
Вы можете сделать следующие шаги, чтобы исправить логику.
- Исправить логику getLocationData
:
mergeLocationData(){
// you either have to setup initial state for conLocations in your reducer to `undefined` or to `null`.
if(this.props.conLocations !== undefined && this.state.configuredList !== null){
const { configuredList } = this.state;
const { conLocations } = this.props;
let mergedList = configuredList;
this.props.conLocations.forEach(location => {
const locationAdded = mergedList.find(_location => _location.mruCode === location.mruCode);
});
this.setState({
mergedList
});
}
}
Используйте функцию в качестве обратного вызова к вашему запросу на выборку, предположительно в componentDidMount
после правильной загрузки данных.
Рендеринг нового Array
из mergedList
, который должен быть в вашем штате к настоящему времени, и не забудьте добавить mergedList: []
в ваше состояние.
По сути, вам нужно заменить две карты, которые отображают элементы местоположения в вашем рендере, на это.
<thead>
{
this.state.mergedList.map((locc,index)=> (
<tr key={index}>
<th>
<b>{locc.mruCode} - {_labels[locc.division]} - {locc.country}</b>
</th>
<th className="text-right">
<img
alt="DeleteIcon"
onClick={()=>{this.removeConfigLocation(index)}}
className="deleteIconStyle"
src="img/delete_large_active.png" />
</th>
</tr>
)
}
</thead>