<List>
vous permet de restituer efficacement une grande liste d'éléments.
Le <List>
peut rendre les éléments de deux manières : sous la forme d'un éventail d'éléments <ListItem>
ou sous la forme d'un rappel de rendu (fonction en tant qu'enfants). Il est recommandé d'utiliser le rappel de rendu car il virtualisera tous les éléments, ce qui le rend très rapide lorsqu'un grand nombre d'éléments est fourni.
Si la largeur et la hauteur ne sont pas spécifiées via les accessoires style
ou className
, elles rempliront la hauteur et la largeur du conteneur, à moins que width="fit-content"
ne soit fourni comme accessoire. Ensuite, il dimensionnera le conteneur <List>
pour qu'il soit aussi large que le composant <ListItem>
mesuré le plus large.
Usage
import { List } from 'nr1'
Exemples
Basique
function render() { return ( <List rowHeight={20}> <ListItem>Item 1</ListItem> <ListItem>Item 2</ListItem> <ListItem>Item 3</ListItem> <ListItem>Item 4</ListItem> </List> );}
Rendre rappel
function render() { const items = new Array(10000).fill().map((_, i) => { return { key: `foo-${i}`, name: `Item ${i}` }; });
const style = { width: 200, height: 300 };
return ( <List style={style} rowHeight={20} items={items}> {({ item }) => <ListItem key={item.key}>{item.name}</ListItem>} </List> );}
Chargement paresseux
function render() { // This example assumes you have a way to know/load this information. const remoteTotalNumberOfItems = 9000;
const items = [ { id: 1, text: 'Item 1' }, { id: 2, text: 'Item 2' }, { id: 3, text: 'Item 3' }, { id: 4, text: 'Item 4' }, ];
function loadMoreItems({ startIndex, stopIndex }) { return fetch(`path/to/api?start=${startIndex}&stop=${stopIndex}`).then( () => { // Store items in list... }, ); }
const style = { width: 200, height: 300 };
return ( <div style={style}> <List items={items} rowCount={remoteTotalNumberOfItems} onLoadMore={loadMoreItems} > {({ item }) => <ListItem key={item.id}>{item.text}</ListItem>} </List> </div> );}
Dimensionnement automatique en fonction de la largeur du contenu
class AutoSizingList extends React.Component { constructor() { super(...arguments); this.state = { items: this._generateItems(0), }; this._maxItems = 1000; this._onLoadMore = this._onLoadMore.bind(this); }
_onLoadMore(cursor) { return ( Promise.resolve() // Fetch more items to load into <List> .then(() => this._generateItems(this.state.items.length)) .then((moreItems) => // Add retrieved items to the stored list this.setState(({ items }) => ({ items: items.concat(moreItems) })), ) ); }
_generateString(num, extra = 0) { return `Entity ${num.toString(10)}: 1${'00'.repeat( Math.floor(Math.random() * 10) + 1 + extra, )} bytes`; }
_generateItems(start) { return new Array(200).fill().map((_, i) => ({ key: `foo-${start + i}`, name: this._generateString(start + i, start / 100), })); }
render() { const style = { 'height': 300, 'background-color': 'white' }; const parentStyle = { width: 260 };
return ( <div style={parentStyle}> <List rowCount={this._maxItems} onLoadMore={this._onLoadMore} style={{ ...style }} rowHeight={20} items={this.state.items} width="fit-content" > {({ item }) => <ListItem key={item.key}>{item.name}</ListItem>} </List> </div> ); }}
Intégration avec les composants de requête
function render() { const style = { width: 200, height: 300 };
const list = ( <div style={style}> <EntitiesByDomainTypeQuery entityDomain="APM" entityType="APPLICATION"> {({ fetchMore, loading, data }) => { const { results, count } = data.actor.entitySearch;
return ( <List rowHeight={40} items={results.entities} onLoadMore={fetchMore} rowCount={count} > {({ item }) => <ListItem key={item.id}>{item.text}</ListItem>} </List> ); }} </EntitiesByDomainTypeQuery> </div> );}
Accessoires
OBLIGATOIRENœud|fonction | Il peut s'agir soit d'un éventail d'éléments |
chaîne | Nom de classe pour le style personnalisé. |
booléen | Étend la stack pour occuper toute la hauteur disponible. |
booléen | Étend la stack pour occuper toute la largeur disponible. |
n'importe lequel[] | Les éléments à utiliser lors du rendu. Ils sont requis lors du rendu d'éléments avec un rappel de rendu. Chaque élément peut avoir n'importe quelle structure et n'importe quel type possible, et celui correspondant sera fourni lors du rendu de chaque liste d'éléments.
|
fonction | Rappel déclenché lorsque davantage d'éléments doivent être chargés. Cela se produit lorsque vous chargez les éléments de manière paresseuse et que les éléments sur le point d'être rendus ne peuvent pas être trouvés dans l'éventail function ( |
nombre | Nombre de lignes. Par défaut, il est égal à la longueur de l'éventail passé dans la propriété items. Vous devez spécifier |
OBLIGATOIREnombre | Hauteur de la ligne de la liste. Obligatoire lors du rendu des éléments avec le rappel de rendu (Fonction en tant qu'enfants). Il s'agit d'une hauteur provisoire jusqu'à ce que le contenu de la cellule soit mesuré en le rendant temporairement d'une manière qui n'est pas visible pour l'utilisateur. |
énumération[] | Propriété d'espacement. L'espacement est défini comme un uplet de zéro à quatre valeurs, qui suivent les mêmes conventions que les propriétés CSS comme <Array of |
objet | Style en ligne pour un style personnalisé. |
chaîne | Ajoute un attribut Remarque : vous ne verrez peut-être pas l'attribut |
chaîne | Représente la largeur de la liste. Il s'agit toujours d'une chaîne et elle peut être de l'un des types suivants :
|
Définitions de types
RenderCallbackArguments
{item: any, Item to render.
index: number, Index of the item in the items array.
items: any[], Array of items which we're iterating on.
}
Cursor
{startIndex: number, First index of the range of items to load.
stopIndex: number, Last index of the range of items to load.
}