рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рд▓рдЧрддрд╛ рд╣реИ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ ред ЁЯШХ
рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рддрд╛ рдФрд░ useContext
рд╣реБрдХ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЕрдкрдбреЗрдЯ рдЦрд╛рд░рд┐рдЬ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рдЬрдм рднреА value
рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ, рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХреМрди рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдХреМрди рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ / OS рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИрдВ?
18.8.0-alpha.1
( 16.7.0-alpha.0
рдкрд░ рднреА рдкреБрдирд░реБрддреНрдкрд╛рджрд┐рдд)chrome 71
рд╕реНрдерд╛рдиреАрдп рдХрдиреЗрдХреНрд╢рди "рдХрдиреЗрдХреНрд╢рди" рдХреА рд╕рдлрд╛рдИ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП,
рдореИрдВрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ 2 рд▓реЗрдЦреЛрдВ ( [1]
& [2]
) рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣реБрдХ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рди рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВрдиреЗ codeandbox [3]
рдкрд░ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбреЗрдореЛ рдбрд╛рд▓рд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЕрдзрд┐рдХ рд╣реИрдВ (рдЗрд╕реЗ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ JSON рдореЗрдВ рдмрджрд▓рдирд╛)ред
рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓рд╛:
setValue
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдкрд░ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред[1]
рдХреА рд╕рд▓рд╛рд╣ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рддрд╛ рд╣реИредcomponentDidUpdate
рдмрдЬрд╛рдп useEffect
редрдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдкреНрд░рднрд╛рд╡ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ,
рд▓реЗрдХрд┐рди рдореВрд▓реНрдп рд╣реБрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦрдкрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдкрд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред repro рдХреЛрдб [3]
const createLocalStorage = key => {
const initialValue = localStorage.getItem(key)
const ValueContext = createContext(initialValue)
const SetterContext = createContext(() => {})
const useStorage = () => [ValueContext, SetterContext].map(useContext)
const Provider = ({children}) => {
const [value, setValue] = useState(initialValue)
useEffect(
() => {
console.log('effect', value)
localStorage.setItem(key, value)
},
[value],
)
return (
<ValueContext.Provider value={value}>
<SetterContext.Provider value={setValue}>
{children}
</SetterContext.Provider>
</ValueContext.Provider>
)
}
return [Provider, useStorage]
}
[1]
: https://reactjs.org/docs/hooks-faq.html#how -to-avoid-pass-callbacks-down
[2]
: https://reactjs.org/docs/context.html#updating -context-from-a-nested-Components
[3]
: https://codesandbox.io/s/0yzjr8vnrv
рдореИрдВрдиреЗ рдХреЛрдбреИрдВрдбрдмреЙрдХреНрд╕ [3] рдкрд░ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбреЗрдореЛ рдбрд╛рд▓рд╛ рд╣реИред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреА рддрд░рд╣ рдЕрдкрдиреЗ рд▓рдЧ рд░рд╣рд╛ рд╣реИ useContext
рдХреЙрд▓ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдШрдЯрдХ рдореЗрдВ рд╣реИрдВ Provider
ред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╡реЗ рдкреНрд░рджрд╛рддрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдХ) рдХреЗ рдКрдкрд░ рд╕рдВрджрд░реНрдн рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВред
рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреЗ
рд╡реИрд╕реЗ, рдЕрдЧрд░ рдЖрдкрдиреЗ [A, B].map(useContext)
рдЬреИрд╕реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реБрдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рддреЛ рдЖрдкрдиреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реЛрдЧрд╛;;
рд╣реЗ рджрд╛рди! рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (: рдмрд╕ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ред
btw: useContext
( useStorage
рдорд╛рдзреНрдпрдо рд╕реЗ) App
, рдЬреЛ _is_ рдХреЗ рдЕрдВрджрд░ Provider
ReactDOM.render
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИред (рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдЗрд╕ рдШреЛрдВрд╕рд▓реЗ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИ)ред
рд╕рдорд╛рдзрд╛рди :
рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рдЙрд╕ quirky .map
рд▓рд╛рдЗрди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ: рдореИрдВрдиреЗ observedBits
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдореБрджреНрджреЛрдВ / PRs рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдЬрдм рд▓рд╛рдЧреВ рд╣реЛ, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред
рдЖрдЖрд╣рд╣ рдпреВ рдЖрд░ рд░рд╛рдЗрдЯ рдореИрдВ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЧрд▓рдд рд╣реВрдБред рд╣рд╛рдБ observedBits
рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рд╣реИред рдПрдХ рдиреБрдХрд╕рд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рднреА рдХрднреА рднреА useContext
рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреА рддрд░рд╣ рдЕрдкрдиреЗ рд▓рдЧ рд░рд╣рд╛ рд╣реИ
useContext
рдХреЙрд▓ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдШрдЯрдХ рдореЗрдВ рд╣реИрдВProvider
ред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╡реЗ рдкреНрд░рджрд╛рддрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдХ) рдХреЗ рдКрдкрд░ рд╕рдВрджрд░реНрдн рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВредрдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреЗ
рд╡реИрд╕реЗ, рдЕрдЧрд░ рдЖрдкрдиреЗ
[A, B].map(useContext)
рдЬреИрд╕реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реБрдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рддреЛ рдЖрдкрдиреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реЛрдЧрд╛;;