рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ, рдПрдЪрдУрд╕реА рдпрд╛ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз


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


рдЬреАрд╡рди рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд░рд╣реА рд╣реИред рдлрд░рд╡рд░реА 2019 рдореЗрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ 16.8.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдПред рдЕрдм рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЖрдк рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдХреЛ рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рд╣рдореЗрд╢рд╛ рдпрд╣ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред


рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЕрдВрддрддрдГ рдПрдЪрдУрд╕реА рдФрд░ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдЬреИрд╕реЗ рдкреИрдЯрд░реНрди рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди, рдЙрдирдХреЗ рдЦрд┐рд▓рд╛рдл рдХрдИ рджрд╛рд╡реЗ рдЬрдорд╛ рд╣реБрдП рд╣реИрдВ:


RPropрд╣реЙрдХ
1. рдХрдИ рд░реИрдкрд░ рдШрдЯрдХ рдЬрд┐рдиреНрд╣реЗрдВ рд░рд┐рдПрдХреНрдЯ рджреЗрд╡рдЯреВрд▓ рдФрд░ рдХреЛрдб рдореЗрдВ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред(тЧХ (тЧХ)(тЧХ (тЧХ)
2. рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рдлреНрд▓реЛ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ)ред(тЧХ (тЧХ)
3. рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдПрдЪрдУрд╕реА рдЬреЛ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред(тЧХ (тЧХ)
4. рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд▓реЗрдЖрдЙрдЯ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ JSX рджреНрд╡рд╛рд░рд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред(тЧХ (тЧХ)
5. рдХреБрдВрдЬреА рдЯрдХреНрдХрд░ рд╕рд╣рд╛рд░рд╛ред рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдкреНрд░реЙрдкреНрд╕ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдЪрдУрд╕реА рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХреБрдВрдЬреА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред(тЧХ (тЧХ)
6. рдЧрд┐рдЯ рднрд┐рдиреНрди рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ JSX рдХреЛ Render Prop рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╕рдордп рд╕рднреА рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред(тЧХ (тЧХ)
7. рдпрджрд┐ рдХрдИ рдПрдЪрдУрд╕реА рд╣реИрдВ, рддреЛ рдЖрдк рд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдЧрд▓рддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╣реА рдЖрджреЗрд╢ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрд░реНрдХ рдПрдЪрдУрд╕реА рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкрд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рдкрд╣рд▓реА рдмрд╛рд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХреГрдд рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рддрдм рд╣рдо рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред(тЧХ (тЧХ)

рдирд┐рд░рд╛рдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ (рдпрд╛ рд╢рд╛рдпрдж рдмрджрддрд░) рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рд╣реИред рд╣рдо Render Prop рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, HOC рдкрд░ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╡реЗ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ рдФрд░ HOC рдореЗрдВ рдЕрдзрд┐рдХ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рдЖрдЗрдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХрдИ рдиреЗ рдЕрдкрдиреЗ рдЬреАрд╡рди рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмреЗрд╣рддрд░ рдФрд░ рдЖрд╕рд╛рди рд╣реИред


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


  • рдбрд╛рдЯрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (isFetching)
  • рдбреЗрдЯрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ (responseData)
  • рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ (рддреНрд░реБрдЯрд┐)
  • рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ, рдпрджрд┐ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓ рдЧрдП рд╣реИрдВ, рдФрд░ рдПрдХ рдирдпрд╛
  • рдпрджрд┐ рдпрд╣ рдШрдЯрдХ DOM рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░рдирд╛

1. рд╕рд░рд▓ рдкрд░рд┐рджреГрд╢реНрдп


рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд┐рддрд┐ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рд░рд┐рдбреНрдпреВрд╕рд░) рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ: рд╕рдлрд▓рддрд╛ / рддреНрд░реБрдЯрд┐ред


Reducer рдХреНрдпрд╛ рд╣реИ?

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдПред Reducer рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрд╛, рдФрд░ Redux рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ JS рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдПрдХ рдРрд╕рд╛ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рд░рд╛рдЬреНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред


const defaultState = { responseData: null, isFetching: true, error: null }; function reducer1(state, action) { switch (action.type) { case "fetched": return { ...state, isFetching: false, responseData: action.payload }; case "error": return { ...state, isFetching: false, error: action.payload }; default: return state; } } 

рд╣рдо рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рд░реЗрдВрдбрд░ рдкреНрд░реЙрдк


 class RenderProp1 extends React.Component { state = defaultState; axiosSource = null; tryToCancel() { if (this.axiosSource) { this.axiosSource.cancel(); } } dispatch(action) { this.setState(prevState => reducer(prevState, action)); } fetch = () => { this.tryToCancel(); this.axiosSource = axios.CancelToken.source(); axios .get(this.props.url, { cancelToken: this.axiosSource.token }) .then(response => { this.dispatch({ type: "fetched", payload: response.data }); }) .catch(error => { this.dispatch({ type: "error", payload: error }); }); }; componentDidMount() { this.fetch(); } componentDidUpdate(prevProps) { if (prevProps.url !== this.props.url) { this.fetch(); } } componentWillUnmount() { this.tryToCancel(); } render() { return this.props.children(this.state); } 

рд░рд┐рдПрдХреНрдЯ рдХрд░реЗрдВ


 const useRequest1 = url => { const [state, dispatch] = React.useReducer(reducer, defaultState); React.useEffect(() => { const source = axios.CancelToken.source(); axios .get(url, { cancelToken: source.token }) .then(response => { dispatch({ type: "fetched", payload: response.data }); }) .catch(error => { dispatch({ type: "error", payload: error }); }); return source.cancel; }, [url]); return [state]; }; 

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


рд╣реБрдХреНрд╕RProp
1. рдХрдо рдХреЛрдбред(тЧСтА┐тЧР)
2. рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ (рдПрдкреАрдЖрдИ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛) рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдШрдЯрдХ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдкрд░ рдирд╣реАрдВ рдлреИрд▓рддрд╛ рд╣реИред(тЧСтА┐тЧР)
3. рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдПрдХ рдЬрдЧрд╣ рдкрд░ред(тЧСтА┐тЧР)
4. рд╕рд░рд▓ рдХреЛрдб рдЬреЛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред(тЧСтА┐тЧР)
5. рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХрд┐рд╕ рдШрдЯрдХ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред(тЧСтА┐тЧР)

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


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


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


рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдХреЗ рдмрд╛рдж рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдкрд░ рдФрд░ url рдмрджрд▓рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рдирдпрд╛ рдкреНрд░рддрд┐рдорд╛рди

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


рдирд┐рд╖реНрдХрд░реНрд╖ - useEffect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдХрдо рд▓рд┐рдЦрдирд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рддред


рдФрд░ рдПрдХ рдФрд░ рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛: useEffect рдкрд┐рдЫрд▓реЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рдж рдФрд░ DOM рд╕реЗ рдШрдЯрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╛рдл рдХрд░ рд╕рдХрддреА рд╣реИред рдЖрд░рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдЯреАрдо рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред


рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред


 const AvatarRenderProp1 = ({ username }) => ( <RenderProp url={`https://api.github.com/users/${username}`}> {state => { if (state.isFetching) { return "Loading"; } if (state.error) { return "Error"; } return <img src={state.responseData.avatar_url} alt="avatar" />; }} </RenderProp> ); 

 const AvatarWithHook1 = ({ username }) => { const [state] = useRequest(`https://api.github.com/users/${username}`); if (state.isFetching) { return "Loading"; } if (state.error) { return "Error"; } return <img src={state.responseData.avatar_url} alt="avatar" />; }; 

рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рд╡рд┐рдХрд▓реНрдк рдлрд┐рд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрддрд╛ рд╣реИред


рд╡рд┐рдкрдХреНрд╖ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк:


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


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


2) рдЕрджреНрдпрддрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдбреЗрдЯрд╛


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


рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


 const Avatar2 = ({ username }) => { ... <button onClick={() => update("https://api.github.com/users/NewUsername")} > Update avatar for New Username </button> ... }; 

рдЪрд▓реЛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВред рдиреАрдЪреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред


 function reducer2(state, action) { switch (action.type) { ... case "update url": return { ...state, isFetching: true, url: action.payload, defaultUrl: action.payload }; case "update url manually": return { ...state, isFetching: true, url: action.payload, defaultUrl: state.defaultUrl }; ... } } 

рд░реЗрдВрдбрд░ рдкреНрд░реЙрдк


 class RenderProp2 extends React.Component { state = { responseData: null, url: this.props.url, defaultUrl: this.props.url, isFetching: true, error: null }; static getDerivedStateFromProps(props, state) { if (state.defaultUrl !== props.url) { return reducer(state, { type: "update url", payload: props.url }); } return null; } ... componentDidUpdate(prevProps, prevState) { if (prevState.url !== this.state.url) { this.fetch(); } } ... update = url => { this.dispatch({ type: "update url manually", payload: url }); }; render() { return this.props.children(this.state, this.update); } } 

рд░рд┐рдПрдХреНрдЯ рдХрд░реЗрдВ


 const useRequest2 = url => { const [state, dispatch] = React.useReducer(reducer, { url, defaultUrl: url, responseData: null, isFetching: true, error: null }); if (url !== state.defaultUrl) { dispatch({ type: "update url", payload: url }); } React.useEffect(() => { тАж(fetch data); }, [state.url]); const update = React.useCallback( url => { dispatch({ type: "update url manually", payload: url }); }, [dispatch] ); return [state, update]; }; 

рдпрджрд┐ рдЖрдкрдиреЗ рдзреНрдпрд╛рди рд╕реЗ рдХреЛрдб рдХреЛ рджреЗрдЦрд╛, рддреЛ рдЖрдкрдиреЗ рджреЗрдЦрд╛:


  • url рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛;
  • defaultUrl рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдХрд┐ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдкреНрд░реЙрдкрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдореЗрдВ props.url рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛;
  • рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬрд┐рд╕реЗ рд╣рдо рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред

рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдХреЗ рд╕рд╛рде рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд░рд╛рдЬреНрдп рдХрд╛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getDerivedStateFromProps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдирдпрд╛ рдЕрдореВрд░реНрдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рддреБрд░рдВрдд рд░реЗрдВрдбрд░ рдореЗрдВ рд░рд╛рдЬреНрдп рдЕрдкрдбреЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╣реБрд░реНрд░реЗ, рдХреЙрдорд░реЗрдбреНрд╕, рдЖрдЦрд┐рд░рдХрд╛рд░!


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


3) рдПрдХ рд╣реА рдЕрдВрддрд░рд╛рд▓ рдпрд╛ рдорддрджрд╛рди рдкрд░ рдПрдкреАрдЖрдИ рдорддрджрд╛рди


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


рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 const AvatarRenderProp3 = ({ username }) => ( <RenderProp url={`https://api.github.com/users/${username}`} pollInterval={1000}> ... 

 const AvatarWithHook3 = ({ username }) => { const [state, update] = useRequest( `https://api.github.com/users/${username}`, 1000 ); ... 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


 function reducer3(state, action) { switch (action.type) { ... case "poll": return { ...state, requestId: state.requestId + 1, isFetching: true }; ... } } 

рд░реЗрдВрдбрд░ рдкреНрд░реЙрдк


 class RenderProp3 extends React.Component { state = { ... requestId: 1, } ... timeoutId = null; ... tryToClearTimeout() { if (this.timeoutId) { clearTimeout(this.timeoutId); } } poll = () => { this.tryToClearTimeout(); this.timeoutId = setTimeout(() => { this.dispatch({ type: 'poll' }); }, this.props.pollInterval); }; ... componentDidUpdate(prevProps, prevState) { ... if (this.props.pollInterval) { if ( prevState.isFetching !== this.state.isFetching && !this.state.isFetching ) { this.poll(); } if (prevState.requestId !== this.state.requestId) { this.fetch(); } } } componentWillUnmount() { ... this.tryToClearTimeout(); } ... 

рд░рд┐рдПрдХреНрдЯ рдХрд░реЗрдВ


 const useRequest3 = (url, pollInterval) => { const [state, dispatch] = React.useReducer(reducer, { ... requestId: 1, }); React.useEffect(() => { тАж(fetch data) }, [state.url, state.requestId]); React.useEffect(() => { if (!pollInterval || state.isFetching) return; const timeoutId = setTimeout(() => { dispatch({ type: "poll" }); }, pollInterval); return () => { clearTimeout(timeoutId); }; }, [pollInterval, state.isFetching]); ... } 

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


рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рд┐рдЦрдирд╛ рдерд╛:


  1. рдкрд┐рдЫрд▓реЗ рдФрд░ рдирдП requestId рдФрд░ isFetching рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛
  2. рджреЛ рд╕рдордп рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдордзреНрдпрд╛рдВрддрд░
  3. рд╡рд░реНрдЧ рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЖрдИрдбреА рдЬреЛрдбрд╝реЗрдВ

рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЖрдкрдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рдереЗ рдФрд░ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред


4) рдЖрдЧреЗ рдХреНрдпрд╛?
рд╣рдо рдЕрдкрдиреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрд╡реЗрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдирд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛, рдХрд┐рд╕реА рднреА рдмрдбрд╝реЗ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рдЬрдмрд░рди рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рд╣рдордиреЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ (рдзреНрдпрд╛рди!) рдШрдЯрдХ рдореЗрдВ рдирд┐рдХрд╛рд▓ рд▓рд┐рдпрд╛ рд╣реИред рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдерд╛ред рд▓реЗрдХрд┐рди рд╣реБрдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рд╣рдо рдлрд╝рдВрдХреНрд╢рди (рдпреВрдПрдХреНрд╕рдСрдХреНрд╕рдСрд░реНрдЧреЗрд╕реНрдЯреЗрд╕реНрдЯ) рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рдмрдЧ рднреА рдкрд╛рдП рдЧрдП рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


All Articles