React: рд╣реБрдХ: useContext рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдирд╣реАрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдЬрдире░ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рд▓рдЧрддрд╛ рд╣реИ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ ред ЁЯШХ

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рддрд╛ рдФрд░ useContext рд╣реБрдХ рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЕрдкрдбреЗрдЯ рдЦрд╛рд░рд┐рдЬ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рдЬрдм рднреА value рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ, рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд░рд┐рдПрдХреНрдЯ рдХреЗ рдХреМрди рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдХреМрди рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ / OS рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИрдВ?

  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ : 18.8.0-alpha.1 ( 16.7.0-alpha.0 рдкрд░ рднреА рдкреБрдирд░реБрддреНрдкрд╛рджрд┐рдд)
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░ : chrome 71
  • рдУрдПрд╕ : macOS рд╕рд┐рдПрд░рд╛

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА

рд╕реНрдерд╛рдиреАрдп рдХрдиреЗрдХреНрд╢рди "рдХрдиреЗрдХреНрд╢рди" рдХреА рд╕рдлрд╛рдИ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП,
рдореИрдВрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ 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


hlcecpq

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВрдиреЗ рдХреЛрдбреИрдВрдбрдмреЙрдХреНрд╕ [3] рдкрд░ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбреЗрдореЛ рдбрд╛рд▓рд╛ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреА рддрд░рд╣ рдЕрдкрдиреЗ рд▓рдЧ рд░рд╣рд╛ рд╣реИ useContext рдХреЙрд▓ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдШрдЯрдХ рдореЗрдВ рд╣реИрдВ Provider ред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╡реЗ рдкреНрд░рджрд╛рддрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдХ) рдХреЗ рдКрдкрд░ рд╕рдВрджрд░реНрдн рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВред

рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреЗ

рд╡реИрд╕реЗ, рдЕрдЧрд░ рдЖрдкрдиреЗ [A, B].map(useContext) рдЬреИрд╕реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реБрдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рддреЛ рдЖрдкрдиреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реЛрдЧрд╛;;

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдХреЛрдбреИрдВрдбрдмреЙрдХреНрд╕ [3] рдкрд░ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбреЗрдореЛ рдбрд╛рд▓рд╛ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреА рддрд░рд╣ рдЕрдкрдиреЗ рд▓рдЧ рд░рд╣рд╛ рд╣реИ useContext рдХреЙрд▓ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдШрдЯрдХ рдореЗрдВ рд╣реИрдВ Provider ред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╡реЗ рдкреНрд░рджрд╛рддрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдХ) рдХреЗ рдКрдкрд░ рд╕рдВрджрд░реНрдн рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВред

рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреЗ

рд╡реИрд╕реЗ, рдЕрдЧрд░ рдЖрдкрдиреЗ [A, B].map(useContext) рдЬреИрд╕реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реБрдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рддреЛ рдЖрдкрдиреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реЛрдЧрд╛;;

рд╣реЗ рджрд╛рди! рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (: рдмрд╕ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ред

btw: useContext ( useStorage рдорд╛рдзреНрдпрдо рд╕реЗ) App , рдЬреЛ _is_ рдХреЗ рдЕрдВрджрд░ Provider ReactDOM.render рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИред (рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдЗрд╕ рдШреЛрдВрд╕рд▓реЗ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИ)ред


рд╕рдорд╛рдзрд╛рди :

рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рдЙрд╕ quirky .map рд▓рд╛рдЗрди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ: рдореИрдВрдиреЗ observedBits рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдореБрджреНрджреЛрдВ / PRs рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдЬрдм рд▓рд╛рдЧреВ рд╣реЛ, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред

рдЖрдЖрд╣рд╣ рдпреВ рдЖрд░ рд░рд╛рдЗрдЯ рдореИрдВ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЧрд▓рдд рд╣реВрдБред рд╣рд╛рдБ observedBits рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рд╣реИред рдПрдХ рдиреБрдХрд╕рд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рднреА рдХрднреА рднреА useContext рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MoOx picture MoOx  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kocokolo picture kocokolo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

UnbearableBear picture UnbearableBear  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ