рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░рд╛ рдирд╛рдо рдЖрд░реНрдерд░ рд╣реИ, рдореИрдВ рдПрдХ рдореЛрдмрд╛рдЗрд▓ рд╡реЗрдм рдЯреАрдо рдХреЗ рд░реВрдк рдореЗрдВ VKontakte рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ
VKUI рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ
рд╣реВрдВ - рд░рд┐рдПрдХреНрдЯ-рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рдЕрднреА рднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИред рдХрдИ рдкреНрд░рд╕рд┐рджреНрдз рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ: Redux, MobX, рдкреНрд░рд╕рдВрдЧ рдПрдкреАрдЖрдИред рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Andr├й Gardi
State Management with React Hooks - No Redux рдпрд╛ Context API рдХрд╛ рдПрдХ рд▓реЗрдЦ рд╕рд╛рдордиреЗ рдЖрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдЦрдХ рдиреЗ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред
рд╣реБрдХ рдЬрд▓реНрджреА рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЬреАрд╡рди рдореЗрдВ рдЯреВрдЯ рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдпрд╛ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдирдП рддрд░реАрдХреЗ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рди рдХреЗрд╡рд▓ рдШрдЯрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рд╣рдорд╛рд░реА рд╕рдордЭ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреА рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝реЗрдВред

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

рдпрд╣ рдХреЙрд▓ рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдПрдХ рдЪрд░ рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдп рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рддрддреНрд╡ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред
import React, { useState } from 'react'; function Example() { const [state, setState] = useState({counter:0}); const add1ToCounter = () => { const newCounterValue = state.counter + 1; setState({ counter: newCounterValue}); } return ( <div> <p>You clicked {state.counter} times</p> <button onClick={add1ToCounter}> Click me </button> </div> ); }
рдЙрдкрдпреЛрдЧ ()
рдХреНрд▓рд╛рд╕ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕, рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ
componentDidMount()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВред
useEffect()
рд╣реБрдХ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░рднрд╛рд╡ рдкреНрд░рддреНрдпреЗрдХ redraw рдХреЗ рдмрд╛рдж рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд╕рд░рд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ред
componentDidMount()
рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреА рд╕рд╛рдордЧреНрд░реА рд╣рдореЗрд╢рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рднрд╛рд╡ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд░рд╛рдЬреНрдп рд╕рд╛рдЭрд╛рдХрд░рдг
рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдПрдХ рд╣реБрдХ рд╕реНрдЯреЗрдЯ рдПрдХ рдХреНрд▓рд╛рд╕ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реНрдЯреЗрдЯ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЕрдкрдиреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред
рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╣реБрдХ рдмрдирд╛рдПрдВрдЧреЗред

рд╡рд┐рдЪрд╛рд░ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд░рд╛рдЬреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЬрдм рднреА рдХреЛрдИ рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реИ, рд╕рднреА рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмреНрдб рдШрдЯрдХ рдЕрдкрдиреЗ
getState()
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдЕрдкрдбреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред
рд╣рдо рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рд╣реБрдХ рдХреЗ рдЕрдВрджрд░
useState()
рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди
setState()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕реЗ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд░рд╛рдЬреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдкрд▓ рд░реБрдХрд┐рдПред рдпрд╣ рдореЗрд░реЗ рдЬреАрд╡рди рдХреЛ рдХреИрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ?
рд╣рд╛рдВ, рдЖрдк рд╕рд╣реА рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ
рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдмрдирд╛рдпрд╛ рдЬреЛ рд╕рднреА рд╡рд░реНрдгрд┐рдд рд▓реЙрдЬрд┐рдХ рдХреЛ
рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдЗрд╕реЗ рд╣рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдм рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
npm install -s use-global-hook
рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВред рдФрд░ рдЕрдм рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдкреИрдХреЗрдЬ рдХреЛ рдЕрдВрджрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг
import { useState, useEffect } from 'react'; let listeners = []; let state = { counter: 0 }; const setState = (newState) => { state = { ...state, ...newState }; listeners.forEach((listener) => { listener(state); }); }; const useCustom = () => { const newListener = useState()[1]; useEffect(() => { listeners.push(newListener); }, []); return [state, setState]; }; export default useCustom;
рдШрдЯрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
import React from 'react'; import useCustom from './customHook'; const Counter = () => { const [globalState, setGlobalState] = useCustom(); const add1Global = () => { const newCounterValue = globalState.counter + 1; setGlobalState({ counter: newCounterValue }); }; return ( <div> <p> counter: {globalState.counter} </p> <button type="button" onClick={add1Global}> +1 to global </button> </div> ); }; export default Counter;
рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдЭрд╛рдХрд░рдг рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рд╣реЛрдВрдЧреЗред
рд▓реЗрдХрд┐рди рд╣рдо рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
- рдШрдЯрдХ рдХреЛ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдкрд░ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕рд░рдгреА рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ;
- рд╣реБрдХ рдХреЛ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдмрдирд╛рдПрдВ
- рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
initialState
рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВ; - рдПрдХ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд╣реБрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ред
рдХрд┐рд╕реА рдШрдЯрдХ рдХреЛ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рдЪрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХреЙрд▓рд┐рдВрдЧ
useEffect(function, [])
рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐
useEffect(function, [])
componentDidMount()
ред рд▓реЗрдХрд┐рди рдпрджрд┐ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдлрдВрдХреНрд╢рди рджреВрд╕рд░реЗ рдлрдВрдХреНрд╢рди рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреВрд╕рд░рд╛ рдлрдВрдХреНрд╢рди рд╕рд╣реА рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд┐рд▓реНрдХреБрд▓ рдШрдЯрдХрд╡рд┐рд▓реАрдЙрдорд╛рдЙрдВрдЯ
componentWillUnmount()
рддрд░рд╣ред
рддреЛ, рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВ, рдЖрдк рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реЗ рдПрдХ рдШрдЯрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
const useCustom = () => { const newListener = useState()[1]; useEffect(() => {
рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг
рдЗрд╕ рдЕрджреНрдпрддрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рднреА рд╣реИ:
- рд░рд┐рдПрдХреНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЖрдпрд╛рдд рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ;
- рдирд┐рд░реНрдпрд╛рдд рдХрд╕реНрдЯрдорд╣реБрдХ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХрд╕реНрдЯрдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рджрд┐рдП рдЧрдП
initalState
; - рдПрдХ
store
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ state
рдорд╛рди рдФрд░ setState()
рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛; setState()
рдФрд░ useCustom()
рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдЖрдк store
рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХреЗрдВред
function setState(newState) { this.state = { ...this.state, ...newState }; this.listeners.forEach((listener) => { listener(this.state); }); } function useCustom(React) { const newListener = React.useState()[1]; React.useEffect(() => {
рдШрдЯрдХреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХреНрд░рд┐рдпрд╛
рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рдЬрдЯрд┐рд▓ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдШрдЯрдХреЛрдВ рд╕реЗ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдХрд╛ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
рд░рд╛рдЬреНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг
setState()
рд▓рд┐рдП рдШрдЯрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рди рдХрд░реЗ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдкрд░ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ
useGlobalHook(React, initialState, actions)
рд╣рдорд╛рд░реЗ
useGlobalHook(React, initialState, actions)
-
useGlobalHook(React, initialState, actions)
рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред рдмрд╕ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА
store
рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред рдЗрд╕ рддрд░рд╣, рдХреНрд░рд┐рдпрд╛рдПрдБ store.state
рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝ рд╕рдХрддреА рд╣реИрдВ, store.setState()
рдХреЙрд▓ store.setState()
рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреА рд╣реИрдВ store.setState()
рдФрд░ рдпрд╣рд╛рдВ store.actions
рдЕрдиреНрдп store.actions
рдХреЛ рдХреЙрд▓ рдХрд░ store.actions
ред - рдЧрдбрд╝рдмрдбрд╝реА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдмрдЬреЗрдХреНрдЯреНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╕рднреА рдХрд╛рдЙрдВрдЯрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдм -рдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдПрдБ.
actions.counter.add(amount)
рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрд░рд┐рдпрд╛рдПрдБ. actions.counter.add(amount)
ред
рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг
рдирд┐рдореНрди рд╕реНрдирд┐рдкреЗрдЯ NPM рдкреИрдХреЗрдЬ
use-global-hook
рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
function setState(newState) { this.state = { ...this.state, ...newState }; this.listeners.forEach((listener) => { listener(this.state); }); } function useCustom(React) { const newListener = React.useState()[1]; React.useEffect(() => { this.listeners.push(newListener); return () => { this.listeners = this.listeners.filter(listener => listener !== newListener); }; }, []); return [this.state, this.actions]; } function associateActions(store, actions) { const associatedActions = {}; Object.keys(actions).forEach((key) => { if (typeof actions[key] === 'function') { associatedActions[key] = actions[key].bind(null, store); } if (typeof actions[key] === 'object') { associatedActions[key] = associateActions(store, actions[key]); } }); return associatedActions; } const useGlobalHook = (React, initialState, actions) => { const store = { state: initialState, listeners: [] }; store.setState = setState.bind(store); store.actions = associateActions(store, actions); return useCustom.bind(store, React); }; export default useGlobalHook;
рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг
рдЕрдм рдЖрдкрдХреЛ
useGlobalHook.js
рд╕реЗ
useGlobalHook.js
ред рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВред
рдПрдХрд╛рдзрд┐рдХ рдХрд╛рдЙрдВрдЯрд░, рдПрдХ рдореВрд▓реНрдп
рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝реЗрдВ: рд╡реЗ рд╕рднреА рдХрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдореВрд▓реНрдп рд╣реЛрдЧрд╛ред рд╣рд░ рдмрд╛рд░ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдЧрд╛, рдЕрдиреНрдп рд╕рднреА рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореВрд▓ рдШрдЯрдХ рдХреЛ рд░рд┐рдбрд░рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЦреЛрдЬреЗрдВред рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг ред
рдЦреИрд░ рдпрд╣ рд╕рдм рд╣реИ
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдкрд░ рдЕрдкрдирд╛ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред
рдЕрдиреБрд╡рд╛рджрдХ рдЯрд┐рдкреНрдкрдгреА
рдЕрдзрд┐рдХрд╛рдВрд╢ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЬреЛ рдмреЙрдХреНрд╕ рд╕реЗ рднреА рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓рд╛рд▓рдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЬреАрддрддрд╛ рд╣реИред