рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ:
рдореИрдВ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ Redux рдХреЛ рд░рд┐рдПрдХреНрдЯ рд╕рдВрджрд░реНрдн рдФрд░ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдиреБрд╡рд╛рдж рдпрд╛ рдкрд╛рда рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд╣реИред рдЕрдкрдиреЗ рджреЗрдЦрдиреЗ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред
16.3.0 рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдирдП рд╕рдВрджрд░реНрдн рдПрдкреАрдЖрдИ рдХреА рд░рд┐рд╣рд╛рдИ рдХреЗ рдмрд╛рдж рд╕реЗ, рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЦреБрдж рд╕реЗ рдкреВрдЫрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рдПрдкреАрдЖрдИ рдЗрд╕реЗ Redux рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рдореИрдВрдиреЗ рднреА рдпрд╣реА рд╕реЛрдЪрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣реБрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг 16.8.0 рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ред рдореИрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдкрде рд╣рдореЗрд╢рд╛ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдирд╣реАрдВ рд╕рдордЭ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╡реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рднреА Redux рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реВрдВред
рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ
рдХреИрдВрдЯ рд╕реАред рдбреЛрдбреНрд╕ рдХреЗ рд╕рдорд╛рдЪрд╛рд░ рдкрддреНрд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд┐рдпрд╛ рдФрд░ рд╕рдВрджрд░реНрдн рдФрд░ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ рдИрдореЗрд▓ рдХреА рдЦреЛрдЬ рдХреАред рдореИрдВ рдкрдврд╝рдиреЗ рд▓рдЧрд╛тАжред рдФрд░ рдкрдврд╝реЗрдВ ... рдФрд░ 5 рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреА рд╕рднреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдмрдЯрди рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдо
icanhazadjoke рдХреЗ рд╕рд╛рде рдЪреБрдЯрдХреБрд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реИред
рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рджреЛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЕрдкрдиреЗ рджреЛрд╕реНрдд рдХреЛ рджрд┐рд▓рд╛рд╕рд╛ рджреЗрддрд╛ рд╣реВрдВред
console.count('Button')
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдПрдХ
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 = {}
рдПрдХ рдШрдЯрдХ рдЬреЛ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдЕрд░реНрде рдХреЛ рджреЗрдЦреЗрдВ:
<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
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред
рджреЛ-рд╕рдВрджрд░реНрдн рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрдВрдЯ рд╕реАред рдбреЛрдбреНрд╕ рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЙрд╕реЗ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдо рдмрджрд▓ рдЧрдП рд╣реИрдВред
рдореИрдВрдиреЗ рдЬрд┐рди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗрдВрдЯ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдкрдврд╝реЗрдВ:
рдХрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдореЗрдореЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреИрд╕реЗ рдХрд░реЗрдВрдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрдиредрдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреБрди: рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЪрд╛рд▓