Choisir un utilitaire

L'utilitaire pick simplifie le travail avec les états des objets en permettant de lire des valeurs de propriétés approfondies tout en conservant la réactivité des états.

Pourquoi utiliser l'utilitaire pick ?

Examinons un état d'objet utilisateur simple.

javascript
const [currentUser] = state(null)

Le modèle de données utilisateur ressemble à ceci :

typescript
interface User {
    name: string
    emails: string[]
    skils: {
        name: string
        yearsOfExperience: number
    }[]
    type: 'Admin' | 'User' | 'Partner'
    jobs: {
        name: string
        startingDate: Date
        endDate?: Date
        company: {
            name: string
            website: string
            logo: string
        }
    }[]
}

Nous pouvons maintenant essayer d'afficher ces informations utilisateur définies dans l'état.

javascript
html`
    <h3>${currentUser().name}</h3>
    <p>email: ${currentUser().email}</h3>
    <h4>Skills:</h4>
    <ul>${repeat(currentUser().skills, renderSkil)}</ul>
    <h4>Jobs:</h4>
    <ul>${repeat(currentUser().jobs, renderJob)}</ul>
`.render(document.body)

Cela affiche tout parfaitement. Cependant, s'il s'agit d'un objet qui change, rien ne sera restitué car tout a été rendu de manière statique. La solution simple consiste à tout restituer dynamiquement à l’aide de fonctions.

javascript
html`
    <h3>${() => currentUser().name}</h3>
    <p>email: ${() => currentUser().email}</h3>
    <h4>Skills:</h4>
    <ul>${repeat(() => currentUser().skills, renderSkil)}</ul>
    <h4>Jobs:</h4>
    <ul>${repeat(() => currentUser().jobs, renderJob)}</ul>
`.render(document.body)

Vous pouvez également utiliser pick pour sélectionner les propriétés que vous souhaitez restituer à partir d'un état.

javascript
html`
    <h3>${pick(currentUser, 'name')}</h3>
    <p>email: ${pick(currentUser, 'email')}</h3>
    <h4>Skills:</h4>
    <ul>${repeat(pick(currentUser, 'skills'), renderSkil)}</ul>
    <h4>Jobs:</h4>
    <ul>${repeat(pick(currentUser, 'jobs'), renderJob)}</ul>
`.render(document.body)

L'utilitaire pick n'est qu'une fonction et peut également être utilisé en dehors des modèles.

javascript
console.log(pick(currentUser, 'jobs')())

Des valeurs profondes

La meilleure partie de l’utilisation de pick est sa capacité à vous permettre de sélectionner des valeurs approfondies. Par exemple, accédons au site Web de notre troisième entreprise d'emploi actuelle.

javascript
html`${pick(currentUser, 'jobs.2.company.website')}`

Comme vous pouvez le voir, vous pouvez utiliser la notation par points pour accéder en profondeur aux propriétés et tout sera restitué lorsque ces valeurs changeront.

Valeurs non définies

L'utilitaire pick offre également une protection contre les valeurs non définies en empêchant les erreurs de générer des erreurs lors de la tentative de lecture d'une propriété qui n'existe pas.

L'assistant pick détectera l'erreur et renvoie simplement undefined qui peut être rendu ou lu par votre code.

javascript
html`${pick(currentUser, 'jobs.2.company.url')}`.render(document.body)
// renders "undefined"

Fonction mappeur

L'utilitaire pick accepte un troisième argument facultatif : une fonction de mappage qui transforme la valeur sélectionnée avant de la renvoyer.

javascript
html`
    <h3>${pick(currentUser, 'name', (name) => name.toUpperCase())}</h3>
    <p>
        Member since:
        ${pick(currentUser, 'jobs.0.startingDate', (date) =>
            date.toLocaleDateString()
        )}
    </p>
`.render(document.body)

Ceci est utile pour formater des valeurs, convertir des types ou appliquer une transformation à la valeur sélectionnée avant qu'elle ne soit rendue ou utilisée.

modifier ce document