Redux рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░рд┐рдПрдХреНрдЯ рд╕рдВрджрд░реНрдн рдФрд░ рд╣реБрдХ рдХреЗ рд╕рд╛рде рд╡реИрдХрд▓реНрдкрд┐рдХ

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ:

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



16.3.0 рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдирдП рд╕рдВрджрд░реНрдн рдПрдкреАрдЖрдИ рдХреА рд░рд┐рд╣рд╛рдИ рдХреЗ рдмрд╛рдж рд╕реЗ, рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЦреБрдж рд╕реЗ рдкреВрдЫрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рдПрдкреАрдЖрдИ рдЗрд╕реЗ Redux рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рдореИрдВрдиреЗ рднреА рдпрд╣реА рд╕реЛрдЪрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣реБрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг 16.8.0 рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ред рдореИрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдкрде рд╣рдореЗрд╢рд╛ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдирд╣реАрдВ рд╕рдордЭ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╡реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рднреА Redux рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реВрдВред

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

рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреА рд╕рднреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдмрдЯрди рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдо icanhazadjoke рдХреЗ рд╕рд╛рде рдЪреБрдЯрдХреБрд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реИред

рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рджреЛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЕрдкрдиреЗ рджреЛрд╕реНрдд рдХреЛ рджрд┐рд▓рд╛рд╕рд╛ рджреЗрддрд╛ рд╣реВрдВред

 console.count('Button') // Button: 1 console.count('Button') // Button: 2 console.count('App') // App: 1 console.count('Button') // Button: 3 

рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдПрдХ console.count рдХреЙрд▓ рдЬреЛрдбрд╝рдХрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХрд┐рддрдиреА рдмрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛, рд╣реБрд╣?

рджреВрд╕рд░реЗ, рдЬрдм рдХреЛрдИ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ children рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред

 function Parent({ children }) { const [count, setCount] = React.useState(0) console.count('Parent') return ( <div> <button type="button" onClick={() => { setCount(count => count + 1) }}> Force re-render </button> {children} </div> ) } function Child() { console.count('Child') return <div /> } function App() { return ( <Parent> <Child /> </Parent> ) } 

рдмрдЯрди рдкрд░ рдХреБрдЫ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдП:

 Parent: 1 Child: 1 Parent: 2 Parent: 3 Parent: 4 

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдХреНрд╕рд░ рдЕрдирджреЗрдЦрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдЕрдм рдЬрдм рд╣рдо рддреИрдпрд╛рд░ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдХрдВрдХрд╛рд▓ рдмрдирд╛рдПрдВ:

 import React from 'react' function Button() { console.count('Button') return ( <button type="button"> Fetch dad joke </button> ) } function DadJoke() { console.count('DadJoke') return ( <p>Fetched dad joke</p> ) } function App() { console.count('App') return ( <div> <Button /> <DadJoke /> </div> ) } export default App 

Button рдХреЛ рдПрдХ рдПрдХреНрд╢рди рдЬрдирд░реЗрдЯрд░ (рд▓рдЧрднрдЧ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░) рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреБрд╡рд╛рдж рд░реВрд╕реА рдореЗрдВ Redux рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЬрд┐рд╕реЗ рдПрдХ рдордЬрд╛рдХ рдорд┐рд▓реЗрдЧрд╛ред DadJoke рдХреЛ рд░рд╛рдЬреНрдп DadJoke рдЪрд╛рд╣рд┐рдП, рдФрд░ App рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛрдиреЛрдВ рдШрдЯрдХреЛрдВ App рдкреНрд░рджрд░реНрд╢рд┐рдд App ред

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

рддреЛ, рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ contexts/dad-joke.js ред

 import React from 'react' const DadJokeContext = React.createContext() export function DadJokeContextProvider({ children }) { const state = { dadJoke: null } const actions = { fetchDadJoke: () => {}, } return ( <DadJokeContext.Provider value={{ state, actions }}> {children} </DadJokeContext.Provider> ) } 

рд╣рдо рд╕рдВрджрд░реНрдн рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рд╣реБрдХ рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

 export function useDadJokeState() { return React.useContext(DadJokeContext).state } export function useDadJokeActions() { return React.useContext(DadJokeContext).actions } 

рдЕрдм рд╣рдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 import React from 'react' import { DadJokeProvider, useDadJokeState, useDadJokeActions, } from './contexts/dad-joke' function Button() { const { fetchDadJoke } = useDadJokeActions() console.count('Button') return ( <button type="button" onClick={fetchDadJoke}> Fetch dad joke </button> ) } function DadJoke() { const { dadJoke } = useDadJokeState() console.count('DadJoke') return ( <p>{dadJoke}</p> ) } function App() { console.count('App') return ( <DadJokeProvider> <Button /> <DadJoke /> </DadJokeProvider> ) } export default App 

рдпрд╣рд╛рдБ! рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣рдордиреЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╣рдо рдЕрдм рдкреВрд░реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдЪрд▓рд┐рдП DadJokeProvider рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рдЕрдкрдиреА рд╕рдВрджрд░реНрдн рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рдБ, рд╣рдо рд╕рд┐рд░реНрдл useState рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реЗ рд░рд╛рдЬреНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ useState рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдФрд░ рдкреНрд░рд┐рдп Redux рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ред

 function reducer(state, action) { switch (action.type) { case 'SET_DAD_JOKE': return { ...state, dadJoke: action.payload, } default: return new Error(); } } 

рдЕрдм рд╣рдо рдЗрд╕ useReducer рдХреЛ useReducer рд╣реБрдХ рд╕реЗ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдордЬрд╛рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 export function DadJokeProvider({ children }) { const [state, dispatch] = React.useReducer(reducer, { dadJoke: null }) async function fetchDadJoke() { const response = await fetch('https://icanhazdadjoke.com', { headers: { accept: 'application/json', }, }) const data = await response.json() dispatch({ type: 'SET_DAD_JOKE', payload: data.joke, }) } const actions = { fetchDadJoke, } return ( <DadJokeContext.Provider value={{ state, actions }}> {children} </DadJokeContext.Provider> ) } 

рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЪреБрдЯрдХреБрд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП!

рдЪрд▓реЛ рдХрдВрд╕реЛрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

 App: 1 Button: 1 DadJoke: 1 Button: 2 DadJoke: 2 Button: 3 DadJoke: 3 

рд╣рд░ рдмрд╛рд░ рд░рд╛рдЬреНрдп рдХреЗ рдЕрджреНрдпрддрди рд╣реЛрдиреЗ рдкрд░ рджреЛрдиреЛрдВ рдШрдЯрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдШрдЯрдХ рдХреЗрд╡рд▓ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЗрди рд╕рднреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗрдВ?

рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдорд╛рдирддрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрдиреБрд╕реНрдорд╛рд░рдХ:

 const obj = {} //       console.log(obj === obj) // true //        //  2   console.log({} === {}) // false 

рдПрдХ рдШрдЯрдХ рдЬреЛ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдЕрд░реНрде рдХреЛ рджреЗрдЦреЗрдВ:

 <DadJokeContext.Provider value={{ state, actions }}> 

рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░рд░ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдХреЛрдИ рдПрдХреНрд╢рди ( dispatch ) рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдорд╛рди рдХреЛ рдХреИрд╢ рдХрд░рдирд╛ ( memoize ) рдЕрд╕рдВрднрд╡ рд╣реИред

рдФрд░ рдпрд╣ рд╕рдм рдХрд╣рд╛рдиреА рдХреЗ рдЕрдВрдд рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдЕрдЧрд░ рд╣рдо fetchDadJoke рдлрд╝рдВрдХреНрд╢рди рдХреЛ fetchDadJoke рд╣реИрдВ, рддреЛ рдмрд╛рд╣рд░реА рджрд╛рдпрд░реЗ рд╕реЗ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬрд╝ dispatch , рд╣реИ рдирд╛? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЖрдкрдХреЛ useReducer рдФрд░ useState рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд░рд╣рд╕реНрдп рдмрддрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ useState :

 let prevSetCount function Counter() { const [count, setCount] = React.useState() if (typeof prevSetCount !== 'undefined') { console.log(setCount === prevSetCount) } prevSetCount = setCount return ( <button type="button" onClick={() => { setCount(count => count + 1) }}> Increment </button> ) } 

рдХрдИ рдмрд╛рд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдХрдВрд╕реЛрд▓ рджреЗрдЦреЗрдВ:

 true true true 

рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ setCount рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ dispatch рд╕рдорд╛рд░реЛрд╣ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ fetchDadJoke рдлрд╝рдВрдХреНрд╢рди fetchDadJoke рднреА рдЪреАрдЬрд╝ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдПрдХреНрд╢рди рдЬрдирд░реЗрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░, рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдкрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 const actions = React.useMemo(() => ({ fetchDadJoke, }), []) 

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреИрд╢реНрдб рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдо рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдореВрд▓реНрдп рд╡рд╕реНрддреБ рдХреЛ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рд╣рдореЗрдВ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рдореМрдЬреВрджрд╛ рд╕рдВрджрд░реНрдн рд╕реЗ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддреЗ рд╣реИрдВ? рдХрд┐рд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

 const DadJokeStateContext = React.createContext() const DadJokeActionsContext = React.createContext() 

рд╣рдо рдЕрдкрдиреЗ DadJokeProvider рдореЗрдВ рджреЛрдиреЛрдВ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

  return ( <DadJokeStateContext.Provider value={state}> <DadJokeActionsContext.Provider value={actions}> {children} </DadJokeActionsContext.Provider> </DadJokeStateContext.Provider> ) 

рдФрд░ рд╣рдорд╛рд░реЗ рд╣реБрдХ рдЯреНрд╡реАрдХ рдХрд░реЗрдВ:

 export function useDadJokeState() { return React.useContext(DadJokeStateContext) } export function useDadJokeActions() { return React.useContext(DadJokeActionsContext) } 

рдФрд░ рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ! рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЪреБрдЯрдХреБрд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВред

 App: 1 Button: 1 DadJoke: 1 DadJoke: 2 DadJoke: 3 DadJoke: 4 DadJoke: 5 

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

рдЕрдкрдиреА рдХрд▓реНрдкрдирд╛ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Redux рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рджреЛ-рд╕рдВрджрд░реНрдн рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрдВрдЯ рд╕реАред рдбреЛрдбреНрд╕ рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЙрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдо рдмрджрд▓ рдЧрдП рд╣реИрдВред

рдореИрдВрдиреЗ рдЬрд┐рди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗрдВрдЯ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдкрдврд╝реЗрдВ:

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

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


All Articles