рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдордХрд╕рдж
Vue рдХреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░
рдПрдХ рдФрд░ рд▓реЗрдЦ рдерд╛
рдФрд░ рддрджрдиреБрд╕рд╛рд░,
Vuex ред рдореЗрд░реЗ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд╣рд╛рдБ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡реЗрдХреНрд╕ рдХрд╛ рдЕрдкрдиреА рддрд░рд╣ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣реЗрдмреНрд░ рдореЗрдВ рдЦреЛрдЬреЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рдиреЗрдЯ рдореЗрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдпрд╣ рдЕрднреА рдХрд┐рд╕реА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ), рдЕрдлрд╕реЛрд╕, рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдпрд╣ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧ рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдмрд╣реБ-рдкреГрд╖реНрда рдореИрдиреБрдЕрд▓ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдкреНрд░рд┐рдп Vue-Ninja, рдПрдХ рдЙрдкрдХрд░рдг рдЬреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИред
vuex рд╕реНрдорд╛рд░реНрдЯ рдореЙрдбреНрдпреВрд▓
рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдордп рдирд╣реАрдВ рд╣реИ:
рдЧрд┐рддреВрдм ред
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде Vuex рднрдВрдбрд╛рд░рдг рдХрд╛ рдкреВрд░реНрдг рдкреНрд░рд╛рд░реВрдк рдХрд╡рд░реЗрдЬ рд╣реИред рджреЛрдиреЛрдВ рдЖрдВрддрд░рд┐рдХ рдФрд░ рд╕реАрдзреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реНрд╡рдпрдВред рдореЙрдбреНрдпреВрд▓
Vuex рдФрд░
vue- class- рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдореБрдЦреНрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ (
@ktsn ) рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд╛рдиреА
рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореЗрд░рд╛ рдкрде рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЕрдиреНрдп рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╡реАрдпреВрдПрдХреНрд╕-рдореЙрдбреНрдпреВрд▓-рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ ) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдиреЗ рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЕрдВрдд рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛрдиреЗ рджрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдЙрдиреНрд╣реЗрдВ рдкрдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ)ред рдореИрдВ
vuex- рд╕реНрдорд╛рд░реНрдЯ-рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдерд╛ - рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрд╕реА рдХреНрд╖рдг рджрд┐рдЦрд╛рдИ рджреА рдЬрдм рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА) рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЕрдм рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдЖрдВрдЦ рдХреЛ рднрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдкрд╛рд╕ рдЕрдЪреНрдЫреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ рдЬреЛ рдЙрди рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЖрдк рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ (рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЖрдк рд╕рдм рдХреБрдЫ, рдЧреИрд░-рддреБрдЪреНрдЫ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд▓реЗрдЦ рдХреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрддрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, "рдЬреАрд╡рди" рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг, рд╕рд╛рде рд╣реА рдпрд╣ рдХреИрд╕реЗ
рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╡рд╣рд╛рдВ рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ)ред
рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрдорд╛рдг
рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рднрдпрд╛рд╡рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд▓реНрджреА рд╕реЗ рдЖрджрдд рд╣реИред
рд╕реНрдЯреЛрд░ / root.ts
рд╕рдВрдмрдВрдз
/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 { 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"
рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
/store/module/bar.ts import { Store } from 'vuex' import { Getters, Actions, Module, Context } from 'vuex-smart-module'
рд╡реЙрд▓реНрдЯ рд░реАрд╕реЗрдЯ
рдХрднреА-рдХрднреА рднрдВрдбрд╛рд░рдг рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
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 рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╕реНрдЯрд╛рд░ рд▓рдЧрд╛рдирд╛ рди рднреВрд▓реЗрдВред :)
рдзрдиреНрдпрд╡рд╛рджрдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рдкреНрдпрд╛рд░реА рдкрддреНрдиреА рдХреЛ рдЙрд╕рдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореЗрдЬ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реБрдЦрдж рд░реВрдВрдмрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрд▓реА, рдЪреБрдкреНрдкреА рдХреЗ рд▓рд┐рдП рдкрдбрд╝реЛрд╕реА, рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП!