
рдЖрдЗрдП рдирдП рджреЛрд╕реНрдд рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдФрд░ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рджреЛрд╕реНрддреЛрдВ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдФрд░ рдПрдЪрдУрд╕реА (рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдШрдЯрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдирдпрд╛ рджреЛрд╕реНрдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рджреЛ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред
рдЬреАрд╡рди рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд░рд╣реА рд╣реИред рдлрд░рд╡рд░реА 2019 рдореЗрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ 16.8.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдПред рдЕрдм рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЖрдк рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдХреЛ рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рд╣рдореЗрд╢рд╛ рдпрд╣ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред
рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЕрдВрддрддрдГ рдПрдЪрдУрд╕реА рдФрд░ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдЬреИрд╕реЗ рдкреИрдЯрд░реНрди рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди, рдЙрдирдХреЗ рдЦрд┐рд▓рд╛рдл рдХрдИ рджрд╛рд╡реЗ рдЬрдорд╛ рд╣реБрдП рд╣реИрдВ:
рдирд┐рд░рд╛рдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ (рдпрд╛ рд╢рд╛рдпрдж рдмрджрддрд░) рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рд╣реИред рд╣рдо 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 ()ред рд╣рдо рдкреНрд░реЗрд╖рдг рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдлрд▓рддрд╛ рдФрд░ рддреНрд░реБрдЯрд┐, рдмрджрд▓рддреЗ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдШрдЯрдХ рдХреЛ рд░рд╛рдЬреНрдп рд╡рд╛рдкрд╕ рдХрд░реЗрдВред рдФрд░ рдЖрдЧреНрд░рд╣ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ рдЕрдЧрд░ рдпреВрдЖрд░рдПрд▓ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдШрдЯрдХ рдХреЛ рдбреЛрдо рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреЗ рд╣реИрдВ:
рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЖрдкрдХреЛ рдХрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдХ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рддрдереНрдп рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдХ рдирдП рдкреНрд░рддрд┐рдорд╛рди рдкрд░ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреА рд╣реЛрдЧреАред
рдЬрдм рдШрдЯрдХ рдЬреАрд╡рди рдЪрдХреНрд░реЛрдВ рдХреЗ рдирд╛рдо рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИред рд╕реНрдХреНрд░реАрди рдкрд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдорд╛рдЙрдВрдЯ), рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдкреНрд░реЙрдкрд░.рд╕реБрд░рд▓ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдкрд┐рдЫрд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдШрдЯрдХрдбрд┐рдкрдбреЗрдЯ), рдЕрдЧрд░ рдШрдЯрдХ рдХреЛ рдбреЛрдо рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдиреБрд░реЛрдз (рдХрдВрдкреЛрдиреЗрдВрдЯрд╡реНрдпреВрд▓реЗрдирдЯрд╛рдЙрди) рд░рджреНрдж рдХрд░ рджреЗрдВред ред
рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рд╕реАрдзреЗ рд░реЗрдВрдбрд░ рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕рд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрдВрдж рдХрд░реЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реЗрдВрдбрд░ рдореЗрдВ рдирд╣реАрдВред рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдХреЗ рдмрд╛рдж рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛, рдпрд╛ рдирдП рдбреЛрдо рдХреЛ рдкреНрд░рддрд┐рдмрджреНрдз рдФрд░ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдХреЗ рдмрд╛рдж рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдкрд░ рдФрд░ 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, рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдирдП рдЕрд╡рддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рд┐рдЦрдирд╛ рдерд╛:
- рдкрд┐рдЫрд▓реЗ рдФрд░ рдирдП requestId рдФрд░ isFetching рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛
- рджреЛ рд╕рдордп рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдордзреНрдпрд╛рдВрддрд░
- рд╡рд░реНрдЧ рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЖрдИрдбреА рдЬреЛрдбрд╝реЗрдВ
рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдЖрдкрдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рдереЗ рдФрд░ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
4) рдЖрдЧреЗ рдХреНрдпрд╛?
рд╣рдо рдЕрдкрдиреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрд╡реЗрд░реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдирд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛, рдХрд┐рд╕реА рднреА рдмрдбрд╝реЗ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рдЬрдмрд░рди рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рд╣рдордиреЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ (рдзреНрдпрд╛рди!) рдШрдЯрдХ рдореЗрдВ рдирд┐рдХрд╛рд▓ рд▓рд┐рдпрд╛ рд╣реИред рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рдерд╛ред рд▓реЗрдХрд┐рди рд╣реБрдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рд╣рдо рдлрд╝рдВрдХреНрд╢рди (рдпреВрдПрдХреНрд╕рдСрдХреНрд╕рдСрд░реНрдЧреЗрд╕реНрдЯреЗрд╕реНрдЯ) рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рдмрдЧ рднреА рдкрд╛рдП рдЧрдП рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред