рд╢рдХреНрддрд┐рд╢рд╛рд▓реА Vuex рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдордХрд╕рдж Vue рдХреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░ рдПрдХ рдФрд░ рд▓реЗрдЦ рдерд╛ рдФрд░ рддрджрдиреБрд╕рд╛рд░, Vuex ред рдореЗрд░реЗ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд╣рд╛рдБ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡реЗрдХреНрд╕ рдХрд╛ рдЕрдкрдиреА рддрд░рд╣ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣реЗрдмреНрд░ рдореЗрдВ рдЦреЛрдЬреЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рдиреЗрдЯ рдореЗрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдпрд╣ рдЕрднреА рдХрд┐рд╕реА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ), рдЕрдлрд╕реЛрд╕, рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдпрд╣ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧ рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдмрд╣реБ-рдкреГрд╖реНрда рдореИрдиреБрдЕрд▓ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдкреНрд░рд┐рдп Vue-Ninja, рдПрдХ рдЙрдкрдХрд░рдг рдЬреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИред

vuex рд╕реНрдорд╛рд░реНрдЯ рдореЙрдбреНрдпреВрд▓


рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдордп рдирд╣реАрдВ рд╣реИ: рдЧрд┐рддреВрдм ред

рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде Vuex рднрдВрдбрд╛рд░рдг рдХрд╛ рдкреВрд░реНрдг рдкреНрд░рд╛рд░реВрдк рдХрд╡рд░реЗрдЬ рд╣реИред рджреЛрдиреЛрдВ рдЖрдВрддрд░рд┐рдХ рдФрд░ рд╕реАрдзреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реНрд╡рдпрдВред рдореЙрдбреНрдпреВрд▓ Vuex рдФрд░ vue- class- рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдореБрдЦреНрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ ( @ktsn ) рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╛рдиреА


рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореЗрд░рд╛ рдкрде рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЕрдиреНрдп рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реАрдпреВрдПрдХреНрд╕-рдореЙрдбреНрдпреВрд▓-рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ ) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдиреЗ рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЕрдВрдд рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛрдиреЗ рджрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдЙрдиреНрд╣реЗрдВ рдкрдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ)ред рдореИрдВ vuex- рд╕реНрдорд╛рд░реНрдЯ-рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛ - рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрд╕реА рдХреНрд╖рдг рджрд┐рдЦрд╛рдИ рджреА рдЬрдм рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА) рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЕрдм рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдЖрдВрдЦ рдХреЛ рднрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг


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

рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрдорд╛рдг


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

рд╕реНрдЯреЛрд░ / root.ts

//    import { Getters, Mutations, Actions, Module } from 'vuex-smart-module' //  class RootState { count = 1 } //  //      RootState class RootGetters extends Getters<RootState> { get double() { //      `state` return this.state.count * 2 } get triple() { //       `getters` return this.getters.double + this.state.count } } //  //     ,     RootState class RootMutations extends Mutations<RootState> { increment(payload: number) { //       `state` this.state.count += payload } } //  //     //    ,       ,      class RootActions extends Actions< RootState, RootGetters, RootMutations, RootActions > { incrementAsync(payload: { amount: number; interval: number }) { //      `state`, `getters`, `commit`  `dispatch` return new Promise(resolve => { setTimeout(() => { this.commit('increment', payload.amount) }, payload.interval) }) } } //   export default new Module({ state: RootState, getters: RootGetters, mutations: RootMutations, actions: RootActions }) 

рд╕рдВрдмрдВрдз


/store/index.ts

 import Vue from 'vue' import * as Vuex from 'vuex' import { createStore } from 'vuex-smart-module' import RootStore from './root' Vue.use(Vuex) export const store = createStore( RootStore, { strict: process.env.NODE_ENV !== 'production' } ) 

рдореЙрдбреНрдпреВрд▓


рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдорд┐рдд Vuex рдореЗрдВ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕рдорд╛рди рд╣реИред рдЙрдиреНрд╣реЗрдВ рд░реВрдЯрд╕реНрдЯреЛрд░ рдХреА рдореЙрдбреНрдпреВрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 import FooStore from './modules/foo' /* тАж */ export default new Module({ state: RootState, getters: RootGetters, mutations: RootMutations, actions: RootActions, modules: { FooStore } }) 

рдПрдХ рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

 import Vue from 'vue' //    (      ) // import FooStore from '@/store/modules/foo' import RootStore from '@/store/root' export default Vue.extend({ computed: RootStore.mapGetters(['double']), methods: RootStore.mapActions({ incAsync: 'incrementAsync' }), created() { console.log(this.double) this.incAsync(undefined) } }) 


рдЯрд╛рдЗрдкрд┐рдВрдЧ


рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрдорд┐рдЯ рдФрд░ рдкреНрд░реЗрд╖рдг:
 import { categories } from '@/api' export type Category { attributes: { hasPrice: boolean; icon: string lvl: number name: string slug: string }; id: number } export interface IParams { city_id: number } class AppState { categories: Category[] = [] } /* ... */ class AppMutations extends Mutations<AppState> { setCategories(categories: Category[]) { this.state.categories = categories } } class AppActions extends Actions< AppState, AppGetters, AppMutations, AppActions > { async getCategories({params}: {params: IParams}): Promise<Category[]> { return categories.get({params}).then( ({ data }: { data: Category[] }) => { this.commit("setCategories", data) return data } ) } } 


рд╕реНрд╡рд╛рдЧрдд


рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ ( рд╡реЙрдП-рдкреНрд░реЙрдкрд░реНрдЯреА-рдбреЗрдХреЛрд░реЗрдЯрд░ )


 import { Vue, Component } from "vue-property-decorator" //    (      ) // import FooStore from '@/store/modules/foo' import RootStore from "@/store/root" //  ,   ,      Typescript,     : const Mappers = Vue.extend({ computed: { ...RootStore.mapGetters(["double"]) }, methods: { ...RootStore.mapActions({ incAsync: 'incrementAsync' }) } }); @Component export default class MyApp extends Mappers { created() { console.log(this.double) this.incAsync(undefined) } } 

рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


/store/module/bar.ts

 import { Store } from 'vuex' import { Getters, Actions, Module, Context } from 'vuex-smart-module' //    import FooStore from './foo' /* тАж */ class BarGetters extends Getters { //   foo!: Context<typeof FooStore>; //     $init(store: Store<any>): void { //     this.foo = FooStore.context(store) } get excited(): string { return this.foo.state.value + '!' // -> hello! } } /* тАж */ 

рд╡реЙрд▓реНрдЯ рд░реАрд╕реЗрдЯ


рдХрднреА-рдХрднреА рднрдВрдбрд╛рд░рдг рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 class FooState { /* ... */ } class FooMutations extends Mutations<FooState> { reset () { const s = new FooState() Object.keys(s).forEach(key => { this.state[key] = s[key] }) } } 

рдЕрдиреНрдд


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЛ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдерд╛ред рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЕрдЧрд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдиреЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд░рдВрдЯ рдЪрд╛рд▓реВ рд╣реЛ?) рдЖрдк, рдореЗрд░реА рддрд░рд╣, рд╡реЗрдХреНрд╕-рд╕реНрдорд╛рд░реНрдЯ-рдореЙрдбреНрдпреВрд▓ (рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗ? рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╕рдВрдХреНрд░рдордг рдмрд▓реНрдХрд┐ рджрд░реНрджрдирд╛рдХ рдерд╛ (1.5-2 рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо 3-4 рдмрд╛рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдЧрд▓рддрдлрд╣рдореА рд╣реЛ рдЧрдИред рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рдпрд╣ рдЕрд╣рд╕рд╛рд╕ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2-3 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕рдордп, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдк рдЗрд╕реЗ "рдЬрд▓реНрджреА рд╕реЗ рд╕реНрдХреЗрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред" рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░, "рд╕реНрдереИрддрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдЙрдЬреНрдЬреНрд╡рд▓ рдкрдХреНрд╖" рдкрд░ рдХрджрдо рд░рдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рд╢рдХреНрддрд┐ рдФрд░ рд╡реЗ рдЕрдВрддрддрдГ рдХреИрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдирд╛, рдЬреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреЛрдб рдбрд┐рдмрдЧ рдХрд░рдирд╛ (рд╢рд╛рдпрдж рдЙрд╕реА рдореЗрдВ 2- 3 рдмрд╛рд░), рд╕рд╛рде рд╣реА рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХреЗ рд╕рдорд░реНрдерди рдХреА рд╕реБрд╡рд┐рдзрд╛ред

PS рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╕реНрдЯрд╛рд░ рд▓рдЧрд╛рдирд╛ рди рднреВрд▓реЗрдВред :)

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

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


All Articles