рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЖрддреНрдорд╛ рд╣реИред рдпрд╣ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдореЗрдВ рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИред рд╡реЗрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИрдВред Vue.js рдЗрди рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредVue.js рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рдврд╛рдВрдЪрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рджреГрд╢реНрдп рднрд╛рдЧ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ Vue- рдЖрдзрд╛рд░рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Vue.js рдХреА рдорджрдж рд╕реЗ рдФрд░ рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд╕рд╛рде, рдЬрдЯрд┐рд▓ рд╕рд┐рдВрдЧрд▓-рдкреЗрдЬ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдпрд╣ рдЖрд▓реЗрдЦ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд╕рд░рд▓ Vue.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреНрд░рдВрдЯреЗрдВрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИред рдпрд╣рд╛рдВ рдЙрдирдХреЗ рдмреИрдХрдПрдВрдб рдХрд╛ рднрдВрдбрд╛рд░ рд╣реИред рд╣рдо, рд░рд╛рд╕реНрддреЗ рдореЗрдВ, Vue.js рдФрд░ рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдХреБрдЫ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗредрдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдЖрдЗрдП рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдореВрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдмрдирд╛рдПрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред- Vue.js 3 рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ:
vue create notes-app
package.json
рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ :
{
"name": "notes-app",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.19.1",
"buefy": "^0.8.9",
"core-js": "^3.4.4",
"lodash": "^4.17.15",
"marked": "^0.8.0",
"vee-validate": "^3.2.1",
"vue": "^2.6.10",
"vue-router": "^3.1.3"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.1.0",
"@vue/cli-plugin-eslint": "^4.1.0",
"@vue/cli-service": "^4.1.0",
"@vue/eslint-config-prettier": "^5.0.0",
"babel-eslint": "^10.0.3",
"eslint": "^5.16.0",
"eslint-plugin-prettier": "^3.1.1",
"eslint-plugin-vue": "^5.0.0",
"prettier": "^1.19.1",
"vue-template-compiler": "^2.6.10"
}
}
- рдЗрд╕рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
package.json
:
npm install
рдЕрдм, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВредрд░реВрдЯрд┐рдВрдЧ
рд░реВрдЯрд┐рдВрдЧ рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд░рд╛рдЙрдЯрд░ рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Vue.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ vue-router
ред рдпрд╣ Vue.js рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд╛рдЙрдЯрд░ рд╣реИред рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ:- рдиреЗрд╕реНрдЯреЗрдб рдорд╛рд░реНрдЧ / рджреГрд╢реНрдпред
- рд░рд╛рдЙрдЯрд░ рдХрд╛ рдореЙрдбреНрдпреВрд▓рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред
- рдорд╛рд░реНрдЧ рдорд╛рдкрджрдВрдбреЛрдВ, рдЕрдиреБрд░реЛрдзреЛрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪред
- Vue.js. рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдПрдиреАрдореЗрд╢рди
- рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдирд┐рдпрдВрддреНрд░рдгред
- рд╕рдХреНрд░рд┐рдп рд▓рд┐рдВрдХ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
- HTML5-API рдЗрддрд┐рд╣рд╛рд╕, URL рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ IE9 рд╕рдВрдЧрддрддрд╛ рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
- рдЕрдиреБрдХреВрд▓рди рдкреГрд╖реНрда рд╕реНрдХреНрд░реЙрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ред
рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ router
, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдирд╛рдПрдВ index.js
ред рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:import Vue from "vue";
import VueRouter from "vue-router";
import DashboardLayout from "../layout/DashboardLayout.vue";
Vue.use(VueRouter);
const routes = [
{
path: "/home",
component: DashboardLayout,
children: [
{
path: "/notes",
name: "Notes",
component: () =>
import( "../views/Home.vue")
}
]
},
{
path: "/",
redirect: { name: "Notes" }
}
];
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
routes
});
export default router;
рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ routes
рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдСрдмреНрдЬреЗрдХреНрдЯ children
рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рд░реВрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬ рдкрд░ рджрд┐рдЦрд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рдЗрд╕рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ (рдлрд╝рд╛рдЗрд▓ DashboardLayout.vue
) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣рд╛рдБ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ:<template>
<span>
<nav-bar />
<div class="container is-fluid body-content">
<router-view :key="$router.path" />
</div>
</span>
</template>
рдЗрд╕ рдХреЛрдб рдореЗрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреИрдЧ рд╣реИ router-view
ред рдпрд╣ рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдорд╛рд░реНрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╕рднреА рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВредрдШрдЯрдХ рдореВрд▓ рдмрд╛рддреЗрдВ
рдШрдЯрдХ Vue.js рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИрдВред рд╡реЗ рд╣рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбреЛрдо рдкреГрд╖реНрдареЛрдВ рдХреЛ рдХрдИ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдирд╛ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВредрдШрдЯрдХреЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓реЗрдмрд▓ рдФрд░ рдЙрдкрдпреБрдХреНрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:- рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ рдЬреЛ рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдЙрди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдШрдЯрдХ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рди рдбрд╛рд▓реЗрдВ рдЬреЛ рдЗрд╕рдХреА рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВред
- рдХреЗрд╡рд▓ рдЙрд╕ рдХреЛрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд░реНрд╖, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдВрдЧ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред
- рдЙрд╕ рдШрдЯрдХ рдХреЗ рдХреЛрдб рдХреЛ рди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдШрдЯрдХ рдХреЛ рдмрд╛рд╣рд░реА рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рдеред
рдпрд╣рд╛рдВ, рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдШрдЯрдХ NavBar
рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЙрдкрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреЛрдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рд╣реИред рдШрдЯрдХ рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ NavBar.vue
:<template>
<nav class="navbar" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="/home/notes">
<img align="center" src="@/assets/logo.png" width="112" height="28">
</a>
<a
role="button"
class="navbar-burger burger"
aria-label="menu"
aria-expanded="false"
data-target="navbarBasicExample"
>
<span aria-hidden="true" />
<span aria-hidden="true" />
<span aria-hidden="true" />
</a>
</div>
</nav>
</template>
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ DashboardLayout.vue
:<template>
<span>
<nav-bar />
<div class="container is-fluid body-content">
<router-view :key="$router.path" />
</div>
</span>
</template>
<script>
import NavBar from "@/components/NavBar";
export default {
components: {
NavBar
}
};
</script>
<style scoped></style>
рдШрдЯрдХ рдмрд╛рддрдЪреАрдд
рдХрд┐рд╕реА рднреА рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдЪрд┐рдд рд╕рдВрдЧрдарди рдмреЗрд╣рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИредрдШрдЯрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдорд╛рд░реНрдХрдЕрдк рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЛ рдЫреЛрдЯреЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рддреЗ рд╕рдордп, рдбреЗрд╡рд▓рдкрд░ рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рдВрдкрд░реНрдХ рдХрд╛ рд╕рдВрдЧрдарди рд╣реИредVue.js рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрдВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:- рдЧреБрдг (рдкреНрд░реЙрдкреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓ рдШрдЯрдХреЛрдВ рд╕реЗ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- $ Emit () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рд╕реЗ рдореВрд▓ рдШрдЯрдХреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЧреНрд▓реЛрдмрд▓ рдЗрд╡реЗрдВрдЯ рдмрд╕ (EventBus) рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЧрд╣рд░реА рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЬрдм рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрддрд░ рдкрд░, рдкреНрд░рдХрд╛рд╢рдХ / рдЧреНрд░рд╛рд╣рдХ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
Vue.js рдореЗрдВ рдШрдЯрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЛ рдШрдЯрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:- рд╡рд╣ рдШрдЯрдХ
Add
рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред - рдПрдХ
NoteViewer
рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдШрдЯрдХ ред
рдпрд╣рд╛рдБ рдШрдЯрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ Add
( Add.vue
):<template>
<div class="container">
<div class="card note-card">
<div class="card-header">
<div class="card-header-title title">
<div class="title-content">
<p v-if="addMode">
Add Note
</p>
<p v-else>
Update Note
</p>
</div>
</div>
</div>
<div class="card-content">
<div class="columns">
<div class="column is-12">
<template>
<section>
<b-field label="Note Header">
<b-input
v-model="note.content.title"
type="input"
placeholder="Note header"
/>
</b-field>
<b-field label="Description">
<b-input
v-model="note.content.description"
type="textarea"
placeholder="Note Description"
/>
</b-field>
<div class="buttons">
<b-button class="button is-default" @click="cancelNote">
Cancel
</b-button>
<b-button
v-if="addMode"
class="button is-primary"
@click="addNote"
>
Add
</b-button>
<b-button
v-else
class="button is-primary"
@click="updateNote"
>
Update
</b-button>
</div>
</section>
</template>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
addMode: {
type: Boolean,
required: false,
default() {
return true;
}
},
note: {
type: Object,
required: false,
default() {
return {
content: {
title: "",
description: "",
isComplated: false
}
};
}
}
},
methods: {
addNote() {
this.$emit("add", this.note);
},
updateNote() {
this.$emit("update", this.note);
},
cancelNote() {
this.$emit("cancel");
}
}
};
</script>
<style></style>
рдпрд╣рд╛рдБ рдШрдЯрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ NoteViewer
( NoteViewer.vue
):<template>
<div class="container">
<div class="card note-card">
<div class="card-header">
<div class="card-header-title title">
<div class="column is-6">
<p>Created at {{ note.content.createdAt }}</p>
</div>
<div class="column is-6 ">
<div class="buttons is-pulled-right">
<button
v-show="!note.content.isCompleted"
class="button is-success is-small "
title="Mark Completed"
@click="markCompleted"
>
<b-icon pack="fas" icon="check" size="is-small" />
</button>
<button
v-show="!note.content.isCompleted"
class="button is-primary is-small"
title="Edit Note"
@click="editNote"
>
<b-icon pack="fas" icon="pen" size="is-small" />
</button>
<button
class="button is-primary is-small "
title="Delete Note"
@click="deleteNote"
>
<b-icon pack="fas" icon="trash" size="is-small" />
</button>
</div>
</div>
</div>
</div>
<div
class="card-content"
:class="note.content.isCompleted ? 'note-completed' : ''"
>
<strong>{{ note.content.title }}</strong>
<p>{{ note.content.description }}</p>
</div>
</div>
</div>
</template>
<script>
export default {
name: "NoteViewer",
props: {
note: {
type: Object,
required: true
}
},
methods: {
editNote() {
this.$emit("edit", this.note);
},
deleteNote() {
this.$emit("delete", this.note);
},
markCompleted() {
this.$emit("markCompleted", this.note);
}
}
};
</script>
<style></style>
рдЕрдм рдШрдЯрдХ рдмрди рдЧрдП рд╣реИрдВ, рд╣рдо рдЙрдирдХреЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ <script>
редрд╕рд╛рдЗрдЯ props
рдиреЗ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреАред рдпреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рд╣рдо рдШрдЯрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рд╕реА рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдб рдХреЗ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдЬрд╣рд╛рдВ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ $emit()
ред рдЗрд╕рдХреЗ рд╕рд╛рде, рдПрдХ рдмрдЪреНрдЪрд╛ рдШрдЯрдХ рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдореВрд▓ рдШрдЯрдХ рдХреЛ рдбреЗрдЯрд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЖрдЗрдП рдХреИрд╕реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд Add
рдФрд░ NoteViewer
ред рдЖрдЗрдП Home.vue
рдЗрди рдШрдЯрдХреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЗ рдиреАрдЪреЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реЗрдВ:<template>
<div class="container">
<div class="columns">
<div class="column is-12">
<button
class="button is-primary is-small is-pulled-right"
title="Add New Note"
@click="enableAdd()"
>
<b-icon pack="fas" icon="plus" size="is-small" />
</button>
</div>
</div>
<div class="columns">
<div class="column is-12">
<note-editor
v-show="enableAddNote"
:key="enableAddNote"
@add="addNote"
@cancel="disableAdd"
/>
<div v-for="(note, index) in data" :key="index">
<note-viewer
v-show="note.viewMode"
:note="note"
@edit="editNote"
@markCompleted="markCompletedConfirm"
@delete="deleteNoteConfirm"
/>
<note-editor
v-show="!note.viewMode"
:add-mode="false"
:note="note"
@update="updateNote"
@cancel="cancelUpdate(note)"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import NoteEditor from "@/components/Add.vue";
import NoteViewer from "@/components/NoteViewer.vue";
export default {
name: "Home",
components: {
NoteEditor,
NoteViewer
},
data() {
return {
enableAddNote: false,
data: []
};
},
mounted() {
this.getNotes();
},
methods: {
enableAdd() {
this.enableAddNote = true;
},
disableAdd() {
this.enableAddNote = false;
},
async getNotes() {
this.data = [];
const data = await this.$http.get("notes/getall");
data.forEach(note => {
this.data.push({
content: note,
viewMode: true
});
});
},
async addNote(note) {
await this.$http.post("notes/create", note.content);
this.disableAdd();
await this.getNotes();
},
editNote(note) {
note.viewMode = false;
},
async updateNote(note) {
await this.$http.put(`notes/${note.content.id}`, note.content);
note.viewMode = true;
await this.getNotes();
},
cancelUpdate(note) {
note.viewMode = true;
},
markCompletedConfirm(note) {
this.$buefy.dialog.confirm({
title: "Mark Completed",
message: "Would you really like to mark the note completed?",
type: "is-warning",
hasIcon: true,
onConfirm: async () => await this.markCompleted(note)
});
},
async markCompleted(note) {
note.content.isCompleted = true;
await this.$http.put(`notes/${note.content.id}`, note.content);
await this.getNotes();
},
deleteNoteConfirm(note) {
this.$buefy.dialog.confirm({
title: "Delete note",
message: "Would you really like to delete the note?",
type: "is-danger",
hasIcon: true,
onConfirm: async () => await this.deleteNote(note)
});
},
async deleteNote(note) {
await this.$http.delete(`notes/${note.content.id}`);
await this.getNotes();
}
}
};
</script>
рдЕрдм, рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ Add
рдирд╛рдо note-editor
рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдШрдЯрдХ рджреЛ рдмрд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ - рдПрдХ рдиреЛрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реА рдмрд╛рд░ - рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПредрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо NoteViewer
рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рдШрдЯрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ note-viewer
, рдЗрд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рд╕реВрдЪреА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдиреЛрдЯреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддреЗ рд╣реИрдВ v-for
ред рддрддреНрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реАрдПрдХ рдШрдЯрдирд╛ рдкрд░ рдЕрднреА рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп @cancel
рд╣реИ note-editor
, рдЬреЛ рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╣реИ Add
рдФрд░ Update
рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпреЗ рд╕рдВрдЪрд╛рд▓рди рдПрдХ рд╣реА рдШрдЯрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред<!-- Add Task -->
<note-editor v-show="enableAddNote"
:key="enableAddNote"
@add="addNote"
@cancel="disableAdd" />
<!-- Update Task -->
<note-editor v-show="!note.viewMode"
:add-mode="false"
:note="note"
@update="updateNote"
@cancel="cancelUpdate(note)" />
рдЗрд╕ рддрд░рд╣ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рддреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдШрдЯрдХ рдмрд╕ рдЗрд╕реА рдШрдЯрдирд╛ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИредрдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖рддрд╛ :note
рд╕реА note-viewer
редрдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрдм рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредAxios рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдПрдХреНрд╕рд┐рдпреЛрд╕ рд╡рд┐рднрд┐рдиреНрди рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рджрд╛ рдЖрдзрд╛рд░рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИредрдЗрд╕рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдПрдХреНрд╕рд┐рдпреЛ рдПрдХреНрд╕рдЖрд░рдЖрд░рдПрдл рд╣рдорд▓реЛрдВ, рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрд╡рд░реЛрдзрдХреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдпрд╣ рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫредрд╣рдо Axios рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдЖрдпрд╛рдд рди рдХрд░рдирд╛ рдкрдбрд╝реЗред рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ axios
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ index.js
:import axios from "axios";
const apiHost = process.env.VUE_APP_API_HOST || "/";
let baseURL = "api";
if (apiHost) {
baseURL = `${apiHost}api`;
}
export default axios.create({ baseURL: baseURL });
рдлрд╝рд╛рдЗрд▓ рдХреЗ main.js
рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрд╡рд░реЛрдзрдХ рдЬреЛрдбрд╝реЗрдВ , рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╣рдо рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗредimport HTTP from "./axios";
HTTP.interceptors.response.use(
response => {
if (response.data instanceof Blob) {
return response.data;
}
return response.data.data || {};
},
error => {
if (error.response) {
Vue.prototype.$buefy.toast.open({
message: error.response.data.message || "Something went wrong",
type: "is-danger"
});
} else {
Vue.prototype.$buefy.toast.open({
message: "Unable to connect to server",
type: "is-danger"
});
}
return Promise.reject(error);
}
);
Vue.prototype.$http = HTTP;
рдЕрдм main.js
рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ $http
:import HTTP from "./axios";
Vue.prototype.$http = HTTP;
рд╣рдо Vue.js. рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЗрд╕ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗрдЕрдм рд╣рдо рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:const data = await this.$http.get("notes/getall");
рдЕрдиреБрдХреВрд▓рди
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдЖрдХрд╛рд░ рдореЗрдВ рдмрдврд╝ рдЧрдП рд╣реИрдВ рдЬрдм рдЗрд╕рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдШрдЯрдХ рдФрд░ рджреГрд╢реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВредрдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рд╕рдордп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдПрдХ рдмрд╛рд░ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдИ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╣реЛрдВрдЧреЗ:- рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдФрд░ рджреГрд╢реНрдп рд▓реЛрдб рдирд╣реАрдВ рд╣реИрдВ?
- рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЖрдХрд╛рд░ рдХреИрд╕реЗ рдХрдо рдХрд░реЗрдВ?
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдбрд┐рдВрдЧ рд╕рдордп рдХреИрд╕реЗ рд╕реБрдзрд╛рд░реЗрдВ?
рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЖрд╡реЗрджрди рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рддреБрд░рдВрдд рд▓реЛрдб рдХрд░реЗрдВ, рдФрд░ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реЛ рддреЛ рдШрдЯрдХреЛрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВред рд╣рдо рд╡реЗрдмрдкреИрдХ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рд░рд╛рдЙрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ:{
path: "/notes",
name: "Notes",
component: () =>
import( "../views/Home.vue")
}
рдпрд╣ рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рджреГрд╢реНрдп [view].[hash].js
) рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдиреЗ рдкрд░ рдЖрд▓рд╕реА рдореЛрдб рдореЗрдВ рд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВредрдПрдХ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдкреИрдХрд┐рдВрдЧ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░рдирд╛
рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдВрдЯреЗрдирд░реАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ Dockerfile
:# build stage
FROM node:lts-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
ARG VUE_APP_API_HOST
ENV VUE_APP_API_HOST $VUE_APP_API_HOST
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА HTTP рд╕рд░реНрд╡рд░ рдЬреИрд╕реЗ Nginx рдХреЗ рдкреАрдЫреЗ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╣реИрдХрд┐рдВрдЧ рдФрд░ рдЕрдиреНрдп рд╣рдорд▓реЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИредрд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣реЛрд╕реНрдЯ рд╕реВрдЪрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдХреНрд╕рд┐рдпреЛрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛? рдпреЗ рд░рд╣реА рд╡реЛ:const apiHost = process.env.VUE_APP_API_HOST || "/";
рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрд╕рдХреЗ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реЗрдЯ рдФрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред --build-arg
рдЫрд╡рд┐ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ :sudo docker build --build-arg VUE_APP_API_HOST=<Scheme>://<ServiceHost>:<ServicePort>/ -f Dockerfile -t vue-app-image .
рдЖрдкрдХреЛ рдХреНрдпрд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ <Scheme>
, <ServiceHost>
рдФрд░ <ServicePort>
рдЙрди рдореВрд▓реНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдЬреЛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВредрдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:sudo docker run -d -p 8080:80 тАФ name vue-app vue-app-image
рд╕рд╛рд░рд╛рдВрд╢
рд╣рдордиреЗ Vue.js рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рдореБрджреНрджреЛрдВ рдкрд░ рдЫреБрдЖред рдЕрдм рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИредрдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп Vue.js рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрдк рдХреНрдпрд╛ рд╕рд▓рд╛рд╣ рджреЗрдВрдЧреЗ?