一、引言
- 这是之前做的form表单页面,看起来没有任何的美感,只是一些标签的堆砌。
- 这是之前完成的vue的小案例,通过vue当中的指令渲染展示出来了这么一个表格,而表格当中的数据,也是在前端页面中固定死的。
- 但是在真实的项目当中,那这些数据应该是从服务器端获取到的。
- 如何解决这些问题呢?就要从以下几点出发学习:
- Ajax
- 前后端分离开发
- 前端工程化
- Vue组件库Element
- Vue路由
- 打包部署
二、Ajax
1、概念及作用
-
概念:
A
synchronousJ
avaScriptA
ndX
ML,异步
的JavaScript和XML。 -
作用:
-
数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。
-
异步交互:可以在
不重新加载整个页面
的情况下,与服务器交换数据并更新部分网页
的技术,如:搜索联想、用户名是否可用的校验等等。
-
2、同步与异步
-
同步和异步有什么区别?
-
同步:
当客户端(浏览器)向服务器请求数据的时候,需要服务器响应数据给客户端之后,客户端才可以执行其他操作。
-
异步:
当客户端(浏览器)向服务器请求数据的时候,客户端则不需要等待服务器响应结果,客户端可以执行其他操作。
-
3、原生Ajax
① 准备数据地址:http://yapi.smart-xwork.cn/mock/169327/emp/list
② 创建XMLHttpRequest对象:用于和服务器交换数据
③ 向服务器发送请求
④ 获取服务器响应数据
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>原生Ajax</title>
</head>
<body>
<input type="button" value="获取数据" onclick="getData()">
<div id="div1"></div>
</body>
<script>
function getData() {
//1.创建XMLHttpRequest
var xmlHttpRequest = new XMLHttpRequest();
//2.发送异步请求
xmlHttpRequest.open('GET', 'http://yapi.smart-xwork.cn/mock/169327/emp/list');
xmlHttpRequest.send(); //发送请求
//3.获取服务响应数据
xmlHttpRequest.onreadystatechange = function () {
// xmlHttpRequest.readyState == 4: 判断请求是否已完成且响应已就绪
// xmlHttpRequest.status == 200: 判断返回请求的状态号是否为200
// 以上都满足,则说明响应成功
if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {
// 响应成功:以字符串形式返回响应数据。
// 之后将响应回来的数据填充到div1这个区域中
document.getElementById('div1').innerHTML = this.responseText;
}
}
}
</script>
</html>
原生Ajax请求存在哪些问题?
- 这种请求方式比较繁琐
- 在早期的浏览器当中还存在浏览器的兼容性问题
所以在现在的项目开发当中原生的Ajax方式已经基本不用了。
现在项目开发当中使用的是基于原生的Ajax封装起来的技术:Axios
三、Axios
1、概念
- 介绍:Axios 对原生的Ajax进行了封装,简化书写,快速开发。
- 官网: https://www.axios-http.cn/
2、Axios入门
① 引入Axios的js文件。
② 使用Axios发送请求,并获取响应结果。
-
get:
-
post:
简化书写(推荐)
-
请求方式别名(推荐使用):
- axios.get(url[,config])
- axios.delete(url[,config])
- axios.post(url[,data[,config]])
- axios.put(url[,data[,config]])
-
发送GET请求
-
发送POST请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajax-Axios入门</title>
<!-- 1.引入Axios的js文件 -->
<script src="js/axios-0.18.0.js"></script>
</head>
<body>
<input type="button" value="获取数据GET" onclick="get()">
<input type="button" value="删除数据POST" onclick="post()">
</body>
<script>
function get() {
//通过Axios发送异步请求-get
// axios({
// method: "get",
// url: "http://yapi.smart-xwork.cn/mock/169327/emp/list"
// }).then((result) => {
// console.log(result.data);
// })
//请求方式别名形式
axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then((result) => {
console.log(result.data);
})
}
function post() {
//通过Axios发送异步请求-post
// axios({
// method: "post",
// //浏览器访问任何地址都是以get方式访问的,所以直接使用浏览器访问该地址会报错404(请求失败)
// url: "http://yapi.smart-xwork.cn/mock/169327/emp/deleteById",
// data: "id=1"
// }).then((result) => {
// console.log(result.data);
// })
//请求方式别名形式
axios.post("http://yapi.smart-xwork.cn/mock/169327/emp/deleteById","id=1").then((result) => {
console.log(result.data);
})
}
</script>
</html>
3、案例
需求
-
基于Vue以及Axios完成数据的动态加载展示:
- 数据准备的url: http://yapi.smart-xwork.cn/mock/169327/emp/list
- 在页面加载完成后,自动发送异步请求,加载数据,渲染展示页面(性别:1 代表男,2 代表女)
实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajax-Axios案例</title>
<!-- 1.引入vue、Axios的js文件 -->
<script src="js/axios-0.18.0.js"></script>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 创建表格 -->
<table border="1" cellspacing="0" width="60%">
<!-- 表头 -->
<tr>
<th>编号</th>
<th>姓名</th>
<th>图像</th>
<th>性别</th>
<th>职位</th>
<th>入职日期</th>
<th>最后操作时间</th>
</tr>
<!-- 表格单元数据 -->
<tr align="center" v-for="(teacher, index) in teachers">
<!-- 编号 -->
<td>{{index + 1}}</td>
<!-- 姓名 -->
<td>{{teacher.name}}</td>
<!-- 图像 -->
<!-- v-bind指令缩写形式 ":" -->
<td><img :src="teacher.image" width="70px" height="50px"></td>
<!-- 性别 -->
<td>
<span v-if="teacher.gender == 1">男</span>
<span v-if="teacher.gender == 2">女</span>
</td>
<!-- 职位 -->
<td>{{teacher.job}}</td>
<!-- 入职日期 -->
<td>{{teacher.entrydate}}</td>
<!-- 最后操作时间 -->
<td>{{teacher.updatetime}}</td>
</tr>
</table>
</div>
</body>
<script>
new Vue({
el: "#app", //vue接管区域
data: {
//接收服务端响应的数据
teachers: []
},
// mounted周期:挂载完成,Vue初始化成功,HTML页面渲染成功。
mounted() { //钩子函数
//(发送请求到服务端,加载数据)
axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then(result => {
this.teachers = result.data.data
})
},
});
</script>
</html>