Zustand
ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ Ρ React ΠΈ Zustand
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Zustand ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ React. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Ρ ΡΠΎΠ·Π΄Π°ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Pokemon. ΠΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠΏΠΈΡΠΊΠ° ΠΈ ΡΠΎΡΠΌΡ Π²Π²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π²Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
Π¨Π°Π³ 1. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Zustand ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠΎΡΡΠ°, ΠΊΠ°ΠΊ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² npm. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΅Π³ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ npm ΠΈΠ»ΠΈ yarn.
npm install zustand
yarn add zustand
Π¨Π°Π³ 2. Π‘ΠΎΠ·Π΄Π°ΡΠΌ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅
ΠΠ°Π»Π΅Π΅ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ.
import create from "zustand";
const useStore = create((set) => ({
pokemons: [{ id: 1, name: "Bulbasaur" },
{ id: 2, name: "Ivysaur" },
{ id: 3, name: "Venusaur" },
{ id: 4, name: "Charmander" },
{ id: 5, name: "Charmeleon" },
],
addPokemons: (pokemon) =>
set((state) => ({
pokemons: [
{ name: pokemon.name, id: Math.random() * 100 },
...state.pokemons,
]})),
removePokemon: (id) =>
set((state) => ({
pokemons: state.pokemons.filter((pokemon) => pokemon.id !== id),
})),
}));
export default useStore;
Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ create API, ΠΈ ΡΠΊΡΠ΅Π½Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅. ΠΠΎΡΡΡΠΏ ΠΊ ΡΡΠΎΠΌΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° HOC (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°), ΠΊΠ°ΠΊ Π² Redux.
Π¨Π°Π³ 3. ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΡ
Zustand Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠΈΠ²ΡΠ·Π°Π½ ΠΊ React. ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ Π»ΡΠ±ΡΠΌΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Vue ΠΈΠ»ΠΈ Angular. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΡ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°.
ΠΠΎΡΡΡΠΏ ΠΊ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΏΠΈΡΠΊΠ°
import useStore from "../store";
function List() {
const pokemons = useStore((state) => state.pokemons);
const removePokemon = useStore((state) => state.removePokemon);
return (
<div className="row">
<div className="col-md-4"></div>
<div className="col-md-4">
<ul>{pokemons.map((pokemon) => (
<li key={pokemon.id}>
<div className="row">
<div className="col-md-6">{pokemon.name} </div>
<div className="col-md-6">
<button className="btn btn-outline-secondary btn-sm"
onClick={(e) => removePokemon(pokemon.id)}>X
</button>
</div>
</div>
</li>
))}
</ul>
</div>
<div className="col-md-4"></div>
</div>);
}
export default List;
ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΡΠΌΡ
import { useState } from "react";
import useStore from "../store";
function Form() {
const [name, setName] = useState("");
const addPokemons = useStore((state) => state.addPokemons);
const onChange = (e) => {
setName(e.target.value);
};
const addPokemon = () => {
addPokemons({ name: name });
clear();
};
const clear = () => setName("");
return (
<div className="row">
<div className="col-md-2"></div>
<div className="col-md-6">
<input
type="text"
className="form-control"
onChange={onChange}
value={name}
></input>
</div>
<div className="col-md-2">
<button
className="btn btn-outline-primary"
onClick={(e) => addPokemon()}
>
Add
</button>
</div>
<div className="col-md-2"></div>
</div>
);
}
export default Form;
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, Zustand Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠ½Π΅Π΅ ΠΈ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ Redux, Recoil ΠΈΠ»ΠΈ Jotai.
Π¨Π°Π³ 4. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡ
ΡΠΊΡΠ΅Π½ΠΎΠ²
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Zustand ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· REST API. ΠΡΠΈ ΡΠΊΡΠ΅Π½Ρ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ.
import axios from "axios";
const useStore = create(set => ({
pokemons: [],
getPokemons: async ()=> {
const response = await axios.get('')
set({ pokemons: response.data })
}
}))
ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΡΠΊΡΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ async/await Π² JavaScript. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠ΅ ΡΠΊΡΠ΅Π½Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· axios.
Π¨Π°Π³ 5: Middleware Π΄Π»Ρ Zustand
Zustand ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ middleware'ΠΎΠ² ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ middleware'Π°ΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ dev tools (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Redux) ΠΈ Persist, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.
let useStore : (set)=>{
/* state and actions */
};
useStore = persist(useStore, { name: 'Bulbasaur' })
useStore = devtools(useStore)
export default useStore = create(useStore);

Π‘ Zustand Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ middleware ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Zustand β ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΌΡΡ Π»Π΅Π³ΠΊΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π³ΠΈΠ±ΠΊΠΎΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΈ middlerware Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Zustand ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΡ Π²Π½Π΅ React ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Redux DevTools, Persist ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ React Hooks, TypeScript ΠΈ Ρ. Π΄.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Zustand Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΌ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠΌ Π½Π° ΠΏΠΎΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠΎΡΡΠΎΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ°ΠΊΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ Π΅Π΅ Ρ ΠΎΡΠΎΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ .
Last updated