In this article, we will understand the test case written to validate the createWithEqualityFn that prevents re-render based on a condition and an equality function that you can pass.
The below code is picked from 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 uses Vitest for its testing needs. Let’s go through the above code snippet.
const useBoundStore = createWithEqualityFn( () => ({ item: { value: 0 } }), Object.is, )
createWithEqualityFn is initialized with the state () => ({ item: { value: 0 } }) and the equality function is Object.is
createWithEqualityFn accepts two variables, createState and defaultEqualityFn.
// Prevent re-render if new value === 1. const item = useBoundStore( (s) => s.item, (_, newItem) => newItem.value === 1, )
useBoundStore accepts the selector and the equality function that is used to prevent re-render based on the matching value.
The above example in the basic.test is used to prevent re-render when the value is 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')
These assertions validate that state update does not cause any re-render.
At Think Throo, we are on a mission to teach the best practices inspired by open-source projects.
10x your coding skills by practising advanced architectural concepts in Next.js/React, learn the best practices and build production-grade projects.
We are open source — https://github.com/thinkthroo/thinkthroo (Do give us a star!)
Up skill your team with our advanced courses based on codebase architecture. Reach out to us at [email protected] to learn more!
https://github.com/pmndrs/zustand/blob/main/tests/basic.test.tsx#L92
https://vitest.dev/guide/
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3