Vue2基础知识
一. Vue2基础
1. 环境准备
安装脚手架
1 | |
- g 参数表示全局安装,这样在任意目录都可以使用 vue 脚本创建项目
创建项目
使用在需要创建项目的文件夹下打开命令行操作,输入指令回车后会跳转到vue创建项目的网站中去
1 | |
在这里可以进行vue项目的创建
安装 devtools
- devtools 插件网址:https://devtools.vuejs.org/guide/installation.html
运行vue
在项目文件夹里打开终端输入指令
1 | |
修改端口号
- 文档地址:DevServer | webpack
- 在vue.config.js中添加一下代码
1 | |
添加代理
为了避免前后端服务器联调时, fetch、xhr 请求产生跨域问题,需要配置代理
文档地址:DevServer | webpack
打开 vue.config.js 添加
1
2
3
4
5
6
7
8
9
10
11
devServer: {
port: 7070,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
})
Vue项目结构

- assets - 静态资源
- components - 可重用组件
- router - 路由
- store - 数据共享
- views - 视图组件
以后还会添加
- api - 跟后台交互,发送 fetch、xhr 请求,接收响应
- plugins - 插件
2. Vue组件
Vue 的组件文件以 .vue 结尾,每个组件由三部分组成
1 | |
- template 模板部分,由它生成 html 代码
- script 代码部分,控制模板的数据来源和行为
- style 样式部分,一般不咋关心
先删除App.vue原有代码,来个 Hello, World 例子
1 | |
解释
- export default 导出组件对象,供 main.js 导入使用
- 这个对象有一个 data 方法,返回一个对象,给 template 提供数据
{{}}在 Vue 里称之为插值表达式,用来绑定 data 方法返回的对象属性,绑定的含义是数据发生变化时,页面显示会同步变化
2.1 文本插值
1 | |
{{}}里只能绑定一个属性,绑定多个属性需要用多个{{}}分别绑定- template 内只能有一个根元素
- 插值内可以进行简单的表达式计算
2.2 属性绑定
1 | |
- 简写方式:可以省略 v-bind 只保留冒号
2.3 事件绑定
1 | |
- 简写方式:可以把 v-on: 替换为 @
- 在 methods 方法中的 this 代表的是 data 函数返回的数据对象

2.4 双向绑定
1 | |
- 用 v-model 实现双向绑定,即
- JavaScript 数据可以同步到表单标签
- 反过来用户在表单标签输入的新值也会同步到 JavaScript 这边
- 双向绑定只适用于表单这种带【输入】功能的标签,其它标签的数据绑定,单向就足够了
- 复选框这种标签,双向绑定的 JavaScript 数据类型一般用数组
2.5 计算属性
1 | |
- 普通方法调用必须加 (),没有缓存功能
- 计算属性使用时就把它当属性来用,不加 (),有缓存功能:
- 一次计算后,会将结果缓存,下次再计算时,只要数据没有变化,不会重新计算,直接返回缓存结果
3. axios
axios 它的底层是用了 XMLHttpRequest(xhr)方式发送请求和接收响应,xhr 相对于之前讲过的 fetch api 来说,功能更强大,但由于是比较老的 api,不支持 Promise,axios 对 xhr 进行了封装,使之支持 Promise,并提供了对请求、响应的统一拦截功能
安装
1 | |
导入
1 | |
- axios 默认导出一个对象,这里的 import 导入的就是它默认导出的对象
方法
| 请求 | 备注 |
|---|---|
| axios.get(url[, config]) | |
| axios.delete(url[, config]) | |
| axios.head(url[, config]) | |
| axios.options(url[, config]) | |
| axios.post(url[, data[, config]]) | |
| axios.put(url[, data[, config]]) | |
| axios.patch(url[, data[, config]]) |
- config - 选项对象、例如查询参数、请求头…
- data - 请求体数据、最常见的是 json 格式数据
- get、head 请求无法携带请求体,这应当是浏览器的限制所致(xhr、fetch api 均有限制)
- options、delete 请求可以通过 config 中的 data 携带请求体
1 | |
创建实例
1 | |
- axios 对象可以直接使用,但使用的是默认的设置
- 用 axios.create 创建的对象,可以覆盖默认设置,config 见下面说明
常见的 config 项有
| 名称 | 含义 |
|---|---|
| baseURL | 将自动加在 url 前面 |
| headers | 请求头,类型为简单对象 |
| params | 跟在 URL 后的请求参数,类型为简单对象或 URLSearchParams |
| data | 请求体,类型有简单对象、FormData、URLSearchParams、File 等 |
| withCredentials | 跨域时是否携带 Cookie 等凭证,默认为 false |
| responseType | 响应类型,默认为 json |
例
1 | |
- 生产环境希望 xhr 请求不走代理,可以用 baseURL 统一修改
- 希望跨域请求携带 cookie,需要配置 withCredentials: true,服务器也要配置 allowCredentials = true,否则浏览器获取跨域返回的 cookie 时会报错
响应格式
| 名称 | 含义 |
|---|---|
| data | 响应体数据 |
| status | 状态码 |
| headers | 响应头 |
- 200 表示响应成功
- 400 请求数据不正确 age=abc
- 401 身份验证没通过
- 403 没有权限
- 404 资源不存在
- 405 不支持请求方式 post
- 500 服务器内部错误
请求拦截器
1 | |
响应拦截器
1 | |
这里的 _axios 是自己创建的axios对象
请求拦截器中第一个方法是请求正常的情况下要执行的拦截动作,第二个方法是请求拦截异常的情况下要执行的拦截动作
响应拦截器中第一个方法是响应正常的情况下要执行的拦截动作,第二个方法是响应拦截异常的情况下要执行的拦截动作
响应时出现的异常可以放在响应拦截器中的第二个方法中去,如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18_axios.interceptors.response.use(
function(response) {
return response;
},
function(error) {
if (error.response.status === 400) {
console.log('请求参数不正确');
return Promise.resolve(400);
} else if (error.response.status === 401) {
console.log('跳转至登录页面');
return Promise.resolve(401);
} else if (error.response.status === 404) {
console.log('资源未找到');
return Promise.resolve(404);
}
return Promise.reject(error);
}
);
把上面的代码抽取到一个js文件中去
1 | |
二. Vue2进阶
1. ElementUI
安装:在vue项目文件下打开命令行输入以下安装代码
1 | |
安装完后在package.json文件中会引入element-ui的依赖
引入组件
把下面的代码放入main.js中,Vue.use(Element)要放在new Vue前面
1 | |
1.1 表格组件
1 | |
- el-table:表格
- data:要展示的数据对象
- el-table-column:表格中的列
- label:命名
- prop:数据对象对应的属性
1.2 分页组件
1 | |
el-pagination:element-ui分页组件
- 有 : 和 没有 : 的区别,有:表示该属性的值会去data中去查找,没有则是给定固定值
- total: 总数量
- page-size:每页条目个数,可以自定义
- :page-sizes=”[5,10,15,20]” :自定义每页条目数
- layout:组件布局,子组件名用逗号分隔(决定页面显示哪些组件)sizes
,prev,pager,next,jumper,->,total,slot - @current-change:current- page改变时会触发,这里通过调用自定义函数currentChange来改变data中的page,来实现数据的双向绑定
- @size-change:page-size改变时会触发,这里通过调用自定义函数sizeChange来改变data中的size,来实现数据的双向绑定
query()函数:把向前端的请求封装成方法,方便调用。刚开始加载页面时会调用(钩子函数中),页数改变时会调用(currentChange函数中),每页条目个数改变时会调用(sizeChange函数中)
this.students = resp.data.data.list和this.total = resp.data.data.total 因为后端返回的数据中的data是一个map集合

1.3 分页搜索
1 | |
- el-option中的value是传给后端的值,label是显示在前端页面的值,如果没有添加label属性则把value显示在前端页面
- 输入框和选择框都可以通过v-model实现数据的双向绑定



1.4 级联选择器
1 | |
