Je rend un tableau avec un design de fourmi et cela fonctionne bien, mais il y a un avertissement dans la console:
Chaque enregistrement de la table doit avoir une propriété
key
unique ou définirrowKey
sur une clé primaire unique
Mon code est le suivant:
import React, { Component } from 'react';
import { Table} from 'antd';
import { adalApiFetch } from '../../adalConfig';
class ListTenants extends Component {
constructor(props) {
super(props);
this.state = {
data: []
};
}
fetchData = () => {
adalApiFetch(fetch, "/Tenant", {})
.then(response => response.json())
.then(responseJson => {
if (!this.isCancelled) {
const results= responseJson.map(row => ({
ClientId: row.ClientId,
ClientSecret: row.ClientSecret,
Id: row.Id,
SiteCollectionTestUrl: row.SiteCollectionTestUrl,
TenantDomainUrl: row.TenantDomainUrl
}))
this.setState({ data: results });
}
})
.catch(error => {
console.error(error);
});
};
componentDidMount(){
this.fetchData();
}
render() {
const columns = [
{
title: 'Client Id',
dataIndex: 'ClientId',
key: 'ClientId'
},
{
title: 'Site Collection TestUrl',
dataIndex: 'SiteCollectionTestUrl',
key: 'SiteCollectionTestUrl',
},
{
title: 'Tenant DomainUrl',
dataIndex: 'TenantDomainUrl',
key: 'TenantDomainUrl',
}
];
return (
<Table columns={columns} dataSource={this.state.data} />
);
}
}
export default ListTenants;
React rend les listes à l'aide de l'accessoire clé. Cela fonctionne ainsi car react vous permet de réduire la complexité des algorithmes différents et de réduire le nombre de mutations DOM. Vous pouvez en lire un peu plus dans React Réconciliation Docs: https://reactjs.org/docs/reconciliation.html
Dans votre cas, vous avez ajouté les clés aux colonnes, mais pas aux lignes. Ajoutez le champ clé à la source de données. Votre code pourrait donc être le suivant:
import React, { Component } from 'react';
import { Table} from 'antd';
import { adalApiFetch } from '../../adalConfig';
class ListTenants extends Component {
constructor(props) {
super(props);
this.state = {
data: []
};
}
fetchData = () => {
adalApiFetch(fetch, "/Tenant", {})
.then(response => response.json())
.then(responseJson => {
if (!this.isCancelled) {
const results= responseJson.map(row => ({
key: row.id, // I added this line
ClientId: row.ClientId,
ClientSecret: row.ClientSecret,
Id: row.Id,
SiteCollectionTestUrl: row.SiteCollectionTestUrl,
TenantDomainUrl: row.TenantDomainUrl
}))
this.setState({ data: results });
}
})
.catch(error => {
console.error(error);
});
};
componentDidMount(){
this.fetchData();
}
render() {
const columns = [
{
title: 'Client Id',
dataIndex: 'ClientId',
key: 'ClientId'
},
{
title: 'Site Collection TestUrl',
dataIndex: 'SiteCollectionTestUrl',
key: 'SiteCollectionTestUrl',
},
{
title: 'Tenant DomainUrl',
dataIndex: 'TenantDomainUrl',
key: 'TenantDomainUrl',
}
];
return (
<Table columns={columns} dataSource={this.state.data} />
);
}
}
export default ListTenants;
Ajoutez simplement une valeur de clé unique dans le lien de balise:
<Table
columns={columns}
dataSource={this.state.data}
rowKey="Id" /> // unique key
J'espère que cette aide
Étant donné que vous n'ajoutez pas de clé au tableau dataSource, ajoutez-y également une clé.
Comme ça:
const results= responseJson.map(row => ({
key: row.ClientId, // here
ClientId: row.ClientId,
ClientSecret: row.ClientSecret,
Id: row.Id,
SiteCollectionTestUrl: row.SiteCollectionTestUrl,
TenantDomainUrl: row.TenantDomainUrl
}))
Ou vous pouvez utiliser n'importe quelle valeur unique du tableau dataSource comme clé en utilisant la propriété rowKey
, comme ceci:
<Table
columns={columns}
dataSource={this.state.data}
rowKey="Id" /> // any unique value