Zustand, 언제, 어떻게, 왜

PHPz
풀어 주다: 2024-09-03 21:00:40
원래의
538명이 탐색했습니다.

목차

  1. 국가관리개론
  2. Zustand의 이해
  3. 상태 유형
  4. Zustand 시작하기
  5. Zustand의 주요 기능
  6. Zustand 구현
  7. Zustand와 기타 상태 관리 솔루션 비교
  8. Zustand 시스템 설계
  9. Zustand의 상태 유지
  10. React 구성 요소 외부에서 Zustand 사용
  11. 실제 사례
  12. 결론
  13. 팁: Zusstand로 비동기 코드 처리

1. 상태 관리 소개

상태 관리는 현대 웹 개발, 특히 복잡한 애플리케이션에서 중요한 측면입니다. 여기에는 시간이 지남에 따라 변경될 수 있는 데이터를 처리하고 이 데이터가 전체 애플리케이션에서 일관되게 표시되도록 보장하는 작업이 포함됩니다. 효과적인 상태 관리는 애플리케이션을 더욱 예측 가능하고 유지 관리 가능하게 만듭니다.

2. Zustand 이해

Zustand는 React 애플리케이션을 위한 작고 빠르며 확장 가능한 상태 관리 솔루션입니다. Jared Palmer와 Daishi Kato가 만든 Zustand는 다른 솔루션에 비해 상태 관리를 덜 번거롭게 만드는 간단하고 직관적인 API를 제공합니다.

3. 상태의 종류

Zustand에 대해 자세히 알아보기 전에 웹 애플리케이션의 다양한 상태 유형을 이해해 보겠습니다.

  1. 로컬 상태: 구성 요소에 특정한 상태이며 애플리케이션의 다른 부분과 공유할 필요가 없습니다.
  2. 전역 상태: 애플리케이션 전체의 여러 구성 요소에서 액세스하고 수정해야 하는 상태
  3. 원격 상태: 외부 소스(일반적으로 API)에서 가져온 데이터를 나타내는 상태입니다.

Zustand는 로컬 및 전역 상태 관리에 탁월하며 원격 상태 관리용 솔루션과 통합될 수 있습니다.

4. Zustand 시작하기

Zustand 사용을 시작하려면 먼저 npm, Yarn 또는 pnpm을 통해 설치하세요.

으아악

5. Zustand의 주요 기능

Zustand에는 눈에 띄는 여러 기능이 있습니다.

  1. 단순성: Zustand에는 최소한의 API가 있어 쉽게 배우고 사용할 수 있습니다.
  2. 상용구 없음: 다른 상태 관리 솔루션과 달리 Zustand에는 설정 코드가 거의 필요하지 않습니다.
  3. 후크 기반: Zustand는 React Hooks를 활용하여 최신 React 개발에 기본적으로 사용되는 느낌을 줍니다.
  4. TypeScript 지원: Zustand는 TypeScript와 잘 작동하여 뛰어난 유형 추론을 제공합니다.
  5. 미들웨어 지원: Zustand를 사용하면 미들웨어를 통해 기능을 확장할 수 있습니다.
  6. Devtools 지원: Zustand는 디버깅을 위해 Redux DevTools와 잘 통합됩니다.
  7. 프레임워크에 구애받지 않음: 주로 React와 함께 사용되지만 Zustand는 모든 JavaScript 환경에서 사용할 수 있습니다.

6. Zustand 구현

Zustand의 기본 구현을 살펴보겠습니다.

으아악

이 예에서는 Bears 상태와 이를 수정하는 두 가지 작업이 있는 저장소를 만듭니다. 그런 다음 BearCounter 및 Controls 구성 요소는 useStore 후크를 사용하여 상태에 액세스하고 수정할 수 있습니다.

7. Zustand와 기타 상태 관리 솔루션 비교

Zustand를 다른 인기 있는 상태 관리 솔루션과 비교해 보겠습니다.

Zustand 대 Redux

Zustand의 장점:

  • 상용구를 줄이고 더 간단한 API
  • 액션 생성자나 스위치 문이 필요하지 않습니다
  • 더 작은 번들 크기

단점:

  • 덜 확립된 생태계
  • 더 적은 미들웨어 옵션

Zustand 대 MobX

Zustand의 장점:

  • 더 간단하고 덜 마법적인 API
  • 대규모 애플리케이션을 위한 더 나은 성능

단점:

  • 기본적으로 덜 반응적입니다
  • 기본적으로 계산된 값이 없습니다

Zustand 대 반동

Zustand의 장점:

  • 간단한 정신 모델
  • React 외부에서 작동

단점:

  • 덜 세분화된 반응성
  • 아톰 패밀리 개념이 내장되어 있지 않습니다

8. Zustand의 시스템 설계

Zustand의 시스템 설계는 몇 가지 주요 원칙을 기반으로 합니다.

  1. Single store: Zustand encourages the use of a single store for all application state.
  2. Immutability: State updates are handled immutably, ensuring predictable behavior.
  3. Subscriptions: Components subscribe to specific parts of the state, re-rendering only when those parts change.
  4. Middleware: Zustand uses a middleware system for extending functionality.

This design allows Zustand to be both simple and powerful, providing excellent performance even in large applications.

9. Persisting State with Zustand

Zustand makes it easy to persist state, which is crucial for many applications. Here's an example using the persist middleware:

import { create } from 'zustand' import { persist } from 'zustand/middleware' const useStore = create(persist( (set, get) => ({ fishes: 0, addAFish: () => set({ fishes: get().fishes + 1 }), }), { name: 'food-storage', // unique name getStorage: () => localStorage, // (optional) by default, 'localStorage' is used } ))
로그인 후 복사

This will automatically save the state to localStorage and rehydrate it when the app reloads.

10. Using Zustand Outside React Components

One of Zustand's strengths is that it can be used outside of React components. This is particularly useful for integrating with other parts of your application or for testing:

const { getState, setState } = useStore // Getting state console.log(getState().bears) // Setting state setState({ bears: 10 }) // Using actions getState().increasePopulation()
로그인 후 복사

11. Real-World Examples

Let's look at some real-world examples of using Zustand:

Authentication State

import { create } from 'zustand' const useAuthStore = create((set) => ({ user: null, isAuthenticated: false, login: (userData) => set({ user: userData, isAuthenticated: true }), logout: () => set({ user: null, isAuthenticated: false }), })) // Usage in a component function LoginButton() { const { isAuthenticated, login, logout } = useAuthStore() const handleAuth = () => { if (isAuthenticated) { logout() } else { // Simulate login login({ id: 1, name: 'John Doe' }) } } return (  ) }
로그인 후 복사

Shopping Cart

import { create } from 'zustand' const useCartStore = create((set) => ({ items: [], addItem: (item) => set((state) => ({ items: [...state.items, item] })), removeItem: (itemId) => set((state) => ({ items: state.items.filter((item) => item.id !== itemId), })), clearCart: () => set({ items: [] }), total: 0, updateTotal: () => set((state) => ({ total: state.items.reduce((sum, item) => sum + item.price, 0), })), })) // Usage in components function CartSummary() { const { items, total, removeItem } = useCartStore() return ( 
{items.map((item) => (
{item.name} - ${item.price}
))}
Total: ${total}
) }
로그인 후 복사

Theme Switcher

import { create } from 'zustand' import { persist } from 'zustand/middleware' const useThemeStore = create(persist( (set) => ({ theme: 'light', toggleTheme: () => set((state) => ({ theme: state.theme === 'light' ? 'dark' : 'light', })), }), { name: 'theme-storage', } )) // Usage in a component function ThemeToggle() { const { theme, toggleTheme } = useThemeStore() return (  ) }
로그인 후 복사

12. Conclusion

Zustand offers a refreshing approach to state management in React applications. Its simplicity, flexibility, and performance make it an excellent choice for both small and large projects. By reducing boilerplate and providing a straightforward API, Zustand allows developers to focus on building features rather than managing complex state logic.

While it may not have the extensive ecosystem of some older state management solutions, Zustand's design principles and ease of use make it a compelling option for modern React development. Its ability to work outside of React components and easy integration with persistence solutions further extend its utility.

For many React applications, Zustand strikes an excellent balance between simplicity and power, making it worth considering for your next project.

Bonus tips:

Zustand also handles asynchronous functions/code really well and without the need for any Middleware setup.

Let's talk a bit about that:

13. Handling Asynchronous Code with Zustand

One of Zustand's strengths is its simplicity in handling asynchronous operations without the need for additional middleware or complex setups. This makes it particularly easy to work with API calls, data fetching, and other asynchronous tasks.

How Zustand Handles Asynchronous Code

Zustand's approach to asynchronous code is straightforward:

  1. Direct Integration: Asynchronous functions can be defined directly in the store.
  2. No Special Syntax: You don't need to use special action creators or thunks.
  3. State Updates: You can update the state within async functions using the set function.
  4. Error Handling: Error states can be managed directly within the async functions.

Implementing Asynchronous Code

Here's an example of how to implement asynchronous code in Zustand:

import { create } from 'zustand' const useUserStore = create((set) => ({ user: null, isLoading: false, error: null, fetchUser: async (userId) => { set({ isLoading: true, error: null }); try { const response = await fetch(`https://api.example.com/users/${userId}`); if (!response.ok) throw new Error('Failed to fetch user'); const userData = await response.json(); set({ user: userData, isLoading: false }); } catch (error) { set({ error: error.message, isLoading: false }); } }, })); // Usage in a component function UserProfile({ userId }) { const { user, isLoading, error, fetchUser } = useUserStore(); React.useEffect(() => { fetchUser(userId); }, [userId]); if (isLoading) return 
Loading...
; if (error) return
Error: {error}
; if (!user) return null; return (

{user.name}

Email: {user.email}

); }
로그인 후 복사

In this example:

  1. We define an async fetchUser function directly in the store.
  2. The function manages loading and error states alongside the user data.
  3. We use the set function to update the state at different points in the async operation.
  4. In the component, we can use the store's state and actions as usual, with React hooks handling the component lifecycle.

Benefits of Zustand's Approach to Async Code

  1. Simplicity: No need for additional middleware or complex action creators.
  2. Flexibility: You can structure your async logic however you prefer.
  3. Readability: Async operations are defined close to the relevant state.
  4. Easy Testing: Async functions can be easily unit tested.

Comparison with Other Solutions

Unlike Redux, which often requires middleware like Redux Thunk or Redux Saga for handling async operations, Zustand's approach is much more straightforward. This simplicity can lead to less boilerplate and a gentler learning curve, especially for developers new to state management.

MobX and Recoil also offer ways to handle async operations, but Zustand's approach might be considered more intuitive due to its direct use of async/await syntax without additional abstractions.

Kesimpulannya untuk async

Pengendalian kod tak segerak Zustand menunjukkan falsafah kesederhanaan dan fleksibilitinya. Dengan membenarkan pembangun menulis fungsi async terus di kedai tanpa sintaks atau perisian tengah khas, Zustand memudahkan untuk mengurus operasi keadaan kompleks sambil memastikan pangkalan kod bersih dan boleh dibaca.

Pendekatan kepada kod tak segerak ini, digabungkan dengan ciri Zustand yang lain seperti saiz berkas kecil dan persediaan mudah, menjadikannya pilihan terbaik untuk projek semua saiz, terutamanya yang melibatkan pengurusan keadaan tak segerak yang ketara.

Semoga "panduan agak" ini berguna dan bernas untuk mana-mana daripada anda yang berfikir tentang cara mengurus keadaan aplikasi global anda.
Terima kasih dan Selamat mengekod.

Sila lihat laman web saya di https://www.ricardogesteves.com

Ikuti saya@ricardogesteves
X(twitter)

Zustand, When, how and why

RicardoGEsteves (Ricardo Esteves) · GitHub

Pembangun Tindanan Penuh | Bersemangat untuk mencipta pengalaman pengguna yang intuitif dan memberi kesan | Berpangkalan di Lisbon, Portugal ?? - RicardoGEsteves

Zustand, When, how and whygithub.com

위 내용은 Zustand, 언제, 어떻게, 왜의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!