
рд╢реБрдн рджрд┐рди, рдЦрд╛рдмрд░реЛрд╡рд╕реНрдХ!
рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдХреБрдЫ "рд╣реБрдХ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реАрдЦрд╛ред рд╡реЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╣рд╛рд▓ рд╣реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП, 6 рдлрд░рд╡рд░реА, 2019 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг [16.8.0] рдореЗрдВ (рдЬреЛ рдХрд┐ рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рд╣реБрдЖ рд╣реИ)
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж , рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрд░реЗрдбрд░ рд╣реБрдХ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рддреБрд░рдВрдд рдЦреБрдж рд╕реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛: "рдпрд╣ рдмрд╛рдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ Redux рдХреЛ рдмрджрд▓ рд╕рдХрддреА рд╣реИ?" рдореИрдВрдиреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдХрдИ рд╢рд╛рдореЗрдВ рдмрд┐рддрд╛рдИрдВ рдФрд░ рдЕрдм рдореИрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдореБрдЭреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде Redux рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП - рддреБрд░рдВрдд рдирд┐рд╖реНрдХрд░реНрд╖
рдкреЗрд╢реЗрд╡рд░реЛрдВ:
- рдЖрдк рдЫреЛрдЯреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ (рдЬрд╣рд╛рдВ рдмрдбрд╝реЗ рд╕рдВрдпреБрдХреНрдд Reducers рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ) Redux рдХреЗ рдмрдЬрд╛рдп рд╣реБрдХ (useContext + useReducer) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Redux рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд░реНрдердХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рдкрдХреНрд╖:
- рдХреЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + Redux рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ рдФрд░ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ (рдЙрдкрдпреЛрдЧрдХрдВрдЯреЗрдХреНрд╕реНрдЯ + рдЙрдкрдпреЛрдЧрд░реЗрдбреНрдпреВрдбрд░) рдореБрдЭреЗ рдЕрдиреБрдкрдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЕрднреА рдХреЗ рд▓рд┐рдПред
- Redux рдПрдХ рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд╣реБрдХ рдПрдХ рдирд╡рд╛рдЪрд╛рд░ рд╣реИ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдирдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
- рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ + рдЙрдкрдпреЛрдЧрд░реЗрдбреНрдпреВрд╕рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЖрдкрдХреЛ рдХреБрдЫ рдмрд╛рдЗрдХ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖ рд▓реЗрдЦрдХ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕рдЪ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдпрджрд┐ рдЖрдк рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреА рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдЖрдЗрдП рдЗрд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ
рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
(Reducer.js)
import React from "react"; export const ContextApp = React.createContext(); export const initialState = { app: { test: 'test_context' } }; export const testReducer = (state, action) => { switch(action.type) { case 'test_update': return { ...state, ...action.payload }; default: return state } };
рдЕрдм рддрдХ, рд╣рдорд╛рд░реЗ reducer рдмрд┐рд▓реНрдХреБрд▓ Redux рдХреА рддрд░рд╣ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ
(App.js)
import React, {useReducer} from 'react' import {ContextApp, initialState, testReducer} from "./reducer.js"; import {IndexComponent} from "./IndexComponent.js" export const App = () => {
(IndexComponent.js)
import React, {useContext} from "react"; import {ContextApp} from "./reducer.js"; export function IndexComponent() {
рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдмрд╕ рдЕрджреНрдпрддрди рдПрдХ рдлреНрд▓реИрдЯ (рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░) reducer рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдбреЗрдЯрд╛ рд▓рд┐рдЦреЗрдВ
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
(Reducer.js)
... export const testReducer = (state, data) => { return { ...state, ...data } ...
(IndexComponent.js)
... return (
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝рд╛ рдФрд░ рд╕рд░рд▓ рдЖрд╡реЗрджрди рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╣реЛрддрд╛ рд╣реИ), рддреЛ рдЖрдк рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрд╢рд╛ рдПрдХреНрд╢рди рд╕реЗ рд╕реАрдзреЗ reducer рдЕрдкрдбреЗрдЯ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдЕрдкрдбреЗрдЯ рдХреА рдХреАрдордд рдкрд░, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдордиреЗ рдХреЗрд╡рд▓ reducer рдореЗрдВ рдирдпрд╛ рдбреЗрдЯрд╛ рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХреЛ рдХрдИ рд╕реНрддрд░реЛрдВ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛?
рдЕрдм рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓
рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
(IndexComponent.js)
... return (
(Reducer.js)
... export const initialState = { tree_1: { tree_2_1: { tree_3_1: 'tree_3_1', tree_3_2: 'tree_3_2' }, tree_2_2: { tree_3_3: 'tree_3_3', tree_3_4: 'tree_3_4' } } }; export const testReducer = (state, callback) => {
рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдкреЗрдбрд╝ рдХреЗ рдЕрджреНрдпрддрди рдХрд╛ рднреА рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЯреЗрд╕реНрдЯрд░реЗрдбрд░ рдХреЗ рдЕрдВрджрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреЗрдбрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рд╕рдм рдХреБрдЫ Redux рдХреА рддрд░рд╣ рд╣реИ, рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрдВрдбрд▓ рдереЛрдбрд╝рд╛ рдЫреЛрдЯрд╛ рд╣реИ [8]ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдкреНрд░реЗрд╖рдг
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕рдм рдареАрдХ рд╣реИ? рдпрджрд┐ рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЗрд╖рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ!
(Action.js)
export const actions = { sendToServer: function ({dataForServer}) {
(IndexComponent.js)
const [state, _dispatch] = useReducer(AppReducer, AppInitialState);
рд╕рдм рдХреБрдЫ рдареАрдХ рднреА рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓рдмреИрдХ рд╣реИрдВ , рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХреНрд╢рди рдлрдВрдХреНрд╢рди рдмрдирд╛рдП рдмрд┐рдирд╛ рд░рд╛рдЬреНрдп рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдирд┐рд░реНрдорд╛рдг рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
(IndexComponent.js)
... dispatch( (dispatch) => dispatch(state => { return { {dataForServer: 'data'} } }) ) ...
рдпрд╣ рдХреБрдЫ рдбрд░рд╛рд╡рдирд╛ рд╣реИ, рд╣реИ рдирд╛? рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:
(IndexComponent.js)
... dispatch({dataForServer: 'data'}) ...
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЗрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛
(IndexComponent.js)
const [state, _dispatch] = useReducer(AppReducer, AppInitialState);
рдЕрдм рд╣рдо рдПрдХ рдПрдХреНрд╢рди рдлрдВрдХреНрд╢рди рдФрд░ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рджреЛрдиреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди! рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд░рд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
(IndexComponent.js)
... dispatch({ tree: {
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреНрдпреЛрдВ рдмреБрд░рд╛ рд╣реИ? рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрд┐ рдЗрд╕ рдкреНрд░реЗрд╖рдг рдХреЗ рд╕рдордп рддрдХ, рд░рд╛рдЬреНрдп рдХреЛ рджреВрд╕рд░реЗ рдкреНрд░реЗрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рдЕрднреА рддрдХ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╣рдо рдПрдХ рдкреБрд░рд╛рдиреЗ рд░рд╛рдЬреНрдп рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдЧрд╛ред
рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдРрд╕реА рд╡рд┐рдзрд┐ рд╢рд╛рдпрдж рд╣реА рд╕рд╛рд░реНрдердХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдХреЗрд╡рд▓ рдлреНрд▓реИрдЯ рд░реАрдбреНрдпреВрд╕рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, reducers рд╢рд╛рдпрдж рд╣реА рдХрднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдкрд╛рдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рди рдХрд░реЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
(Action.js)
...
рдирд┐рд╖реНрдХрд░реНрд╖:
- рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдиреБрднрд╡ рдерд╛, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╢реИрдХреНрд╖рдгрд┐рдХ рдЬреНрдЮрд╛рди рдХреЛ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реАрдЦрд╛
- рдореИрдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ (рдХрдо рд╕реЗ рдХрдо рдЕрдЧрд▓реЗ рдЫрд╣ рдорд╣реАрдиреЛрдВ рдореЗрдВ)ред рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП (рдпрд╣ рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдФрд░ Redux рдПрдХ рд╕рд┐рджреНрдз рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЙрдкрдХрд░рдг рд╣реИ) + рдореБрдЭреЗ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рдкреАрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕рдВрдкрд╛рджрдХ рдХреЛ рдЫреЛрдбрд╝ рдХрд░ рдЬреАрдд рд╕рдХрддреЗ рд╣реИрдВ [8]
рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЦрд╝реБрд╢реА рд╣реЛрдЧреА, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд╣реИрдмрд░реЛрдмрд╕реНрддрдЪреЗрд╡рд╛ рдХреЗ рд╕рд╛рдордиреЗ рдХреЗ рднрд╛рдЧ рдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреА рд░рд╛рдп!
рд╕рдВрджрд░реНрдн: