Vue рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ

Vue рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ Vue рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИ - main.js рдлрд╝рд╛рдЗрд▓ред рд╡рд╣рд╛рдВ, Vue рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЗ рд╕рднреА рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ (рдирд┐рд░реНрджреЗрд╢, рдШрдЯрдХ, рдкреНрд▓рдЧрдЗрдиреНрд╕) рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрдпрд╛рдд рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИред рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдмрди рдЬрд╛рддреА рд╣реИ, рдЬреЛ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реЛрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИред
рдпрд╣ рд▓реЗрдЦ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред



рдЗрд╕реЗ рдЦреБрдж рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ?


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

рдкреНрд░реЗрд░рдХ


рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрдЧрдарди рдХреЗ рдЖрдпреЛрдЬрдХ Nuxt рдереЗред рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ Vue рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
Nuxt рдореЗрдВ рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдлреАрдЪрд░ рд╣реИ- рдкреНрд▓рдЧрдЗрдиреНрд╕ред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдФрд░ рд╕рд╛рде рд╣реА рдкреВрд░реЗ рд╕реНрдЯреЛрд░ рдкрд░ Vue рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдПрдХ рдЕрддреНрдпрдВрдд рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛, inject рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрд╣ Vue рдХреЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдФрд░ store рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рднрдВрдбрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрднрд░рддрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред

рдпрд╣ рдХрд╣рд╛рдВ рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИ?


рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ main.js рдХрд╛рдлреА рд╡рдЬрди рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЖрдкрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрдпрд╛рдд рдХреЗ рдмрд┐рдирд╛ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓реЗрдЧрд╛ред

рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рдЙрджрд╛рд╣рд░рдг рд╡реАрдпреВ-рд░рд╛рдЙрдЯрд░ рд╣реИ ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдмрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд░реНрддрдорд╛рди рдорд╛рд░реНрдЧ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдореЗрдВ рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдП? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рдХрд╛ рд░рд╛рдЬреНрдп рднреА рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ , рдкреНрд░рддрд┐рдХреНрд╖рдг ред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЖрдЧреЗ $wait рд╡реЗрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рди рдХреЗрд╡рд▓ Vue рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛, рдмрд▓реНрдХрд┐ vuex рд╕реНрдЯреЛрд░ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ред рдкреНрд▓рдЧрдЗрди рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдХрдИ рдШрдЯрдХреЛрдВ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рддрддреНрд╡ рдкрд░ рд▓реЛрдбрд░ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ $wait.start('action') рдФрд░ $wait.end('action') рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХреНрд╢рди рдореЗрдВ рд╣реА рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ dispatch('wait/start', 'action' {root: true}) рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рдХрдо dispatch('wait/start', 'action' {root: true}) ред рд╕реНрдЯреЛрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЪреАрдиреА рд╣реИред

рд╢рдмреНрджреЛрдВ рд╕реЗ рд▓реЗрдХрд░ рдХреЛрдб рддрдХ


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрдм рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:
src
- store
- App.vue
- main.js

main.js рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 import Vue from 'vue'; import App from './App.vue'; import store from './store'; new Vue({ render: h => h(App), store }).$mount('#app'); 


рд╣рдо рдкрд╣рд▓реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ


рдЕрдм рд╣рдо axios рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ Nuxt рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдФрд░ src рдореЗрдВ рдПрдХ plugins рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдИред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ index.js рдФрд░ axios.js ред

src
- plugins
-- index.js
-- axios.js
- store
- App.vue
- main.js

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣рдо рд╕реНрдЯреЛрд░ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ inject рдлрд╝рдВрдХреНрд╢рдиред

axios.js
 import axios from 'axios'; export default function (app) { //       тАУ , , interceptors  .. axios.defaults.baseURL = process.env.API_BASE_URL; axios.defaults.headers.common['Accept'] = 'application/json'; axios.defaults.headers.post['Content-Type'] = 'application/json'; axios.interceptors.request.use(config => { ... return config; }); } 

index.js :
 import Vue from 'vue'; import axios from './axios'; export default function (app) { let inject = () => {}; //   inject,        Dependency Injection axios(app, inject); //       Vue    } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, index.js рдлрд╝рд╛рдЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИред рдпрд╣ app рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм main.js рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред

main.js :
 import Vue from 'vue'; import App from './App.vue'; import store from './store'; import initPlugins from './plugins'; //    // ,    Vue,  ,     initPlugins const app = { render: h => h(App), store }; initPlugins(app); new Vue(app).$mount('#app'); //   initPlugins    


рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдордиреЗ рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдкреНрд▓рдЧрдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ main.js рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рд╣реИред

рд╡реИрд╕реЗ, рд╣рдорд╛рд░реЗ рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП app рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдХреЗ рдЕрдВрджрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдЯреЛрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХреЙрд▓ commit , dispatch рдХреЗ рд╕рд╛рде-рд╕рд╛рде store.state рдФрд░ store.getters рддрдХ рдкрд╣реБрдБрдЪ store.state рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк ES6- рд╢реИрд▓реА рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

axios.js
 import axios from 'axios'; export default function ({store: {dispatch, commit, state, getters}}) { ... } 

рджреВрд╕рд░рд╛ рдЪрд░рдг - рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди


рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд▓рдЧрдЗрди рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

src
- plugins
-- index.js
-- axios.js
- store
- App.vue
- main.js

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

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

рдкреНрд▓рдЧрдЗрди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ


plugins рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ - wait.js

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ vuex рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ wait рднреА рдХрд╣рд╛ рд╣реИред рд╡рд╣ рддреАрди рд╕рд░рд▓ рдХрджрдо рдХрд░рддрд╛ рд╣реИ:

- start - action рдХреА рд╕реНрдЯреЗрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ action рдЯреВ рд╕реЗрдЯ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ true
- end - рд░рд╛рдЬреНрдп рд╕реЗ рд╣рдЯрд╛рддрд╛ рд╣реИ рдПрдХ action рдирд╛рдордХ рд╡рд╕реНрддреБ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐
- is - рд░рд╛рдЬреНрдп рд╕реЗ action рдирд╛рдордХ рдПрдХ рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ action

рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

wait.js
 export default function ({store: {dispatch, getters}}, inject) { const wait = { start: action => dispatch('wait/start', action), end: action => dispatch('wait/end', action), is: action => getters['wait/waiting'](action) }; inject('wait', wait); } 


рдФрд░ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХрдиреЗрдХреНрдЯ:

index.js :
 import Vue from 'vue'; import axios from './axios'; import wait from './wait'; export default function (app) { let inject = () => {}; Injection axios(app, inject); wait(app, inject); } 


рдХрд╛рд░реНрдп рдЗрдВрдЬреЗрдХреНрд╖рди


рдЕрдм рд╣рдо inject рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
 //   2 : // name тАУ ,       this.  ,   Vue        Dependency Injection // plugin тАУ ,       this.  ,  ,           let inject = (name, plugin) => { let key = `$${name}`; //      app[key] = plugin; //     app app.store[key] = plugin; //     store //  Vue.prototype Vue.use(() => { if (Vue.prototype.hasOwnProperty(key)) { return; } Object.defineProperty(Vue.prototype, key, { get () { return this.$root.$options[key]; } }); }); }; 


Vue.prototype рдХрд╛ рдЬрд╛рджреВ


рдЕрдм рдЬрд╛рджреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред Vue рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ Vue.prototype.$appName = ' '; рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ Vue.prototype.$appName = ' '; рдФрд░ $appName рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЧреБрдЧреНрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдиреЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓реЗрдЦрдХреЛрдВ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред

рд╡реИрд╢реНрд╡рд┐рдХ рдорд┐рд╢реНрд░рдг


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ vue-wait plugin рдХреЛрдб рдХреЛ рджреЗрдЦрд╛ред рд╡реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

 Vue.mixin({ beforeCreate() { const { wait, store } = this.$options; let instance = null; instance.init(Vue, store); // inject to store this.$wait = instance; // inject to app } }); 

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

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЕрдЧрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк?


inject рдлрд╝рдВрдХреНрд╢рди inject рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдорд╛рдзрд╛рди рдХреЗ рдкреАрдЫреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ Nuxt рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдорд┐рд╢реНрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рдмрд╕ рдЧрдпрд╛ред

  Vue.use(() => { // ,        if (Vue.prototype.hasOwnProperty(key)) { return; } //    ,         app  Object.defineProperty(Vue.prototype, key, { get () { return this.$root.$options[key]; //  ,    this } }); }); 


рдкрд░рд┐рдгрд╛рдо


рдЗрди рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИ this.$wait рдХрд┐рд╕реА рднреА рдШрдЯрдХ рд╕реЗ this.$wait , рд╕рд╛рде рд╣реА рд╕реНрдЯреЛрд░ рдореЗрдВ рдХреЛрдИ рднреА рд╡рд┐рдзрд┐ред

рдХреНрдпрд╛ рд╣реБрдЖ?


рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛:

src
- plugins
-- index.js
-- axios.js
-- wait.js
- store
- App.vue
- main.js


index.js :
 import Vue from 'vue'; import axios from './axios'; import wait from './wait'; export default function (app) { let inject = (name, plugin) => { let key = `$${name}`; app[key] = plugin; app.store[key] = plugin; Vue.use(() => { if (Vue.prototype.hasOwnProperty(key)) { return; } Object.defineProperty(Vue.prototype, key, { get () { return this.$root.$options[key]; } }); }); }; axios(app, inject); wait(app, inject); } 


wait.js
 export default function ({store: {dispatch, getters}}, inject) { const wait = { start: action => dispatch('wait/start', action), end: action => dispatch('wait/end', action), is: action => getters['wait/waiting'](action) }; inject('wait', wait); } 


axios.js
 import axios from 'axios'; export default function (app) { axios.defaults.baseURL = process.env.API_BASE_URL; axios.defaults.headers.common['Accept'] = 'application/json'; axios.defaults.headers.post['Content-Type'] = 'application/json'; } 


main.js :
 import Vue from 'vue'; import App from './App.vue'; import store from './store'; import initPlugins from './plugins'; const app = { render: h => h(App), store }; initPlugins(app); new Vue(app).$mount('#app'); 

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ main.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдЖрдпрд╛рдд рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдорд┐рд▓рд╛ред рдФрд░ рдЕрдм рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИред

рдПрдХ рдирдпрд╛ рдкреНрд▓рдЧрдЗрди рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИ, рдЗрд╕реЗ index.js рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред

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

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рд╕рдлрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ!

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


All Articles