Maison >interface Web >js tutoriel >Explication du scénario de test createWithEqualityFn dans Zustand.
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.
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 accepte deux variables, createState et defaultEqualityFn.
// 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.
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 !
https://github.com/pmndrs/zustand/blob/main/tests/basic.test.tsx#L92
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!