π Π§Π°ΡΡΡ 2: ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈ Π² Zustand β ΠΌΠΈΠ΄Π΄Π»Π²Π°ΡΡ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
ΠΡΠΈΠ²Π΅Ρ, Π΄ΡΡΠ·ΡΡ!
π ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Ρ
Zustand. Π ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ,ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ shallow ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΠΌΠΈΠ΄Π΄Π»Π²Π°ΡΡ.
πΉ Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ `shallow` ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ?
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Zustand ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠΎΠΌ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ (
===
). ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΠ΅ΡΡ Π½Π° ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ ΠΊ Π½Π΅Π½ΡΠΆΠ½ΡΠΌ ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΠ°ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
shallow
ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: ΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ
ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ².
ΠΡΠΈΠΌΠ΅Ρ:
import { shallow } from 'zustand/shallow';
const { fieldA, fieldB } = useStore(
(state) => ({ fieldA: state.fieldA, fieldB: state.fieldB }),
shallow
);
ΠΠ΄Π΅ΡΡ:
- ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π°
`fieldA` ΠΈΠ»ΠΈ `fieldB` ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡ.
- ΠΡΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ»Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡ, ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ.
ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
shallow
?
1. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΠ΅ΡΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ.
2. ΠΠ»Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΠΎΠ² ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ.
ΠΡΠΈΠΌΠ΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Ρ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ:
const items = useStore((state) => state.items, shallow);
ΠΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ ΡΡΡΡΠΊΡΡΡΠ° ΠΈΠ»ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡΡ. ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² ΠΎΡΡΠ°ΡΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ, Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π΄ΡΡΠ³ΠΈΡ
ΡΠ°ΡΡΠ΅ΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, ΡΠ΅ΡΠ΅Π½Π΄Π΅Ρ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
shallow
Π² ΠΏΠ°ΡΠ΅ Ρ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΠ°ΠΌΠΈ β ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ!
πΉ Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΌΠΈΠ΄Π΄Π»Π²Π°ΡΡ
Zustand ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΌΠΈΠ΄Π΄Π»Π²Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ.
ΠΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ ΠΌΠΈΠ΄Π΄Π»Π²Π°ΡΡ:
1.
devtools: ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
2.
persist: ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π²
localStorage
.
3.
immer: ΡΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ.
ΠΡΠΈΠΌΠ΅Ρ Ρ devtools:
import create from 'zustand';
import { devtools } from 'zustand/middleware';
const useStore = create(
devtools((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
}))
);
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ persist:
import create from 'zustand';
import { persist } from 'zustand/middleware';
const useStore = create(
persist(
(set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
}),
{
name: 'counter-storage',
}
)
);
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΡΠΈΡΠΌΠΈ.
πΉ Π Π°Π±ΠΎΡΠ° Ρ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ
Zustand ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π·
set
.
ΠΡΠΈΠΌΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
:
const useStore = create((set) => ({
users: [],
fetchUsers: async () => {
const response = await fetch('https://api.example.com/users');
const data = await response.json();
set({ users: data });
},
}));
Π ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅:
function UserList() {
const { users, fetchUsers } = useStore();
useEffect(() => {
fetchUsers();
}, [fetchUsers]);
return (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}
πΉ ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠ΅, Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Zustand.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ:
1.
Π Π°Π·Π΄Π΅Π»ΡΠΉΡΠ΅ store Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ
Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠ°ΡΡΠ΅ΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, auth, UI, Π΄Π°Π½Π½ΡΠ΅).
ΠΡΠΈΠΌΠ΅Ρ:
const useAuthStore = create((set) => ({
isAuthenticated: false,
login: () => set({ isAuthenticated: true }),
}));
const useUIStore = create((set) => ({
theme: 'light',
toggleTheme: () =>
set((state) => ({ theme: state.theme === 'light' ? 'dark' : 'light' })),
}));
2.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ context Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ store
ΠΠ»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ Π² Π±ΠΎΠ»ΡΡΠΈΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
.
π― ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Zustand β ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΡΠΎΠΉ state-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ, Π½ΠΎ ΠΈ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Π»Π΅ΠΊΡΠΎΡΡ, ΠΌΠΈΠ΄Π΄Π»Π²Π°ΡΡ ΠΈ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΡΠΏΡΠΎΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ.
ReactJs Daily | #pro