#javascript #reactjs
Вопрос:
У меня есть массив в состоянии, и на основе поля сортировки я упорядочиваю таблицу по-другому. У меня есть список клиентов, и некоторые из них относятся к типу 1, а некоторые-ко типу 2. Клиенты типа 2 являются подмножеством клиентов типа 1. Поэтому сначала я получаю всех клиентов 1-го типа, а затем для каждого из них я нахожу всех их детей и перечисляю их:
<tbody>
{this.state.clients
.filter(x => x.clientTypeId === 2)
.sort((a,b) => sortByField(a, b,this.state.sortOrder === 1 ? 'name' : "registrationNumber", 0) )
.map(client => (
<React.Fragment>
<tr style...
и в таблице я снова сортирую список клиентов, чтобы найти его дочерних клиентов, упорядочить и отобразить их.
{this.state.clients
.filter(x => x.parentClientId === client.id)
.sort((a,b) => sortByField(a,b,this.state.sortOrder === 1 ? 'name' : "registrationNumber", 0) )
.map(subClient => (
<tr className="tableRow" onClick={() => { this.handleSelection(subClient.id); }} key={client.id}>
Проблема в том, что каждый раз, когда я меняю параметр сортировки, таблица субклиентов удваивается в размере. Кажется, это снова добавляет значения.
Весь метод:
{!this.state.isLoading amp;amp;
<tbody>
{this.state.clients
.filter(x => x.clientTypeId === 2)
.sort((a,b) => sortByField(a, b,this.state.sortOrder === 1 ? 'name' : "registrationNumber", 0) )
.map(client => (
<React.Fragment>
<tr style={mainStyle} className="tableRow" onClick={() => { this.handleSelection(client.id); }} key={client.id}>
<td><strong>{client.name}</strong></td>
...
</tr>
{this.state.clients
.filter(x => x.parentClientId === client.id)
.sort((a,b) => sortByField(a,b,this.state.sortOrder === 1 ? 'name' : "registrationNumber", 0) )
.map(subClient => (
<tr className="tableRow" onClick={() => { this.handleSelection(subClient.id); }} key={client.id}>
<td>amp;nbsp;amp;nbsp;>amp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;{subClient.name}</td>
...
</tr>
))}
</React.Fragment>
))}
</tbody>
}
Я не уверен, почему дочерние объекты каждый раз дублируются. Это похоже на добавление новой сопоставленной версии в таблицу. Что я делаю не так?
Комментарии:
1. Дублируются ли дочерние объекты, если вы удалите
sort
их ?2. Не могли бы вы предоставить
clients
информацию государству?3. Вероятно, это связано с тем, что сортировка изменяет массив на месте.
4. Если я закомментирую первый сорт и оставлю 2 — й сорт-это сработает (дети сортируются правильно и не дублируются). Но если я удалю 2 — й сорт и оставлю первый сорт-он удваивает размер таблицы при каждом рендеринге.
Ответ №1:
Нашел ошибку.
В тегах TR я использовал key={client.id}
и то, и другое.
Следует использовать 2-й цикл subClient.id
.
Исправив это, проблема была решена.