"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Explication du scénario de test createWithEqualityFn dans Zustand.

Explication du scénario de test createWithEqualityFn dans Zustand.

Publié le 2024-10-31
Parcourir:389

Dans cet article, nous comprendrons le scénario de test écrit pour valider le createWithEqualityFn qui empêche le nouveau rendu en fonction d'une condition et d'une fonction d'égalité que vous pouvez transmettre.

Le code ci-dessous est extrait de basic.test.ts

it('uses the store with a selector and equality checker', async () => {
  const useBoundStore = createWithEqualityFn(
    () => ({ item: { value: 0 } }),
    Object.is,
  )
  const { setState } = useBoundStore
  let renderCount = 0

  function Component() {
    // Prevent re-render if new value === 1.
    const item = useBoundStore(
      (s) => s.item,
      (_, newItem) => newItem.value === 1,
    )
    return (
      
renderCount: { renderCount}, value: {item.value}
) } const { findByText } = render( >, ) await findByText('renderCount: 1, value: 0') // This will not cause a re-render. act(() => setState({ item: { value: 1 } })) await findByText('renderCount: 1, value: 0') // This will cause a re-render. act(() => setState({ item: { value: 2 } })) await findByText('renderCount: 2, value: 2') })

Zustand utilise Vitest pour ses besoins de tests. Passons en revue l'extrait de code ci-dessus.

Initialiser createWithEqualityFn

const useBoundStore = createWithEqualityFn(
    () => ({ item: { value: 0 } }),
    Object.is,
  )

createWithEqualityFn est initialisé avec l'état () => ({ item: { value: 0 } }) et la fonction d'égalité est Object.is

createWithEqualityFn test case in Zustand explained.

createWithEqualityFn accepte deux variables, createState et defaultEqualityFn.

Empêcher le nouveau rendu

// Prevent re-render if new value === 1.
    const item = useBoundStore(
      (s) => s.item,
      (_, newItem) => newItem.value === 1,
    )

useBoundStore accepte le sélecteur et la fonction d'égalité utilisée pour empêcher le nouveau rendu en fonction de la valeur correspondante.

L'exemple ci-dessus dans basic.test est utilisé pour empêcher le nouveau rendu lorsque la valeur est 1.

await findByText('renderCount: 1, value: 0')

// This will not cause a re-render.
act(() => setState({ item: { value: 1 } }))
await findByText('renderCount: 1, value: 0')

// This will cause a re-render.
act(() => setState({ item: { value: 2 } }))
await findByText('renderCount: 2, value: 2')

Ces assertions confirment que la mise à jour de l'état ne provoque aucun nouveau rendu.

À propos de nous:

Chez Think Throo, nous avons pour mission d'enseigner les meilleures pratiques inspirées des projets open source.

10x vos compétences en codage en pratiquant des concepts architecturaux avancés dans Next.js/React, apprenez les meilleures pratiques et créez des projets de niveau production.

Nous sommes open source — https://github.com/thinkthroo/thinkthroo (Donnez-nous une étoile !)

Développez les compétences de votre équipe avec nos cours avancés basés sur l'architecture de base de code. Contactez-nous à [email protected] pour en savoir plus !

Références :

  1. https://github.com/pmndrs/zustand/blob/main/tests/basic.test.tsx#L92

  2. https://vitest.dev/guide/

Déclaration de sortie Cet article est reproduit sur : https://dev.to/thinkthroo/createwithequalityfn-test-case-in-zustand-explained-3lhl?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3