Maison  >  Article  >  interface Web  >  Explication du scénario de test createWithEqualityFn dans Zustand.

Explication du scénario de test createWithEqualityFn dans Zustand.

DDD
DDDoriginal
2024-09-14 06:26:02460parcourir

Dans cet article, nous comprendrons le cas 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 (
      <div>
        renderCount: {++renderCount}, value: {item.value}
      </div>
    )
  }

  const { findByText } = render(
    <>
      <Component />
    </>,
  )

  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é qui sont utilisés 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 construisez 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 à hello@thinkthroo.com 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/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:L'anatomie d'une page HTMLArticle suivant:L'anatomie d'une page HTML