Vue 是尤雨溪在 2014 年建立的一个前端框架,目前 Github Star 数高达 150K,是 Star 数最高的前端项目,而且 Vue 有着极为活跃的社区生态以及专职团队进行维护以确保项目能够健康长久地发展。javascript
目前中国不少互联网公司前端程序员的招聘要求都要求程序员掌握 Vue,像滴滴、美团、饿了么等大厂也在重度使用 Vue 进行开发,而且有着像 Element 、mpvue、iView 这样优秀的基于 Vue 开源项目存在,因此学习 Vue 是一个不错的投资,当你学会 Vue,就能够快速开发项目,这样不只能够接外包挣外快,并且当有了必定的项目经验,还能够在一线互联网大厂找到一份不错的工做。css
看到这里你心动了嘛?心动不如行动!而最幸运的是,本教程将会一步一步带你以实战的方式实现一个迷你全栈电商网站。并在实战的过程当中,了解 Vue 的全貌,如今就打开电脑,跟随个人脚步,完全掌握 Vue 开发!本系列教程的规划以下:html
若是您以为咱们的教程写得还不错,请记得给咱们点个赞哦!鼓励咱们更快更好地写完剩下的教程!你也能够在评论区留言,告诉咱们想要实现什么功能,咱们必定会仔细考虑的哦!前端
你能够在 Github 查看本教程最终的源码:源码地址。vue
安装 Node.js,你能够去 Node.js 官网下载安装包,经过安装包安装会同时安装 Node.js 包管理工具 Npm,用于便捷的管理项目依赖和下载第三方包。java
打开终端,输入以下命令测试是否安装成功:node
node -v # v10.16.0
npm -v # 6.9.0
复制代码
若是在你的终端有如上输出,那么表明你安装成功。webpack
提示git
经过上面安装包安装,你会安装最新的 Node 稳定版本,这可能和个人机器上的 Node 版本不一致,可是不用担忧,本教程使用到的代码语法适用于绝大多数新的或更老的 Node。程序员
安装 vue-cli,在绝大多数场景下,咱们使用 vue-cli 来初始化咱们的 vue 项目,本教程也不例外,在终端运行以下命令来安装:
npm install -g vue-cli
复制代码
打开终端,输入以下命令测试是否安装成功:
vue --version # 2.9.6
复制代码
提示
虽然 Vue 3.x 已经正式推出,可是这篇教程用的是主流、稳定的 Vue 2.x 版本。因为 Vue 的总体思想基本没有改变,因此不影响咱们的学习。在接下来的教程中,咱们会迁移到 Vue 3.x,并经过讲解新老 Vue 版本的差别让你更好地理解 Vue 的演变。
上面两个安装步骤已经足够完成咱们的教程的学习,可是我想额外推荐你一款编辑器,VSCode,你能够经过访问 VSCode 官网安装。
在 VSCode 里面找到 Vue 插件,能够得到代码语法高亮以及自动格式化很是便捷的功能,而且 VSCode 自然对 JavaScript 的支持,会大大提升咱们的开发效率,本教程所涉及项目的开发都是使用 VSCode 完成的。
打开终端输入以下命令初始化咱们的 Vue 项目:
vue init webpack vue-online-shop-frontend
复制代码
命令行接着会显示一些列选项让你选择,具体咱们的选择以下图:
提示
其中
Author
字段你能够填本身的昵称,而后咱们在选择了安装vue-router
以后,其余的都选择了no
,由于本篇教程是面向初学者的实战教程,若是引入了过多和 Vue 核心无关的概念,就会引发不少困惑,因此这里咱们不配置它们
当项目初始化成功以后,接下来经过以下命令开启项目:
# code vue-online-shop-frontend # 若是你使用了 VSCode 编辑器,能够用这行命令打开项目
cd vue-online-shop-frontend && npm start
复制代码
接着打开浏览器,访问 http://localhost:8080/
查看咱们初始好的项目效果。
注意
若是你使用 VSCode 编辑器打开项目进行开发,在运行
code project-name
以前须要安装code
脚本,具体我找了一篇教程:戳我访问。
经过 vue-cli 初始化的脚手架代码中,咱们在整个教程中须要了解的就是如下五个文件:
src/main.js
index.html
src/App.vue
src/router/index.js
src/components/HelloWorld.vue
首先咱们来看一下 src/main.js
,这个是 Vue 应用的入口。咱们经过导入 Vue
类、App
组件、router
路由,再加上 el
,将这些参数传给 Vue
类,生成一个 Vue 实例。
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
import App from './App';
import router from './router';
Vue.config.productionTip = false;
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>',
});
复制代码
接着咱们来看一下 index.html
文件,它的代码是这样的:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>vue-online-shop</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
复制代码
当咱们开启项目以后,Vue 所使用的构建工具 Webpack 将会:
src/main.js
里面声明的 el
属性(#app
),找到 index.html
中 id 为app
的 DOM 节点script
和 link
的方式插入到 index.html
中index.html
渲染,咱们就能够看到写好的 Vue 页面效果。src/App.vue
就是 Vue 为咱们提供的组件文件,使得咱们能够以组件的形式来组织代码,并经过组件的组合来构建任意规模的项目,代码以下:
<template>
<div id="app">
<img src="./assets/logo.png">
<router-view/>
</div>
</template>
<script> export default { name: 'App', }; </script>
<style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
复制代码
能够看到, App
组件包含了三个部分的代码:
template
script
style
其实就是对应了传统 Web "三剑客",HTML
、JavaScript
、CSS
。
这里在 template
部分展现了一张 Vue 的 logo 图片,而后显示此刻渲染的路由组件:<router-view />
。咱们将在后面继续讲解路由,这里不懂也没有关系哦。script
部分,主要是导出了一个名为 App
的组件。style
部分就是咱们熟悉的 CSS 代码了。
提示
上面所讲的是比较小的组件的写法,当组件中涉及的代码较多时,咱们须要把
script
和style
抽成独立的.js
和.css
文件。就像下面这样:<!-- ./src/App.vue --> <template> <div id="app"> <img src="./assets/hello.png"> <router-view/> </div> </template> <script src="./app.js"></script> <style src="./app.css"></style> 复制代码
Vue 组件和模板语法是 Vue 的核心概念,咱们在后面会以实战的形式重点讲解这些内容。
src/router/index.js
文件是 Vue 为咱们提供的路由文件,代码以下:
import Vue from 'vue';
import Router from 'vue-router';
import HelloWorld from '@/components/HelloWorld';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld,
},
],
});
复制代码
首先咱们导出了 Vue 类,以及 Router 类,以及咱们的 HelloWorld
组件。
接着咱们使用 Vue.use(Router)
告诉 Vue,咱们应用接入了路由。
在导出的路由实例中,咱们经过 routes
数组定义了项目全部的页面,每一个页面是一个相似 { path, name, component }
的对象。
好比初始化时生成的 HelloWorld.vue
就是咱们的网站首页 -- 也就是打开浏览器访问到的第一个页面,由于它的路径(path
)定义为 /
。此外一个页面定义还须要 name
,它表明此页面在 vue-router
中的标识符,component
则表明此页面渲染时的所用到的组件。
提示
这里咱们能够看到导出
HelloWorld
组件时,咱们在路径最前面加上了"@"
,那是由于咱们在webpack
配置中将会"@"
映射成resolve('src')
,也就是咱们项目目录下src
文件夹的路径,最后咱们的'@/components/HelloWorld'
的实际上的效果至关于取到了项目目录src
文件夹里面的components/HelloWorld
组件。
最后是 src/components/HelloWorld.vue
文件,是脚手架代码为咱们提供的一个实例组件,代码以下:
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<h2>Essential Links</h2>
<!-- 省略其余模板代码 ... -->
</div>
</template>
<script> export default { name: 'HelloWorld', data() { return { msg: 'Welcome to Your Vue.js App', }; }, }; </script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped> h1, h2 { font-weight: normal; } ul { list-style-type: none; padding: 0; } li { display: inline-block; margin: 0 10px; } a { color: #42b983; } </style>
复制代码
能够看到,其结构大体与 App.vue
相似。其中也有一些不一样,好比 script
里面的 data
字段,还有 template
中的 {{ }}
语法。这个咱们会在下一节进行讲解。
当咱们打开浏览器时,地址为:http://localhost:8080/
此时路径为 /
,激活 HelloWorld.vue
组件,因此最后咱们整个项目渲染 App.vue
的内容,显示的结构即为:
HelloWorld.vue
组件的内容经过一窥 vue-cli
为咱们初始化的项目代码,咱们能够学到以下的知识:
下面咱们来编写电商应用的首页。
在 src/components
下面建立 Home.vue
文件,而后编写以下代码:
<template>
<div>
<div class="title">
<h1>{{msg}}</h1>
</div>
</div>
</template>
<script> export default { name: 'home', data () { return { msg: 'Welcome to Your Vue.js App' }; }, } </script>
复制代码
在上面,咱们建立了一个名为 Home.vue
的 Vue 组件,能够看到它和咱们以前的 HelloWorld.vue
的内容大体相仿,可是也有一些不一样的地方:
style
部分),而是先专一于基础知识的讲解。在后续教程中,咱们会使用 Element UI 组件库让咱们的界面变得专业美观。script
中引入了 data
,在 template
引入了插值语法 {{var}}
。其中 data
是声明此组件的初始化数据,而 {{var}}
插值语法是方便将数据渲染到视图模板中;这里咱们将在 script
中定义的 data
中的 msg
插值到视图模板中,最终会渲染一个 h1
标签,标签内容就为 msg
的内容。接着,咱们在 src/router/index.js
路由中将主页路由 /
所绑定的组件从默认的 HelloWorld
修改成刚才写好的 Home
组件:
import Vue from 'vue';
import Router from 'vue-router';
import Home from '@/components/Home';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'Home',
component: Home,
},
],
});
复制代码
如今咱们保存代码,打开浏览器,就会显示刚才在 Home.vue
里面填写的那个标题:
一个经典的电商应用一般包括以下部分:
Home.vue
)Detail.vue
)Cart.vue
)这里由于咱们追求简单,也将商品的后台管理页面 (Admin.vue
)放入了项目中。
如今咱们先来实现商品展现列表、购物车和后台管理页面的模板内容。由于商品详情页后面将会使用组件进行复用,因此这里咱们暂时先不建立。
首先修改 App.vue
,加入三个导航连接 router-link
,方便让用户跳转到到本身想看的页面,代码以下:
<template>
<div id="app">
<nav>
<div class="container">
<ul class="nav__left">
<li>
<router-link to="/">Home</router-link>
</li>
<li>
<router-link to="/admin">Admin</router-link>
</li>
<li>
<router-link to="/cart">Cart</router-link>
</li>
</ul>
</div>
</nav>
<router-view/>
</div>
</template>
<script> export default { name: 'App', }; </script>
<style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
复制代码
这里咱们在头部添加了三个 router-link
表明咱们的头部导航。
router-link
和 a
标签相似,只不过 Vue 为它添加一些额外的优化逻辑。
接着咱们编写 Admin.vue
组件,但这里稍微有点不一样,即咱们在 src/pages
下建立 Admin.vue
组件,由于对于页面级组件,咱们倾向于将其放到一个特殊 pages
文件夹,这样方便组织项目。其代码以下:
<template>
<div>
<div class="title">
<h1>{{msg}}</h1>
</div>
</div>
</template>
<script> export default { name: 'home', data () { return { msg: 'Welcome to the Admin Page' } } } </script>
复制代码
能够看到这个页面内容和咱们以前的 Home.vue
内容类似。
而后是咱们的购物车页面 Cart.vue
,代码以下:
<template>
<div>
<div class="title">
<h1>{{msg}}</h1>
</div>
</div>
</template>
<script> export default { name: 'home', data () { return { msg: 'Welcome to the Cart Page' } } } </script>
复制代码
能够看到这个页面内容和咱们以前的 Home.vue
内容类似。
最后,咱们把上一步中建立的 Home.vue
移到 src/pages
目录中,并在路由文件 src/routes/index.js
中导入这三个页面,代码以下:
import Vue from 'vue';
import Router from 'vue-router';
import Home from '@/pages/Home';
import Admin from '@/pages/Admin';
import Cart from '@/pages/Cart';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'Home',
component: Home,
},
{
path: '/admin',
name: 'Admin',
component: Admin,
},
{
path: '/cart',
name: 'Cart',
component: Cart,
},
],
});
复制代码
保存代码,而后打开浏览器,咱们能够看到下面的效果:
你能够点击头部的三个导航连接,下面的标题内容会随着点击的连接变化。恭喜你,你已经成功地实现了一个基于 Vue 的多页面网站了!
随着页面的增多,若是咱们把全部的页面都塞到一个 routes
数组里面会显得很乱,你没法肯定哪些页面存在关系。还好 vue-router
提供了嵌套路由的功能,让咱们能把相关联的页面组织在一块儿。
在咱们的商城项目中,后台管理页 Admin
涉及到不少操做页面,好比:
/create
建立新的商品/edit
编辑商品信息让咱们经过嵌套路由的方式将它们组织在一块儿。首先在路由文件 src/router/index.js
中声明后台管理全部用到的页面组件(咱们立刻就会去实现它们):
import Vue from 'vue';
import Router from 'vue-router';
import Home from '@/pages/Home';
import Cart from '@/pages/Cart';
// Admin Components
import Index from '@/pages/admin/Index';
import New from '@/pages/admin/New';
import Products from '@/pages/admin/Products';
import Edit from '@/pages/admin/Edit';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'Home',
component: Home,
},
{
path: '/admin',
name: 'Admin',
component: Index,
children: [
{
path: 'new',
name: 'New',
component: New,
},
{
path: '',
name: 'Products',
component: Products,
},
{
path: 'edit/:id',
name: 'Edit',
component: Edit,
},
]
},
{
path: '/cart',
name: 'Cart',
component: Cart,
},
],
});
复制代码
嵌套路由的用法就是给须要归为一类的页面设置一个入口页面,而后把这一类页面都放到这个路由页面路由定义的 children
字段数组中。
经过上面的代码咱们能够看到,Admin
类别下有四个组件,Index
是咱们 Admin
类别的入口组件,也是做为 path = /admin
的渲染组件,而后其余组件就放到 path = /admin
这个路由定义的 children
数组里,其定义和其余父级一致。
这样的嵌套写法带来了两个好处:
path
的时候,复用了父级的 path
,即如今咱们的 New
这个路由,它在浏览器中访问的路径为:'/admin' + 'new'
,若是咱们统一放到 routes
数组的第一级定义,那么后面的 Products
和 Edit
的 path
都要带上诸如 /admin
和 /admin/edit/:id
这样长长的路径,显得特别复杂。这里还有一个改变就是,咱们发现 Edit
这个路由的 path
有点不太同样,它有个特殊的标志 edit/:id
,这种写法被称为动态路由,即 :id
会匹配任意字符串,因此用户访问 /admin/edit/<any-string>
都会激活 Edit
路由,从而渲染 Edit.vue
组件。
首先建立 Index.vue
入口组件,代码以下:
<template>
<div>
<div class="admin-new">
<div class="container">
<div class="col-lg-3 col-md-3 col-sm-12 col-xs-12">
<ul class="admin-menu">
<li>
<router-link to="/admin">View Products</router-link>
</li>
<li>
<router-link to="/admin/new">New Products</router-link>
</li>
</ul>
</div>
<router-view></router-view>
</div>
</div>
</div>
</template>
复制代码
能够看到,它做为嵌套路由的入口级组件,和咱们以前在 App.vue
里面看到的样子相似,在其中会有 router-link
导向更深层级的路由.
router-view
用于渲染子路由组件,好比咱们此时访问 /admin/new
页面,那么 router-view
部分会被替换成 New.vue
组件的内容,由于咱们在以前的嵌套路由定义中 path
为 new
的渲染组件为 New.vue
。
建立 src/pages/admin/Edit.vue
组件,代码以下:
<template>
<div>
<div class="title">
<h1>This is Admin/Edit/{{$route.params.id}}</h1>
</div>
</div>
</template>
复制代码
能够看到,当用户访问 /admin/edit/:id
,会激活渲染 Edit.vue
组件,咱们能够经过 $route.params.id
的方式获取用户输入的路径 :id
部分。好比咱们在浏览器中输入 /admin/edit/52tuture
,那么浏览器将会以 h1
的形式打出 "This is Admin/Edit/52tuture"
。
提示
$route
这个变量是 Vue 在运行时为咱们自动插入到全部组件属性中的,全部咱们不用手动去管理它。
建立 src/pages/admin/New.vue
,代码以下:
<template>
<div>
<div class="title">
<h1>This is Admin/New</h1>
</div>
</div>
</template>
复制代码
建立 src/pages/admin/Products.vue
,代码以下:
<template>
<div>
<div class="title">
<h1>This is Admin</h1>
</div>
</div>
</template>
复制代码
保存咱们编写的内容,打开浏览器,咱们能够看到以下内容:
至此,咱们的迷你全栈电商应用的第一部分就完成了,在接下来的教程中,咱们将用 Express 和 MongoDB 搭建这个电商应用的后端 API,不见不散哦~
想要学习更多精彩的实战技术教程?来图雀社区逛逛吧。