рд░рд┐рдПрдХреНрдЯ рд╣реБрдХреНрд╕ рдХреА рддрд░рд╣ рдПрдХ Redux рдХреА рддрд░рд╣ рдЧреНрд▓реЛрдмрд▓ рд╕реНрдЯреЛрд░ рдмрдирд╛рдирд╛

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд░рд╛рдорд╕реЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд▓реЗрдЦ "рдмрд┐рд▓реНрдб рдЕ рд░реЗрдбреНрдпреВрдХреНрд╕-рд▓рд╛рдЗрдХ рдЧреНрд▓реЛрдмрд▓ рд╕реНрдЯреЛрд░ рдпреВрдЬрд╝рд┐рдВрдЧ рд░реЗрдХреНрдЯ рд╣реБрдХреНрд╕" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред


рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдЪрдп рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рдЕрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЛрдВ рдкрд░ рд╕реАрдзреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдХрд░реЗрдВрдЧреЗ
рдПрдХ рдХрд╕реНрдЯрдо рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд░реЗрдбрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрдВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ Redux рдХреЗ рд╕рдорд╛рди рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рднрдВрдбрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдорд╛рдирддрд╛ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди Redux рдХреЗ рдкреВрд░реНрдг рд╕рдордХрдХреНрд╖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИред "Redux-like," рдХрд╣рдиреЗ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ,
рдЖрдк рдкреНрд░реЗрд╖рдг рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╛рдЬреНрдп рдХреА рдПрдХ рдирдИ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдкрдиреЗ Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рди рдкрдврд╝рдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЗрдВред


hooky


рдЖрдЗрдП рдПрдХ рд╕рдВрджрд░реНрдн ( рдЗрд╕рдХреЗ рдмрд╛рдж рдкреНрд░рд╕рдВрдЧ ) рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рд░рд╛рдЬреНрдп ( рдЗрд╕рдХреЗ рдмрд╛рдж рдХрд╛ рд░рд╛рдЬреНрдп ) рдФрд░ рдПрдХ рдкреНрд░реЗрд╖рдг рд╕рдорд╛рд░реЛрд╣ ( рдЗрд╕рдХреЗ рдмрд╛рдж рдкреНрд░реЗрд╖рдг ) рд╣реЛрдЧрд╛ред рд╣рдо рдпреВрдЬрд╝рд╕реНрдЯреЛрд░ рдлрд╝рдВрдХреНрд╢рди рднреА рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рд╣реБрдХ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред


// store/useStore.js import React, { createContext, useReducer, useContext } from "react"; //     const initialState = {} const StoreContext = createContext(initialState); // useStore    React       export const useStore = store => { const { state, dispatch } = useContext(StoreContext); return { state, dispatch }; }; 

рдЪреВрдБрдХрд┐ рд╕рдмрдХреБрдЫ React Context рдХреЗ рдЕрдВрджрд░ рдЬрдорд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рджреЗрдЧрд╛
рд╣рдореЗрдВ рдПрдХ рд░рд╛рдЬреНрдп рд╡рд╕реНрддреБ рдФрд░ рдПрдХ рдкреНрд░реЗрд╖рдг рд╕рдорд╛рд░реЛрд╣ред рдкреНрд░рджрд╛рддрд╛ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВрд░реЗрдбрд░ ред


 // store/useStore.js ... const StoreContext = createContext(initialState); export const StoreProvider = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); return ( <StoreContext.Provider value={{ state, dispatch }}> {children} </StoreContext.Provider> ); }; ... 

рд╣рдо рд╕реНрдЯреЗрдЯ рдФрд░ рдбрд┐рд╕реНрдкреИрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд░реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ useReducer рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд░рд╛рдЬреНрдп рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВ ред
рдЕрдм рд╣рдо рдХрд┐рд╕реА рднреА рд░рд┐рдПрдХреНрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ <рдкреНрд░рджрд╛рддрд╛ /> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдШрдЯрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЬрд╝рд╕реНрдЯреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рд╣рдордиреЗ рдЕрднреА рддрдХ reducer рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ ред рдпрд╣ рд╣рдорд╛рд░рд╛ рдЕрдЧрд▓рд╛ рдХрджрдо рд╣реЛрдЧрд╛ред


 // store/useStore.js ... const StoreContext = createContext(initialState); //    actions,     state const Actions = {}; // reducer   ,  action    dispatch // action.type -  ,     Actions //   update   state      const reducer = (state, action) => { const act = Actions[action.type]; const update = act(state); return { ...state, ...update }; }; ... 

рдореИрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рд░рд╛рдЬреНрдп рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЖрдкрдХреЛ рдХрд╛рдЙрдВрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ (рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг) рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ (рдЪрд╛рд╣реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдЕрдкрдиреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рд╣реЛ) рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдХреБрдЫ рдШрдЯрдХ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрди рджреЛрдиреЛрдВ рд░рд╛рдЬреНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд╡реИрд╢реНрд╡рд┐рдХ рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХрджрдо рд╕рд╣реА рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ userActions рдФрд░ countActions , рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред


рдЪрд▓реЛ рд╕реНрдЯреЛрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ countActions.js рдФрд░ userActions.js рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВред


 // store/countActions.js export const countInitialState = { count: 0 }; export const countActions = { increment: state => ({ count: state.count + 1 }), decrement: state => ({ count: state.count - 1 }) }; 

 // store/userActions.js export const userInitialState = { user: { loggedIn: false } }; export const userActions = { login: state => { return { user: { loggedIn: true } }; }, logout: state => { return { user: { loggedIn: false } }; } }; 

рдЗрди рджреЛрдиреЛрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ, рд╣рдо initialState рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА initialState рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ useStore.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЗ рдореНрдпреВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдирдпрд╛ рд░рд╛рдЬреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ reducer рдореЗрдВ, useStore.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛред


рдЕрдм рд╣рдо рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рднреА useStore.js рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред


 // store/useStore.js import React, { createContext, useReducer, useContext } from "react"; import { countInitialState, countActions } from "./countActions"; import { userInitialState, userActions } from "./userActions"; //    (initial states) const initialState = { ...countInitialState, ...userInitialState }; const StoreContext = createContext(initialState); //  actions const Actions = { ...userActions, ...countActions }; const reducer = (state, action) => { const act = Actions[action.type]; const update = act(state); return { ...state, ...update }; }; export const StoreProvider = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); return ( <StoreContext.Provider value={{ state, dispatch }}> {children} </StoreContext.Provider> ); }; export const useStore = store => { const { state, dispatch } = useContext(StoreContext); return { state, dispatch }; }; 

рд╣рдордиреЗ рдХрд░ рджрд┐рдЦрд╛рдпрд╛! рд╕рдореНрдорд╛рди рдХрд╛ рдПрдХ рдЪрдХреНрд░ рдмрдирд╛рдПрдВ, рдФрд░ рдЬрдм рдЖрдк рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВрдЧреЗ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдШрдЯрдХ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред


рд╡рд╛рдкрд╕ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕рд░реНрдХрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдореНрдорд╛рдирдЬрдирдХ рдерд╛ред рдЖрдЗрдП рдПрдХреНрд╢рдирд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ ред


рдкрд╣рд▓реЗ рд╣рдо рдЕрдкрдиреЗ App рдШрдЯрдХ рдХреЛ <StoreProvider /> рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВред


 // App.js import React from "react"; import ReactDOM from "react-dom"; import { StoreProvider } from "./store/useStore"; import App from "./App"; function Main() { return ( <StoreProvider> <App /> </StoreProvider> ); } const rootElement = document.getElementById("root"); ReactDOM.render(<Main />, rootElement); 

рд╣рдо рд╕реНрдЯреЛрд░рдкреНрд░реЙрдЗрдбрд░ рдореЗрдВ рдРрдк рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдореВрд▓реНрдп рддрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХ рдХреА рдкрд╣реБрдВрдЪ рд╣реЛред рдпрд╣ рдорд╛рди рд░рд╛рдЬреНрдп рдФрд░ рдкреНрд░реЗрд╖рдг рджреЛрдиреЛрдВ рд╣реИред


рдЕрдм, рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ AppHeader рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд▓реЙрдЧрд┐рди / рд▓реЙрдЧрдЖрдЙрдЯ рдмрдЯрди рд╣реИред


 // AppHeader.jsx import React, {useCallback} from "react"; import { useStore } from "./store/useStore"; const AppHeader = props => { const { state, dispatch } = useStore(); const login = useCallback(() => dispatch({ type: "login" }), [dispatch]); const logout = useCallback(() => dispatch({ type: "logout" }), [dispatch]); const handleClick = () => { loggedIn ? logout() : login(); } return ( <div> <button onClick={handleClick}> {loggedIn ? "Logout" : "Login"}</button> <span>{state.user.loggedIn ? "logged in" : "logged out"}</span> <span>Counter: {state.count}</span> </div> ); }; export default AppHeader; 

рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ


рдореВрд▓ рд▓реЗрдЦрдХ: рд░рд╛рдорд╕реЗ
рдореВрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ

Source: https://habr.com/ru/post/hi460083/


All Articles