vue-day04-vue前端交互
生活随笔
收集整理的這篇文章主要介紹了
vue-day04-vue前端交互
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 接口調用方式
- 異步
- promise
- 基于Promise發送Ajax請求
- Promise 基本API
- 實例方法
- .then()
- .catch()
- .finally()
- 靜態方法
- .all()
- .race()
- fetch
- 概覽
- fetch請求參數(圖片記錄)
- fetch API 中的 HTTP 請求
- fetchAPI 中 響應格式
- axios
- axios基礎用法
- axios的響應結果
- axios 全局配置
- axios 攔截器
- async 和 await
- 圖書列表案例
- 1. 基于接口案例-獲取圖書列表
- 2 添加圖書
- 3 驗證圖書名稱是否存在
- 4. 編輯圖書
- 5 刪除圖書
- 案例
- 參考接口文檔
- 圖書管理后臺接口文檔
- 獲取圖書列表數據
- 添加圖書-提交圖書信息
- 編輯圖書-根據ID查詢圖書信息
- 編輯圖書-提交圖書信息
- 刪除圖書信息
- 驗證圖書名稱是否存在
接口調用方式
- 原生ajax
- 基于jQuery的ajax
- fetch
- axios
異步
- JavaScript的執行環境是「單線程」
- 所謂單線程,是指JS引擎中負責解釋和執行JavaScript代碼的線程只有一個,也就是一次只能完成一項任務,這個任務執行完后才能執行下一個,它會「阻塞」其他任務。這個任務可稱為主線程
- 異步模式可以一起執行多個任務
- JS中常見的異步調用
- 定時任何
- ajax
- 事件函數
promise
- 主要解決異步深層嵌套的問題
- promise 提供了簡潔的API 使得異步操作更加容易
基于Promise發送Ajax請求
<script type="text/javascript">/*基于Promise發送Ajax請求*/function queryData(url) {# 1.1 創建一個Promise實例var p = new Promise(function(resolve, reject){var xhr = new XMLHttpRequest();xhr.onreadystatechange = function(){if(xhr.readyState != 4) return;if(xhr.readyState == 4 && xhr.status == 200) {# 1.2 處理正常的情況resolve(xhr.responseText);}else{# 1.3 處理異常情況reject('服務器錯誤');}};xhr.open('get', url);xhr.send(null);});return p;}# 注意: 這里需要開啟一個服務 # 在then方法中,你也可以直接return數據而不是Promise對象,在后面的then中就可以接收到數據了queryData('http://localhost:3000/data').then(function(data){console.log(data)# 1.4 想要繼續鏈式編程下去 需要 return return queryData('http://localhost:3000/data1');}).then(function(data){console.log(data);return queryData('http://localhost:3000/data2');}).then(function(data){console.log(data)});</script>Promise 基本API
實例方法
.then()
- 得到異步任務正確的結果
.catch()
- 獲取異常信息
.finally()
- 成功與否都會執行(不是正式標準)
靜態方法
.all()
- Promise.all方法接受一個數組作參數,數組中的對象(p1、p2、p3)均為promise實例(如果不是一個promise,該項會被用Promise.resolve轉換為一個promise)。它的狀態由這三個promise實例決定
.race()
- Promise.race方法同樣接受一個數組作參數。當p1, p2, p3中有一個實例的狀態發生改變(變為fulfilled或rejected),p的狀態就跟著改變。并把第一個改變狀態的promise的返回值,傳給p的回調函數
?
<script type="text/javascript">/*Promise常用API-對象方法*/// console.dir(Promise)function queryData(url) {return new Promise(function(resolve, reject){var xhr = new XMLHttpRequest();xhr.onreadystatechange = function(){if(xhr.readyState != 4) return;if(xhr.readyState == 4 && xhr.status == 200) {// 處理正常的情況resolve(xhr.responseText);}else{// 處理異常情況reject('服務器錯誤');}};xhr.open('get', url);xhr.send(null);});}var p1 = queryData('http://localhost:3000/a1');var p2 = queryData('http://localhost:3000/a2');var p3 = queryData('http://localhost:3000/a3');Promise.all([p1,p2,p3]).then(function(result){// all 中的參數 [p1,p2,p3] 和 返回的結果一 一對應["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]console.log(result) //["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]})Promise.race([p1,p2,p3]).then(function(result){// 由于p1執行較快,Promise的then()將獲得結果'P1'。p2,p3仍在繼續執行,但執行結果將被丟棄。console.log(result) // "HELLO TOM"})</script>fetch
概覽
- Fetch API是新的ajax解決方案 Fetch會返回Promise
- fetch不是ajax的進一步封裝,而是原生js,沒有使用XMLHttpRequest對象。
- fetch(url, options).then()
fetch請求參數(圖片記錄)
fetch API 中的 HTTP 請求
- fetch(url, options).then()
- HTTP協議,它給我們提供了很多的方法,如POST,GET,DELETE,UPDATE,PATCH和PUT
- 默認的是 GET 請求
- 需要在 options 對象中 指定對應的 method method:請求使用的方法
- post 和 普通 請求的時候 需要在options 中 設置 請求頭 headers 和 body
fetchAPI 中 響應格式
- 用fetch來獲取數據,如果響應正常返回,我們首先看到的是一個response對象,其中包括返回的一堆原始字節,這些字節需要在收到后,需要我們通過調用方法將其轉換為相應格式的數據,比如JSON,BLOB或者TEXT等等
axios
- 基于promise用于瀏覽器和node.js的http客戶端
- 支持瀏覽器和node.js
- 支持promise
- 能攔截請求和響應
- 自動轉換JSON數據
- 能轉換請求和響應數據
axios基礎用法
- get和 delete請求傳遞參數
- 通過傳統的url 以 ? 的形式傳遞參數
- restful 形式傳遞參數
- 通過params 形式傳遞參數
- post 和 put 請求傳遞參數
- 通過選項傳遞參數
- 通過 URLSearchParams 傳遞參數
axios的響應結果
axios 全局配置
# 配置公共的請求頭 axios.defaults.baseURL = 'https://api.example.com'; # 配置 超時時間 axios.defaults.timeout = 2500; # 配置公共的請求頭 axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; # 配置公共的 post 的 Content-Type axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';axios 攔截器
- 請求攔截器
- 請求攔截器的作用是在請求發送前進行一些操作
- 例如在每個請求體里加上token,統一做了處理如果以后要改也非常容易
- 請求攔截器的作用是在請求發送前進行一些操作
- 響應攔截器
- 響應攔截器的作用是在接收到響應后進行一些操作
- 例如在服務器返回登錄狀態失效,需要重新登錄的時候,跳轉到登錄頁
- 響應攔截器的作用是在接收到響應后進行一些操作
async 和 await
async 和await的結合promise用法
- async作為一個關鍵字放到函數前面
- 任何一個async函數都會隱式返回一個promise
- await關鍵字只能在使用async定義的函數中使用
- ? await后面可以直接跟一個 Promise實例對象
- ? await函數不能單獨使用
- async/await 讓異步代碼看起來、表現起來更像同步代碼
圖書列表案例
1. 基于接口案例-獲取圖書列表
- 導入axios 用來發送ajax
- 把獲取到的數據渲染到頁面上
2 添加圖書
- 獲取用戶輸入的數據 發送到后臺
- 渲染最新的數據到頁面上
3 驗證圖書名稱是否存在
- 添加圖書之前發送請求驗證圖示是否已經存在
- 如果不存在 往后臺里面添加圖書名稱
- 圖書存在與否只需要修改submitFlag的值即可
4. 編輯圖書
- 根據當前書的id 查詢需要編輯的書籍
- 需要根據狀態位判斷是添加還是編輯
5 刪除圖書
- 把需要刪除的id書籍 通過參數的形式傳遞到后臺
案例
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Document</title><link rel="stylesheet" type="text/css" href="css/index.css"> </head> <body><div id="app"><div class="grid"><div><h1>圖書管理</h1><div class="book"><div><label for="id">編號:</label><input type="text" id="id" v-model='id' disabled="false" v-focus><label for="name">名稱:</label><input type="text" id="name" v-model='name'><button @click='handle' :disabled="submitFlag">提交</button></div></div></div><div class="total"><span>圖書總數:</span><span>{{total}}</span></div><table><thead><tr><th>編號</th><th>名稱</th><th>時間</th><th>操作</th></tr></thead><tbody><tr :key='item.id' v-for='item in books'><td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.date | format('yyyy-MM-dd hh:mm:ss')}}</td><td><a href="" @click.prevent='toEdit(item.id)'>修改</a><span>|</span><a href="" @click.prevent='deleteBook(item.id)'>刪除</a></td></tr></tbody></table></div></div><script type="text/javascript" src="js/vue.js"></script><script type="text/javascript" src="js/axios.js"></script><script type="text/javascript">/*圖書管理-添加圖書*/axios.defaults.baseURL = 'http://localhost:3000/';axios.interceptors.response.use(function(res){return res.data;}, function(error){console.log(error)});Vue.directive('focus', {inserted: function (el) {el.focus();}});Vue.filter('format', function(value, arg) {function dateFormat(date, format) {if (typeof date === "string") {var mts = date.match(/(\/Date\((\d+)\)\/)/);if (mts && mts.length >= 3) {date = parseInt(mts[2]);}}date = new Date(date);if (!date || date.toUTCString() == "Invalid Date") {return "";}var map = {"M": date.getMonth() + 1, //月份 "d": date.getDate(), //日 "h": date.getHours(), //小時 "m": date.getMinutes(), //分 "s": date.getSeconds(), //秒 "q": Math.floor((date.getMonth() + 3) / 3), //季度 "S": date.getMilliseconds() //毫秒 };format = format.replace(/([yMdhmsqS])+/g, function(all, t) {var v = map[t];if (v !== undefined) {if (all.length > 1) {v = '0' + v;v = v.substr(v.length - 2);}return v;} else if (t === 'y') {return (date.getFullYear() + '').substr(4 - all.length);}return all;});return format;}return dateFormat(value, arg);})var vm = new Vue({el: '#app',data: {flag: false,submitFlag: false,id: '',name: '',books: []},methods: {handle: async function(){if(this.flag) {// 編輯圖書var ret = await axios.put('books/' + this.id, {name: this.name});if(ret.status == 200){// 重新加載列表數據this.queryData();}this.flag = false;}else{// 添加圖書var ret = await axios.post('books', {name: this.name})if(ret.status == 200) {// 重新加載列表數據this.queryData();}}// 清空表單this.id = '';this.name = '';},toEdit: async function(id){// flag狀態位用于區分編輯和添加操作this.flag = true;// 根據id查詢出對應的圖書信息var ret = await axios.get('books/' + id);this.id = ret.id;this.name = ret.name;},deleteBook: async function(id){// 刪除圖書var ret = await axios.delete('books/' + id);if(ret.status == 200) {// 重新加載列表數據this.queryData();}},queryData: async function(){// 調用后臺接口獲取圖書列表數據// var ret = await axios.get('books');// this.books = ret.data;this.books = await axios.get('books');}},computed: {total: function(){// 計算圖書的總數return this.books.length;}},watch: {name: async function(val) {// 驗證圖書名稱是否已經存在// var flag = this.books.some(function(item){// return item.name == val;// });var ret = await axios.get('/books/book/' + this.name);if(ret.status == 1) {// 圖書名稱存在this.submitFlag = true;}else{// 圖書名稱不存在this.submitFlag = false;}}},mounted: function(){// var that = this;// axios.get('books').then(function(data){// console.log(data.data)// that.books = data.data;// })// axios.get('books').then((data)=>{// console.log(data.data)// this.books = data.data;// })this.queryData();}});</script> </body> </html>參考接口文檔
圖書管理后臺接口文檔
基準路徑: http://localhost:3000/
獲取圖書列表數據
- 路徑:books
- 請求參數:無
- 響應結果
添加圖書-提交圖書信息
- 路徑:books
- 請求參數
- name : 圖書名稱
- 響應結果
編輯圖書-根據ID查詢圖書信息
- 路徑:books/:id
- 請求參數:無
- 響應結果
編輯圖書-提交圖書信息
- 路徑:books/:id
- 請求參數
- name : 圖書名稱
- 響應結果
刪除圖書信息
- 路徑:books/:id
- 請求參數: 無
- 響應結果
驗證圖書名稱是否存在
- 路徑:books/book/:name
- 請求參數:無
- 響應結果
總結
以上是生活随笔為你收集整理的vue-day04-vue前端交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发现还是 True Image Serv
- 下一篇: vue学习笔记-01-前端的发展历史(从