рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рдореЛрдмрд╛рдЗрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдореЗрдВ рдЕрдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рдерд╛, рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдорд┐рд▓реЗ, рдЬреЛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рдереЗ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рддрдХ рдЙрдирдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ ...
рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рд╕рдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХрдИ рд╣рдлреНрддреЛрдВ рддрдХ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рдореИрдВ iOS рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реМрдЯ рд╕рдХрддрд╛ред рдореИрдВ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (AKA React Native) рдкрд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рд╕реАрдЦреАрдВред
IOS рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдФрд░
ReSwift рдХреА рдЦреЛрдЬ рд╢реБрд░реВ рдХреА, рдпрд╣ Swift рдореЗрдВ
рдлреНрд▓рдХреНрд╕ рдФрд░
Redux рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдФрд░ рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдХрдИ рдмрд╛рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдХреНрд▓реЛрди рдХрд┐рдпрд╛, рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рд╣реИ, рдФрд░ рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдЗрд╕ рд░рд╛рдЬреНрдп рдХреЛ рд╕реБрдирддреЗ рд╣реИрдВред рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрд╡рдпрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддреБрддрд┐ рдШрдЯрдХреЛрдВ рд╕реЗ рдмрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рд╕рднреА
рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди
Reducer рдореЗрдВ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдПред рдЖрдк рд╕рднреА
рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдИ рдЕрдзрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛрдб рдпрд╛ рдХреЙрд▓рд┐рдВрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдирд╣реАрдВ, рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЕрдзрд┐рдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВред рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рдирд╣реАрдВред рдХреЗрд╡рд▓ рдПрдХ
рд░рд╛рдЬреНрдп рд╣реИ , рдФрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рдлрд┐рд░ рдЖрдкрдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддреБрддрд┐ рдШрдЯрдХ (рдФрд░ рдореИрдВ рдЗрд╕ рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ)
рд░рд╛рдЬреНрдп рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдордЬрдмреВрдд рдореЙрдбрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдкрд╣рд▓реЗ, рд▓реЙрдЧрд┐рди рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдХреА рдХрдИ рд▓рд╛рдЗрдиреЛрдВ, рд╡рд┐рднрд┐рдиреНрди рдирд┐рдпрдВрддреНрд░рдг рд░рд╛рдЬреНрдпреЛрдВ, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рдЖрджрд┐ рд╕реЗ рднрд░реЗ рдереЗ ... рдЕрдм рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ)
import UIKit import Base import ReSwift class LoginViewController: UIViewController { @IBOutlet var usernameField: UITextField! @IBOutlet var passwordField: UITextField! override func viewDidLoad() { super.viewDidLoad() store.subscribe(self) {state in state.usersState } } @IBAction func onLoginButton(_ sender: Any) { store.dispatch(AuthenticatePassword(username: usernameField.text!, password: passwordField.text!)) } @IBAction func onTwitterButton(_ sender: Any) { store.dispatch(AuthenticateTwitter()) } @IBAction func onFacebookButton(_ sender: Any) { store.dispatch(AuthenticateFacebook(from: self)) } }
рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдореЗрдВ
рдкреНрд░реЗрд╖рдг рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдирдП рд░рд╛рдЬреНрдп рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдПрдХ рдХреНрд░рд┐рдпрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддреА рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ
FetchUser рдХрд╛рд░реНрд░рд╡рд╛рдИ
(рдЖрдИрдбреА: рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдФрд░ рдПрдХ рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдк рд╕реЗрдЯрдЙрдЬрд╝рд░ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ Reducer рдореЗрдВ рдЕрд╡рд░реЛрдзрди рдХрд░рддреЗ рд╣реИрдВред Reducer рдореЗрдВ, рдЖрдк рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЗ рд╡рд┐рд▓рдп / рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ
рд░рд╛рдЬреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
рд╣реИ , рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП
рд░рд╛рдЬреНрдп рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
struct UsersState { var users: [String: User] = [:] }
рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддреА рд╣реИред
struct FetchUser: Action { init(user: String) { GETRequest(path: "users/\(user)").run { (response: APIResponse<UserJSON>) in store.dispatch(SetUser(user: response.object)) } } }
рдЬреИрд╕реЗ рд╣реА рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдФрд░
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╣рддрд╛
рд╣реИ , рдпрд╣ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд╛рд▓реА рд╣реИ, рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдореЗрдВред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ рдХрд┐ reducer рдХреЛ рд░рд╛рдЬреНрдп рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
struct SetUser: Action { let user: UserJSON? }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рдо
UsersReducer рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
func usersReducer(state: UsersState?, action: Action) -> UsersState { var state = state ?? initialUsersState() switch action { case let action as SetUser: if let user = action.user { state.users[user.id] = User(json: user) } default: break } return state }
рдЕрдм рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдпрд╛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ
suscribe / рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВ, рдФрд░ рдЬрдм рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реЗрдВ рдФрд░ рдирдП рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ!
class UserViewController: UIViewController { var userId: String? { didSet { if let id = userId { store.dispatch(FetchUser(user: id)) } } } var user: User? { didSet { if let user = user { setupViewUser(user: user) } } } override func viewDidLoad() { super.viewDidLoad() store.subscribe(self) {state in state.usersState } } func setupViewUser(user: User) {
рд▓реЗрдХрд┐рди рдЕрдм рдЖрдкрдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП
рд░реАрд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░
рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдП, рдореИрдВ рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧреЗрдо) рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЕрдм рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдмрд╣реБрдд рдХрдЪреНрдЪреЗ рд╡рд┐рдЪрд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЕрднреА рднреА рдЧреНрд▓реЛрд╕ рдкреБрд╕реНрддрдХреЛрдВ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдмрдЪреЗрдВрдЧреЗред рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╕рд╛рдзрд╛рд░рдг
REST рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдЯреЗрдЯ рдХреЗ рдЕрдВрджрд░ рдереЛрдбрд╝рд╛ рдФрд░ рддрд░реНрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдпрд╣ рдЖрдкрдХреЛ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдореВрд▓реНрдп рд╕рдордп рдмрдЪрд╛рдПрдЧрд╛ред рдЖрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрдИ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдФрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд░рд╛рдЬреНрдп рдХреЛ рдмреИрдХрдЕрдк рдХреНрд░рдо рдореЗрдВ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ, рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рдПрдВ, рдЖрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рд╕реНрдкрд╖реНрдЯ, рдХреЗрдВрджреНрд░реАрдХреГрдд рдФрд░ рд╕рд░рд▓ рд╣реИред
Redux рдкреИрдЯрд░реНрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдереЛрдбрд╝реА рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдореИрдВ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╢реБрджреНрдз рдПрдорд╡реАрд╕реА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдЖрдзрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрди рдЖрджрддреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рдЕрдЪреНрдЫреЗ рд╕реЗ рдЕрдзрд┐рдХ рдиреБрдХрд╕рд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЬреИрд╕реЗ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░, рдЕрд▓рд░реНрдЯ рд╡реНрдпреВрдЕрд░, рд░реВрдЯрд┐рдВрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░) рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдХреЗ Redux рдХреЛ рдПрдХ рдХрджрдо рдЖрдЧреЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдпрд╣ рд╕рдм рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
рдФрд░ рдкрд░реАрдХреНрд╖рдг ... рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдм рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕ рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЖрдк рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдирдХрд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд░рд╛рдЬреНрдп рдЖрдкрдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдпрд╣ рднрд╡рд┐рд╖реНрдп рд╣реИред рднрд╡рд┐рд╖реНрдп
Redux рдХреЗ рд▓рд┐рдП рд╣реИ :)