рдЕрдирд╕реНрдЯреИрдЯреЗрдб-рдиреЗрдХреНрд╕реНрдЯ: рдПрдХ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдорд┐рдирд┐рдорд┐рд╕реНрдЯ рд╕реНрдЯреЗрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП 200 рдмрд╛рдЗрдЯреНрд╕

  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ : рдпрд╣ рд╕рдм рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИред
  • ~ 200 рдмрд╛рдЗрдЯреНрд╕ , рдорд┐рди + рдЬреАрдЬреАред
  • рдкрд░рд┐рдЪрд┐рдд рдПрдкреАрдЖрдИ : рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ : рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
  • рдСрдЯреЛрдореИрдЯрд┐рдХ рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ ред

рдореБрдЦреНрдп рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдкреИрдХреЗрдЬ Redux рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ? рдЦреИрд░ ...


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

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг


import React, { useState } from "react" import { createContainer } from "unstated-next" import { render } from "react-dom" function useCounter() { let [count, setCount] = useState(0) let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) return { count, decrement, increment } } let Counter = createContainer(useCounter) function CounterDisplay() { let counter = Counter.useContainer() return ( <div> <button onClick={counter.decrement}>-</button> <span>{counter.count}</span> <button onClick={counter.increment}>+</button> </div> ) } function App() { return ( <Counter.Provider> <CounterDisplay /> <CounterDisplay /> </Counter.Provider> ) } render(<App />, document.getElementById("root")) 

рдЕрдиреАрддрд┐ рдХреЗ рдкреНрд░рддрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг


рдореИрдВ (рдЬреЗрдореА рдХрд╛рдЗрд▓ - рд▓рдЧрднрдЧред) рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рдХреЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реВрдВ ред рдореИрдВрдиреЗ рдЕрдирд╕реНрдЯреИрдЯ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдерд╛ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдиреЗ рд╣реА рд░рд╛рдЬреНрдп рдХреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░рд╛рдЬреНрдп рдФрд░ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рд▓ рддрдВрддреНрд░ рдХрд╛ рдЕрднрд╛рд╡ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП "рдиреНрдпреВрдирддрдо" рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдирд╕реНрдЯреНрд░реЗрдЯреЗрдб рдмрдирд╛рдпрд╛ред


рд╣реБрдХ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдФрд░ рддрд░реНрдХ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛ рдЧрдИ рд╣реИред рдЗрддрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐, рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЕрдирд╕реНрдЯреНрд░реЗрд╕реНрдб рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдореВрд░реНрдд рдмрди рдЧрдпрд╛ рд╣реИред


рдХрдо рдирд╣реАрдВ , рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдмрд╣реБрдд рдХрдо рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд░реНрдХ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╕рдореБрджрд╛рдп рдХреА рдЬрдбрд╝рддрд╛ рдХреА рдЕрдкрд░реНрдпрд╛рдкреНрдд рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдПрдкреАрдЖрдИ рдЗрд╕ рдХрдореА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред


рдЕрдирд╕реНрдЯреИрдЯреЗрдб рдиреЗрдХреНрд╕реНрдЯ рдпрд╣ рдмрд╣реБрдд рд╣реА рдПрдкреАрдЖрдИ рд╣реИред "рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд░рд╛рдЬреНрдп рдФрд░ рддрд░реНрдХ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ" рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЕрдм рдпрд╣ "рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд░рд╛рдЬреНрдп рдФрд░ рддрд░реНрдХ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ рд╣реИред"


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


рдЕрдЧрд░, рдЕрдирд╕реНрдЯреИрдЯреЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕рд┐рд░реНрдл рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдореИрдВ рдЗрд╕рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реВрдВрдЧрд╛ред рдЕрдкрдиреЗ рдмреНрд▓реЙрдЧ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреЗрдВ! рд╕рдореНрдореЗрд▓рдиреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЛ! рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред


рдЕрдирд╕реНрдЯреИрдЯреЗрдб-рдиреЗрдХреНрд╕реНрдЯ рдЧрд╛рдЗрдб


рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдкрдврд╝рдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВ
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рд▓реЗрдЦрди ред


рддреЛ, рд╣реБрдХ рдХреА рдорджрдж рд╕реЗ рдЖрдк рдЗрд╕ рдШрдЯрдХ рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 function CounterDisplay() { let [count, setCount] = useState(0) let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) return ( <div> <button onClick={decrement}>-</button> <p>You clicked {count} times</p> <button onClick={increment}>+</button> </div> ) } 

рдпрджрд┐ рдШрдЯрдХ рддрд░реНрдХ рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдПрдХ рдЕрд▓рдЧ рдХрд╕реНрдЯрдо рд╣реБрдХ рдореЗрдВ:


 function useCounter() { let [count, setCount] = useState(0) let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) return { count, decrement, increment } } function CounterDisplay() { let counter = useCounter() return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> </div> ) } 

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рдФрд░ рд╕рд┐рд░реНрдл рддрд░реНрдХ рди рд╣реЛ?
рд╕рдВрджрд░реНрдн рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧреА рд╣реИ:


 function useCounter() { let [count, setCount] = useState(0) let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) return { count, decrement, increment } } let Counter = createContext(null) function CounterDisplay() { let counter = useContext(Counter) return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> </div> ) } function App() { let counter = useCounter() return ( <Counter.Provider value={counter}> <CounterDisplay /> <CounterDisplay /> </Counter.Provider> ) } 

рдпрд╣ рдЕрджреНрднреБрдд рдФрд░ рдЕрджреНрднреБрдд рд╣реИ; рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрддрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рддрд╛рдХрд┐ рдПрдкреАрдЖрдИ рдЖрдкрдХреЗ рдЗрд░рд╛рджреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░реЗред


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ createContainer() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рд╛, рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рд╣реБрдХ рдХреЛ "рдХрдВрдЯреЗрдирд░" рдХреЗ рд░реВрдк рдореЗрдВ createContainer() рд╕рдХреЗрдВ, рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреБрд░рдХреБрд░рд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ API рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛред


 import { createContainer } from "unstated-next" function useCounter() { let [count, setCount] = useState(0) let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) return { count, decrement, increment } } let Counter = createContainer(useCounter) function CounterDisplay() { let counter = Counter.useContainer() return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> </div> ) } function App() { return ( <Counter.Provider> <CounterDisplay /> <CounterDisplay /> </Counter.Provider> ) } 

рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдШрдЯрдХ рдкрд╛рда рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:


 - import { createContext, useContext } from "react" + import { createContainer } from "unstated-next" function useCounter() { ... } - let Counter = createContext(null) + let Counter = createContainer(useCounter) function CounterDisplay() { - let counter = useContext(Counter) + let counter = Counter.useContainer() return ( <div> ... </div> ) } function App() { - let counter = useCounter() return ( - <Counter.Provider value={counter}> + <Counter.Provider> <CounterDisplay /> <CounterDisplay /> </Counter.Provider> ) } 

рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ), рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рднреА рдорд┐рд▓реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХрд╛ рдХрд╕реНрдЯрдо рд╣реБрдХ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред


рдПрдкреАрдЖрдИ


createContainer(useHook)


 import { createContainer } from "unstated-next" function useCustomHook() { let [value, setValue] = useState() let onChange = e => setValue(e.currentTarget.value) return { value, onChange } } let Container = createContainer(useCustomHook) // Container === { Provider, useContainer } 

<Container.Provider>


 function ParentComponent() { return ( <Container.Provider> <ChildComponent /> </Container.Provider> ) } 

Container.useContainer()


 function ChildComponent() { let input = Container.useContainer() return <input value={input.value} onChange={input.onChange} /> } 

useContainer(Container)


 import { useContainer } from "unstated-next" function ChildComponent() { let input = useContainer(Container) return <input value={input.value} onChange={input.onChange} /> } 

рдЯрд┐рдкреНрд╕


рдЯрд┐рдк # 1: рдорд░реНрдЬрд┐рдВрдЧ рдХрдВрдЯреЗрдирд░


рдЪреВрдВрдХрд┐ рд╣рдо рдХрд╕реНрдЯрдо рд╣реБрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдиреНрдп рд╣реБрдХ рдХреЗ рдЕрдВрджрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


 function useCounter() { let [count, setCount] = useState(0) let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) return { count, decrement, increment, setCount } } let Counter = createContainer(useCounter) function useResettableCounter() { let counter = Counter.useContainer() let reset = () => counter.setCount(0) return { ...counter, reset } } 

рдЯрд┐рдк # 2: рдЫреЛрдЯреЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реБрдХ рдореЗрдВ рдирдП рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВ, рдФрд░ рд░рд╛рдЬреНрдп рдХреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рджреЗрдВред


 function useCount() { return useState(0) } let Count = createContainer(useCount) function useCounter() { let [count, setCount] = Count.useContainer() let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) let reset = () => setCount(0) return { count, decrement, increment, reset } } 

рдЯрд┐рдк # 3: рдШрдЯрдХ рдЕрдиреБрдХреВрд▓рди


unstated-next рд▓рд┐рдП рдХреЛрдИ рдЕрд▓рдЧ "рдЕрдиреБрдХреВрд▓рди" рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред


1) рдШрдЯрдХреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рднрд╛рд░реА рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рдиред


рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


 function CounterDisplay() { let counter = Counter.useContainer() return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> <div> <div> <div> <div>   </div> </div> </div> </div> </div> ) } 

рдХреЗ рдмрд╛рдж:


 function ExpensiveComponent() { return ( <div> <div> <div> <div>   </div> </div> </div> </div> ) } function CounterDisplay() { let counter = Counter.useContainer() return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> <ExpensiveComponent /> </div> ) } 

2) рдЙрдкрдпреЛрдЧрдореЗрдореЛ () рд╣реБрдХ рдХреЗ рд╕рд╛рде рднрд╛рд░реА рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди


рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


 function CounterDisplay(props) { let counter = Counter.useContainer() //    ,   `counter` тАФ   let expensiveValue = expensiveComputation(props.input) return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> </div> ) } 

рдХреЗ рдмрд╛рдж:


 function CounterDisplay(props) { let counter = Counter.useContainer() //    ,     let expensiveValue = useMemo(() => { return expensiveComputation(props.input) }, [props.input]) return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> </div> ) } 

3) React.memo () рдФрд░ useCallback () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрди: рд░реЗрдВрдбрд░рд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВ


рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


 function useCounter() { let [count, setCount] = useState(0) let decrement = () => setCount(count - 1) let increment = () => setCount(count + 1) return { count, decrement, increment } } let Counter = createContainer(useCounter) function CounterDisplay(props) { let counter = Counter.useContainer() return ( <div> <button onClick={counter.decrement}>-</button> <p>You clicked {counter.count} times</p> <button onClick={counter.increment}>+</button> </div> ) } 

рдХреЗ рдмрд╛рдж:


 function useCounter() { let [count, setCount] = useState(0) let decrement = useCallback(() => setCount(count - 1), [count]) let increment = useCallback(() => setCount(count + 1), [count]) return { count, decrement, increment } } let Counter = createContainer(useCounter) let CounterDisplayInner = React.memo(props => { return ( <div> <button onClick={props.decrement}>-</button> <p>You clicked {props.count} times</p> <button onClick={props.increment}>+</button> </div> ) }) function CounterDisplay(props) { let counter = Counter.useContainer() return <CounterDisplayInner {...counter} /> } 

unstated рд╕рд╛рде рдкреНрд░рд╡рд╛рд╕


рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдкреВрд░реНрдг рдПрдкреАрдЖрдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рджреЛрдиреЛрдВ рдкреИрдХреЗрдЬ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рдВрдХреНрд░рдордг рдХреЗ рдЕрдкрдиреЗ рдЗрдВрдкреНрд░реЗрд╢рди рдХреЛ unstated-next рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдореЗрд░реА рдпреЛрдЬрдирд╛ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╣реИ:


  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ unstated-next unstated рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ unstated рд▓рд┐рдП unstated-next рд▓рд┐рдП рдкрд▓рд╛рдпрди рдХреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред

рд╢рд╛рдпрдж рдореИрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреА рдпрд╛ рдирдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреБрдЫ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред unstated-next , рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЛрдбрд╝реЗ рдЧрдП рдПрдкреАрдЖрдИ рдпрдерд╛рд╕рдВрднрд╡ рдиреНрдпреВрдирддрдо рд╣реЛрдВрдЧреЗ, рдФрд░ рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЫреЛрдЯрд╛ рд░рдЦрдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред


рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рд╢рд╛рдпрдж рдПрдХ рдирдП рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ unstated-next рдХреЛрдб рдХреЛ рд╡рд╛рдкрд╕ unstated-next рджреВрдВрдЧрд╛ред unstated-next рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЙрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ unstated@2 рдФрд░ unstated-next рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдлрд┐рд░, рдЬрдм рдЖрдк рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк unstated@3 рдкрд░ unstated@3 рдЕрдкрдЧреНрд░реЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ unstated-next (рдмреЗрд╢рдХ, рд╕рднреА рдЗрдВрдкреЛрд░реНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реБрдП ... рдХрд╛рдлреА рд╕рд░реНрдЪ рдФрд░ рд░рд┐рдкреНрд▓реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдПрдкреАрдЖрдИ рдореЗрдВ рдирд╛рдЯрдХреАрдп рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдкреНрд░рд╡рд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреА рд╣реИред


рд╕рдВрджрд░реНрдн


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


All Articles