摘要:使用模擬好后端數(shù)據(jù)之后模擬數(shù)據(jù)的使用參考,就需要嘗試請(qǐng)求加載數(shù)據(jù)了。數(shù)據(jù)請(qǐng)求選擇了,現(xiàn)在都推薦使用。規(guī)定要發(fā)送到服務(wù)器的數(shù)據(jù)。布爾值,表示請(qǐng)求是否異步處理。要求為類型的參數(shù),請(qǐng)求成功后調(diào)用的回調(diào)函數(shù)。在一個(gè)中重寫(xiě)回調(diào)函數(shù)的字符串。
使用Mock模擬好后端數(shù)據(jù)之后(Mock模擬數(shù)據(jù)的使用參考:https://segmentfault.com/a/11...),就需要嘗試請(qǐng)求加載數(shù)據(jù)了。數(shù)據(jù)請(qǐng)求選擇了axios,現(xiàn)在都推薦使用axios。
axios(https://github.com/axios/axios)是基于 promise 的 HTTP 庫(kù)。如官網(wǎng)文檔介紹,npm i 之后,在需要的組件中加載就可以了。個(gè)人認(rèn)為,編碼的魅力在于,解決問(wèn)題的方法不止一種,有時(shí)候這個(gè)方法在你的開(kāi)發(fā)環(huán)境下ok,在我的開(kāi)發(fā)環(huán)境下卻不ok,所以,問(wèn)題是各式各樣的,而解決問(wèn)題的方法也是百花齊放的。
axios的入門 1、安裝npm i axios -S2、引入
在src目錄下新建apis.js文件(項(xiàng)目逐漸完善的過(guò)程中會(huì)有很有個(gè)api接口,當(dāng)然也可以命名為axios.js,命名是為了讓別人看懂),并引入: import axios from "axios"; 之后,編輯apis.js文件,考慮封裝axios.get或post請(qǐng)求3、apis.js文件的編輯
import axios from "axios"; const Domain = "http://localhost:8080"; // 定義根域名 axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; // 設(shè)置post提交數(shù)據(jù)的格式 // 封裝 post 請(qǐng)求 export function post(action, params){ return new Promise((resolve, reject) => { // url 判斷是測(cè)試環(huán)境 就要拿 測(cè)試環(huán)境的域名, 正式環(huán)境的就要用 正式域名 let url = Domain + action; axios.post(url, params) .then(response => { resolve(response.data) }) .catch(error => { reject(error) }) }); } // 封裝 get 請(qǐng)求 export function get(action, params){ return new Promise((resolve, reject) => { axios.get(Domain + action, params) .then(response => { resolve(response.data) }) .catch(error => { reject(error) }) }); } export default { postData(action, params){ return post(action, params) }, getData(action, params){ return get(action, params) } }4、在需要的組件中進(jìn)行引用
import api from "../../apis.js"; export default { name: "banner", data() { return { bannerList: [] }; }, created(){ this.getBanner(); // 在頁(yè)面渲染完成即加載 }, methods: { getBanner(){ this.$api.getData("/getBanner").then(val => { this.bannerList = val.imgs; }); } } }5、全局配置axios
很多組件都需要請(qǐng)求數(shù)據(jù),每用一次導(dǎo)入一次很麻煩,全局配置之后就不用在組件中導(dǎo)入了。
在入口文件main.js中引入,之后掛在vue的原型鏈上: import api from "./apis.js"; Vue.prototype.$http = api; 在組件中使用: getBanner(){ this.$http.getData("/getBanner").then(val => { this.bannerList = val.imgs; }); }6、axios結(jié)合vuex(在項(xiàng)目中還沒(méi)用到,如果有問(wèn)題,歡迎指正)
在vuex的倉(cāng)庫(kù)文件store.js中引用,使用action添加方法。action 可以包含異步操作,而且可以通過(guò) action 來(lái)提交 mutations。action有一個(gè)固有參數(shù)context,但是 context 是 state 的父級(jí),包含state、getters
import Vue from "Vue" import Vuex from "vuex" import axios from "axios" Vue.use(Vuex) export default new Vuex.Store({ // 定義狀態(tài) state: { banners: { name: "pic" } }, actions: { // 封裝一個(gè) ajax 方法 saveBanner (context) { axios({ method: "get", url: "/getBanner", data: context.state.banners }) } } })
在組件中發(fā)送請(qǐng)求的時(shí)候,需要使用 this.$store.dispatch 來(lái)分發(fā)
methods: { getBananer() { this.$store.dispatch("saveBanner") // actions里的方法名 } }異步加載的幾種方法 1、$.ajax( url[, settings])
url: 要求為String類型的參數(shù),(默認(rèn)為當(dāng)前頁(yè)地址)發(fā)送請(qǐng)求的地址。
type: 要求為String類型的參數(shù),請(qǐng)求方式(post或get)默認(rèn)為get。
data:規(guī)定要發(fā)送到服務(wù)器的數(shù)據(jù)。
async:布爾值,表示請(qǐng)求是否異步處理。默認(rèn)是 true。
dataType: 要求為String類型的參數(shù),預(yù)期服務(wù)器返回的數(shù)據(jù)類型。
contentType:要求為String類型的參數(shù),當(dāng)發(fā)送信息至服務(wù)器時(shí),內(nèi)容編碼類型默認(rèn)為"application/x-www-form-urlencoded"。
success:要求為Function類型的參數(shù),請(qǐng)求成功后調(diào)用的回調(diào)函數(shù)。
error:Function類型的參數(shù),請(qǐng)求失敗后調(diào)用的回調(diào)函數(shù)。
jsonp:在一個(gè) jsonp 中重寫(xiě)回調(diào)函數(shù)的字符串。
$(function(){ $("#send").click(function(){ $.ajax({ type: "GET", url: "test.json", data: {username:$("#username").val(), content:$("#content").val()}, dataType: "json", success: function(data){ // handle success } error: function(data){ // handle error } jsonp: "" }); }); });2、$.ajax 的跨域請(qǐng)求問(wèn)題
當(dāng)Ajax請(qǐng)求的url不是本地或者同一個(gè)服務(wù)器的地址時(shí),瀏覽器會(huì)報(bào)一個(gè)錯(cuò)誤:No "Access-Control-Allow-Origin" header is present on the requested resource. Origin…………由于瀏覽器的安全機(jī)制,不能調(diào)用不同服務(wù)器下的url地址。基于此,jQuery.ajax給出了jsonp的解決方案: 把服務(wù)器返回的數(shù)據(jù)類型設(shè)置為jsonp。
$(function(){ $("#send").click(function(){ $.ajax({ type: "GET", url: "test.json", data: {username:$("#username").val(), content:$("#content").val()}, dataType: "jsonp", // jsonp格式 success: function(data){ // handle success } error: function(data){ // handle error } jsonp: "callback" }); }); });
但是,jsonp是一種非官方的方法,而且這種方法只支持get請(qǐng)求,不如post請(qǐng)求安全。此外,jsonp需要服務(wù)器配合,如果是訪問(wèn)的是第三方服務(wù)器,我們沒(méi)有修改服務(wù)器的權(quán)限,那么這種方式是不可行的。
3、vue框架中的vue-resourceue-resource是Vue.js的一款插件,它可以通過(guò)XMLHttpRequest或JSONP發(fā)起請(qǐng)求并處理響應(yīng)。vue-resource體積小,支持主流瀏覽器。不過(guò),vue2.0之后就不再更新了,尤大神推薦使用axios。
{ // GET /someUrl this.$http.get("/someUrl").then(response => { // get body data this.someData = response.body; }, response => { // error callback }); }
全局配置post提交數(shù)據(jù)的格式:
Vue.http.options.emulateJSON = true;
全局配置根路徑:
Vue.http.options.root = "http://localhost:8080";4、vue-resource的跨域請(qǐng)求問(wèn)題
同樣地,由于瀏覽器的安全機(jī)制,vue-resource也面臨著跨域請(qǐng)求的問(wèn)題。解決方案如下:在vue項(xiàng)目下的 config/index.js 文件里面配置代理proxyTable:
dev: { // Paths assetsSubDirectory: "static", assetsPublicPath: "/", proxyTable: { // 新增,解決跨域請(qǐng)求問(wèn)題 "/api": { target: "http://192.168.1.103:8080/", changeOrigin: true, pathRewrite: { "`/api": "/" } }, secure: false }, target中寫(xiě)你想要請(qǐng)求數(shù)據(jù)的地址的域名4、axios跨域請(qǐng)求的問(wèn)題
與vue-resource一樣,在vue項(xiàng)目下的 config/index.js 文件里面配置代理proxyTable:
dev: { // Paths assetsSubDirectory: "static", assetsPublicPath: "/", proxyTable: { // 新增,解決跨域請(qǐng)求問(wèn)題 "/api": { target: "http://192.168.1.103:8080/", changeOrigin: true, pathRewrite: { "`/api": "/" } }, secure: false },
不過(guò)vue-resource和axios這兩個(gè)方法,可能配置了代理proxyTable還是會(huì)報(bào):No "Access-Control-Allow-Origin" header is present on ……的問(wèn)題,這需要后端服務(wù)器配合設(shè)置:
header("Access-Control-Allow-Origin", "*"); header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
emmmm,總感覺(jué)自己還是有點(diǎn)懵 233
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/100965.html
摘要:在本文中,我們將介紹一些在中發(fā)出請(qǐng)求的流行方法。是發(fā)出異步請(qǐng)求的傳統(tǒng)方式。如果等于,則表示請(qǐng)求已完成。是進(jìn)行調(diào)用的最簡(jiǎn)單方法之一。它需要三個(gè)參數(shù)請(qǐng)求的地址您要發(fā)送的數(shù)據(jù)和回調(diào)函數(shù)。事實(shí)上,這是制作請(qǐng)求的最佳和最喜歡的方式之一。 showImg(https://segmentfault.com/img/bVbdEhE?w=749&h=450);JavaScript具有很好的模塊和方法來(lái)發(fā)...
摘要:在本文中,我們將介紹一些在中發(fā)出請(qǐng)求的流行方法。是發(fā)出異步請(qǐng)求的傳統(tǒng)方式。如果等于,則表示請(qǐng)求已完成。是進(jìn)行調(diào)用的最簡(jiǎn)單方法之一。它需要三個(gè)參數(shù)請(qǐng)求的地址您要發(fā)送的數(shù)據(jù)和回調(diào)函數(shù)。事實(shí)上,這是制作請(qǐng)求的最佳和最喜歡的方式之一。 showImg(https://segmentfault.com/img/bVbdEhE?w=749&h=450);JavaScript具有很好的模塊和方法來(lái)發(fā)...
摘要:在日常開(kāi)發(fā)中,我們經(jīng)常會(huì)用到與后臺(tái)進(jìn)行數(shù)據(jù)交互,異步請(qǐng)求的情況一般分為兩種,小量數(shù)據(jù)下的一次性請(qǐng)求與大量數(shù)據(jù)下的連續(xù)或并發(fā)請(qǐng)求,這篇文章介紹的就是中斷在大量連續(xù)請(qǐng)求的情況下的作用和必要性。當(dāng)?shù)谝粋€(gè)請(qǐng)求完成后,第二個(gè)或者其他的請(qǐng)求并沒(méi)有完成。 在日常開(kāi)發(fā)中,我們經(jīng)常會(huì)用到ajax與后臺(tái)進(jìn)行數(shù)據(jù)交互,異步請(qǐng)求的情況一般分為兩種,小量數(shù)據(jù)下的一次性請(qǐng)求與大量數(shù)據(jù)下的連續(xù)或并發(fā)請(qǐng)求,這篇文章介...
摘要:我們先來(lái)看看構(gòu)造函數(shù)構(gòu)造函數(shù)就是用來(lái)實(shí)現(xiàn)攔截器的,這個(gè)構(gòu)造函數(shù)原型上有個(gè)方法。關(guān)于源碼,其實(shí)是比較簡(jiǎn)單的,都是用來(lái)操作該構(gòu)造函數(shù)的實(shí)例屬性的。存放攔截器方法,數(shù)組內(nèi)每一項(xiàng)都是有兩個(gè)屬性的對(duì)象,兩個(gè)屬性分別對(duì)應(yīng)成功和失敗后執(zhí)行的函數(shù)。 Axios源碼分析 - XHR篇 文章源碼托管在github上,歡迎fork指正! axios 是一個(gè)基于 Promise 的http請(qǐng)求庫(kù),可以用在瀏覽...
閱讀 3565·2021-09-24 09:48
閱讀 1087·2021-09-10 10:51
閱讀 3268·2019-08-30 13:03
閱讀 3315·2019-08-30 12:51
閱讀 1388·2019-08-30 11:22
閱讀 1052·2019-08-29 18:38
閱讀 2035·2019-08-29 16:41
閱讀 3183·2019-08-29 15:32