插值操做
Mustache
(雙大括號)javascript
V-once
元素只渲染一次,不會隨着數據改變而改變 <h2 v-once>{{message}}</h2>
v-html
按照html格式解析 <div id="app"> <h2>{{url}}</h2>//結果是<a href="http://www.baidu.com">百度一下</a> <h2 v-html="url"></h2> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊', url: '<a href="http://www.baidu.com">百度一下</a>' } }) </script>
v-text
和mustache同樣 <div id="app"> <h2>{{message}}, 李銀河!</h2> <h2 v-text="message">, 李銀河!</h2> </div>
v-pre
<div id="app"> <h2>{{message}}</h2> <h2 v-pre>{{message}}</h2>//直接顯示message </div>
v-cloak
<style> [v-cloak] { display: none; } </style> </head> <body> <div id="app" v-cloak> <h2>{{message}}</h2> </div> <script src="../js/vue.js"></script> <script> // 在vue解析以前, div中有一個屬性v-cloak // 在vue解析以後, div中沒有一個屬性v-cloak //vue來不及渲染,直接顯示源代碼,加這個屬性就行
綁定屬性
v-bind
<img :src="imgURL" alt=""> <a :href="aHref">百度一下</a> //圖片的連接src、網站的連接href、動態綁定一些類、樣式 <script> const app = new Vue({ el: '#app', data: { message: '你好啊', imgURL: 'https://img11.360buyimg.com/mobilecms/s350x250_jfs/t1/20559/1/1424/73138/5c125595E3cbaa3c8/74fc2f84e53a9c23.jpg!q90!cc_350x250.webp', aHref: 'http://www.baidu.com' } }) </script>
<h2 class="title" v-bind:class="{active: isActive}">{{message}}</h2> <h2 class="title" v-bind:class="getClasses()">{{message}}</h2> <h2 class="title" :class="[active]">{{message}}</h2> <button v-on:click="btnClick">按鈕</button> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊', isActive: true, }, methods: { btnClick: function () { this.isActive = !this.isActive }, getClasses: function () { return {active: this.isActive} } } }) </script>
:style
<h2 :style="{fontSize: finalSize + 'px', backgroundColor: finalColor}">{{message}}</h2> <h2 :style="getStyles()">{{message}}</h2>
<div id="app"> <h2 :style="[baseStyle, baseStyle1]">{{message}}</h2> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊', baseStyle: {backgroundColor: 'red'}, baseStyle1: {fontSize: '100px'}, } }) </script>
計算屬性
計算屬性和methods的區別:css
計算屬性會進行緩存,若是屢次使用時,計算屬性只會調用一次。html
computed: { // fullName: function () { // return this.firstName + ' ' + this.lastName // } // name: 'coderwhy' // 計算屬性通常是沒有set方法, 只讀屬性. fullName: { set: function(newValue) { // console.log('-----', newValue); const names = newValue.split(' '); this.firstName = names[0]; this.lastName = names[1]; }, get: function () { return this.firstName + ' ' + this.lastName } }, }
事件監聽
參數問題
<div id="app"> <!--1.事件調用的方法沒有參數--> <button @click="btn1Click()">按鈕1</button> <button @click="btn1Click">按鈕1</button> <!--2.在事件定義時, 寫方法時省略了小括號, 可是方法自己是須要一個參數的, 這個時候, Vue會默認將瀏覽器生產的event事件對象做爲參數傳入到方法--> <!--<button @click="btn2Click(123)">按鈕2</button>--> <!--<button @click="btn2Click()">按鈕2</button>--> <button @click="btn2Click">按鈕2</button> <!--3.方法定義時, 咱們須要event對象, 同時又須要其餘參數--> <!-- 在調用方式, 如何手動的獲取到瀏覽器參數的event對象: $event--> <button @click="btn3Click(abc, $event)">按鈕3</button> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊', abc: 123 }, methods: { btn1Click() { console.log("btn1Click"); }, btn2Click(event) { console.log('--------', event); }, btn3Click(abc, event) { console.log('++++++++', abc, event); } } }) // 若是函數須要參數,可是沒有傳入, 那麼函數的形參爲undefined // function abc(name) { // console.log(name); // } // // abc() </script>
修飾符
<div id="app"> <!--1. .stop修飾符的使用--> <div @click="divClick"> aaaaaaa <button @click.stop="btnClick">按鈕</button> </div> <!--2. .prevent修飾符的使用--> <br> <form action="baidu"> <input type="submit" value="提交" @click.prevent="submitClick"> </form> <!--3. .監聽某個鍵盤的鍵帽--> <input type="text" @keyup.enter="keyUp"> <!--4. .once修飾符的使用--> <button @click.once="btn2Click">按鈕2</button> </div>
條件判斷
key的問題
//切換類型後還會保留原來的內容,由於vue在進行dom渲染時,會複用存在的元素,而不是建立新的元素,添加不一樣的能夠就能解決這個問題 <div id="app"> <span v-if="isUser"> <label for="username">用戶帳號</label> <input type="text" id="username" placeholder="用戶帳號" > </span> <span v-else> <label for="email">用戶郵箱</label> <input type="text" id="email" placeholder="用戶郵箱" > </span> <button @click="isUser = !isUser">切換類型</button> </div>
<div id="app"> <span v-if="isUser"> <label for="username">用戶帳號</label> <input type="text" id="username" placeholder="用戶帳號" key="username"> </span> <span v-else> <label for="email">用戶郵箱</label> <input type="text" id="email" placeholder="用戶郵箱" key="email"> </span> <button @click="isUser = !isUser">切換類型</button> </div>
v-if和v-show的區別
v-if:條件爲false,不會存在dom中vue
v-show:條件爲false,會添加行內樣式display:nonejava
循環遍歷
遍歷數組
<div id="app"> <!--1.在遍歷的過程當中,沒有使用索引值(下標值)--> <ul> <li v-for="item in names">{{item}}</li> </ul> <!--2.在遍歷的過程當中, 獲取索引值--> <ul> <li v-for="(item, index) in names"> {{index+1}}.{{item}} </li> </ul> </div>
遍歷對象
<div id="app"> <!--1.在遍歷對象的過程當中, 若是隻是獲取一個值, 那麼獲取到的是value--> <ul> <li v-for="item in info">{{item}}</li> </ul> <!--2.獲取key和value 格式: (value, key) --> <ul> <li v-for="(value, key) in info">{{value}}-{{key}}</li> </ul> <!--3.獲取key和value和index 格式: (value, key, index) --> <ul> <li v-for="(value, key, index) in info">{{value}}-{{key}}-{{index}}</li> </ul> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { info: { name: 'why', age: 18, height: 1.88 } } }) </script>
遍歷時添加key
//能夠高效更新虛擬dom <ul> <li v-for="item in letters" :key="item">{{item}}</li> </ul>
檢查數組更新
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
// 1.push方法 // this.letters.push('aaa') this.letters.push('aaaa', 'bbbb', 'cccc') // 2.pop(): 刪除數組中的最後一個元素 this.letters.pop(); // 3.shift(): 刪除數組中的第一個元素 this.letters.shift(); // 4.unshift(): 在數組最前面添加元素 // this.letters.unshift() this.letters.unshift('aaa', 'bbb', 'ccc') // 5.splice做用: 刪除元素/插入元素/替換元素 // 刪除元素: 第二個參數傳入你要刪除幾個元素(若是沒有傳,就刪除後面全部的元素) // 替換元素: 第二個參數, 表示咱們要替換幾個元素, 後面是用於替換前面的元素 // 插入元素: 第二個參數, 傳入0, 而且後面跟上要插入的元素 // splice(start) // splice(start): //第二個參數:不傳=刪除後面全部,傳3=替換3個,傳0=插入的元素 this.letters.splice(1, 3, 'm', 'n', 'l', 'x') // this.letters.splice(1, 0, 'x', 'y', 'z') // 5.sort() this.letters.sort() // 6.reverse() this.letters.reverse() // 注意: 經過索引值修改數組中的元素 // this.letters[0] = 'bbbbbb'; // this.letters.splice(0, 1, 'bbbbbb') // set(要修改的對象, 索引值, 修改後的值) // Vue.set(this.letters, 0, 'bbbbbb')
雙向綁定
v-model的原理
首先須要實時獲取數據,那麼就須要:vlalue. 而後修改數據時,同步到data.那麼就須要@input方法實時把數據發到data
<div id="app"> <!--<input type="text" v-model="message">--> <input type="text" :value="message" @input="valueChange"> <!-- <input type="text" :value="message" @input="message = $event.target.value"> --> <h2>{{message}}</h2> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊' }, methods: { valueChange(event) { this.message = event.target.value; } } }) </script>
修飾符
<div id="app"> <!--1.修飾符: lazy--> <input type="text" v-model.lazy="message"> <h2>{{message}}</h2> <!--2.修飾符: number--> <input type="number" v-model.number="age"> <h2>{{age}}-{{typeof age}}</h2> <!--3.修飾符: trim--> <input type="text" v-model.trim="name"> <h2>您輸入的名字:{{name}}</h2> </div>
組件化開發
步驟解析
- Vue.extend()建立一個組件構造器,同時傳入自定義組件模板
- Vue.component()註冊組件,並給他起一個標籤名.因此須要傳組件構造器和標籤名
- 掛載Vue的實例下,不然不會生效
組件數據返回值
<div id="app"> <cpn></cpn> <cpn></cpn> <cpn></cpn> </div> <template id="cpn"> <div> <h2>當前計數: {{counter}}</h2> <button @click="increment">+</button> <button @click="decrement">-</button> </div> </template> <script src="../js/vue.js"></script> <script> // 1.註冊組件 const obj = { counter: 0 } Vue.component('cpn', { template: '#cpn', // data() { // return { // counter: 0 // } // }, data() { return obj }, methods: { increment() { this.counter++ }, decrement() { this.counter-- } } }) const app = new Vue({ el: '#app', data: { message: '你好啊' } }) </script>
props基本用法
//在這裏傳值,message是父組件的數據對象 <cpn :cmessage="message" :cmovies="movies"></cpn> //數組中的字符串就是傳遞時的名稱 props: ['cmovies', 'cmessage'] //這種能夠設置默認值,類型 props: { // 1.類型限制 // cmovies: Array, // cmessage: String, // 2.提供一些默認值, 以及必傳值 cmessage: { type: String, default: 'aaaaaaaa', required: true }, // 類型是對象或者數組時, 默認值必須是一個函數 cmovies: { type: Array, default() { return [] } } }
子組件向父組件傳值
自定義事件流程 1.在子組件經過$emit()來觸發事件 2.在父組件經過v-on來監聽子組件的事件
<!--父組件模板--> <div id="app"> <cpn @item-click="cpnClick"></cpn> </div> <!--子組件模板--> <template id="cpn"> <div> <button v-for="item in categories" @click="btnClick(item)"> {{item.name}} </button> </div> </template> <script src="../js/vue.js"></script> <script> // 1.子組件 const cpn = { template: '#cpn', data() { return { categories: [ {id: 'aaa', name: '熱門推薦'}, {id: 'bbb', name: '手機數碼'}, {id: 'ccc', name: '家用家電'}, {id: 'ddd', name: '電腦辦公'}, ] } }, methods: { btnClick(item) { // 發射事件: 自定義事件 this.$emit('item-click', item) } } } // 2.父組件 const app = new Vue({ el: '#app', data: { message: '你好啊' }, components: { cpn }, methods: { cpnClick(item) { console.log('cpnClick', item); } } }) </script>
組件訪問
<div id="app"> <cpn></cpn> <cpn></cpn> <cpn ref="aaa"></cpn> <button @click="btnClick">按鈕</button> </div> <template id="cpn"> <div>我是子組件</div> </template> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊' }, methods: { btnClick() { // 1.$children console.log(this.$children); for (let c of this.$children) { console.log(c.name); c.showMessage(); } // 2.$refs => 對象類型, 默認是一個空的對象 ref='bbb' console.log(this.$refs.aaa.name); } }, components: { cpn: { template: '#cpn', data() { return { name: '我是子組件的name' } }, methods: { showMessage() { console.log('showMessage'); } } }, } }) </script>
//子組件訪問父組件 //不推薦使用,耦合過高了 // 1.訪問父組件$parent console.log(this.$parent); console.log(this.$parent.name); // 2.訪問根組件$root console.log(this.$root); console.log(this.$root.message);
插槽slot
封裝原則:保留共性,將不一樣暴露爲插槽ios
- 若是有多個值, 同時放入到組件進行替換時, 一塊兒做爲替換元素
插槽做業域
父組件替換插槽的標籤,內容由子組件提供web
<div id="app"> <cpn></cpn> <cpn> <!--目的是獲取子組件中的pLanguages--> <template slot-scope="slot"> <!-- <span v-for="item in slot.data"> - {{item}}</span> --> <!-- <span>{{slot.data.join(' - ')}}</span> --> </template> </cpn> </div> <template id="cpn"> <div> <slot :data="pLanguages"> <ul> <li v-for="item in pLanguages">{{item}}</li> </ul> </slot> </div> </template> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { message: '你好啊' }, components: { cpn: { template: '#cpn', data() { return { pLanguages: ['JavaScript', 'C++', 'Java', 'C#', 'Python', 'Go', 'Swift'] } } } } }) </script>
Webpack
導入
// 1.使用commonjs的模塊化規範 const {add, mul} = require('./js/mathUtils.js') console.log(add(20, 30)); console.log(mul(20, 30)); // 2.使用ES6的模塊化的規範 import {name, age, height} from "./js/info"; console.log(name); console.log(age); console.log(height); // 3.依賴css文件 require('./css/normal.css')
Vue-router
history.pushStath({},'','/home') //有歷史記錄 historyreplaceState({},'','/foo/bar') //沒歷史記錄 history.back() 等價於 history.go(-1) history.forward() 則等價於 history.go(1)
使用vue-router步驟
- 建立router實例並掛載到vue實例中
- 建立路由組件
- 配置路由映射關係:組件和路徑的映射關係
- 使用路由:經過<router-link>和<router-view>
router實例 import VueRouter from 'vue-router' import Vue from 'vue' import Home from '../components/Home' import About from '../components/About' //注入插件 Vue.use(VueRouter) //定義路由 const routes =[ {path:'',redirect:'/home'}, {path:'/home',component:Home}, {path:'/about',component:About} ] //建立router實例 const router = new VueRout({ routes, mode:'history', linkActiveClass:'active' }) export default router
掛載到vue實例中 import Vue from 'vue' import App from './App' import router from './router' new Vue({ el:'#app', router, render:h=>h(App) })
使用路由 <template> <div id="app"> <router-link to="/home">首頁</router-link> <router-link to="/about">關於</router-link> <router-view></router-view> //能夠用這種方法替代組件 //<button @click="homeClick">首頁</button> //<button @click="aboutClick">關於</button> </div> </template> export default{ name:'App', methods:{ homeClick(){ //至關於pushstate this.$router.push('/home') }, aboutClick(){ this.$router.replace('/about') } } }
router-link
tag: tag能夠指定<router-link>以後渲染成什麼組件, 好比上面的代碼會被渲染成一個<li>元素, 而不是<a> replace: replace不會留下history記錄, 因此指定replace的狀況下, 後退鍵返回不能返回到上一個頁面中 active-class: 當<router-link>對應的路由匹配成功時, 會自動給當前元素設置一個router-link-active的class <router-link to="/home" tag="button" replace active-class="active">首頁</router-link> <router-link to="/about" tag="button" replace active-class="active">關於</router-link>
動態路由
//router routes這麼配置 { path: '/user/:id', component: User, meta: { title: '用戶' }, },
//地址這麼寫 <router-link to="/user/123">用戶</router-link>
//路由對應的組件 <h2>{{userId}}</h2> <h2>{{$route.params.id}}</h2> //這樣也行 computed: { userId() { return this.$route.params.id } },
路由懶加載
//在router這麼導入組件 const Home = () => import('../components/Home')
嵌套路由
步驟正則表達式
- 建立子組件,並在路由映射中配置
- 在組件內部使用<router-view>標籤
{ path: '/home', component: Home, meta: { title: '首頁' }, children: [ //能夠配置默認路由 // { // path: '', // redirect: 'news' // }, { path: 'news', component: HomeNews }, { path: 'message', component: HomeMessage } ] },
home組件 <router-link to="/home/news">新聞</router-link> <router-link to="/home/message">消息</router-link> <router-view></router-view>
傳遞參數
params的類型:
配置路由格式: /router/:id 傳遞的方式: 在path後面跟上對應的值 傳遞後造成的路徑: /router/123, /router/abcvue-router
query的類型:
配置路由格式: /router, 也就是普通配置 傳遞的方式: 對象中使用query的key做爲傳遞方式 傳遞後造成的路徑: /router?id=123, /router?id=abc編程
<router-link :to="'/user/'+userId">用戶</router-link> <router-link :to="{path: '/profile', query: {name: 'why', age: 18, height: 1.88}}">
js方式 profileClick() { this.$router.push({ path: '/profile', query: { name: 'kobe', age: 19, height: 1.87 } }) }
獲取參數
獲取參數是經過$route對象獲取
<h2>{{$route.query.name}}</h2> <h2>{{$route.query.age}}</h2> <h2>{{$route.query.height}}</h2> <h2>{{$route.params.id}}</h2>
route和router區別
route能夠獲取name,path,query,params等
routers vueRouter的實例,導航到不一樣的URL就用$router.push()方法
導航守衛
導航鉤子的三個參數解析: to: 即將要進入的目標的路由對象. from: 當前導航即將要離開的路由對象. next: 調用該方法後, 才能進入下一個鉤子.
能夠利用beforeEach來完成標題的修改
步驟
- 在路由中添加標題
- 利用導航守衛修改標題
{ path: '/about', component: About, meta: { title: '關於'//在這定義標題 }, beforeEnter: (to, from, next) => { //建立路由獨享守衛 // console.log('about beforeEnter'); next() } },
// 前置守衛(guard) router.beforeEach((to, from, next) => { document.title = to.matched[0].meta.title//修改標題 // console.log('執行完這行就執行afterEach方法'); next() })
// 後置鉤子(hook)不須要主動調用next()函數. router.afterEach((to, from) => { // console.log('----'); })
Keep-alive
keep-alive 是 Vue 內置的一個組件,可使被包含的組件保留狀態,或避免從新渲染。
//include - 字符串或正則表達,只有匹配的組件會被緩存 //exclude - 字符串或正則表達式,任何匹配的組件都不會被緩存 <keep-alive exclude="Profile,User">//不要隨便加空格 <router-view/> </keep-alive>
Promise
//普通方式 new Promise((resolve,reject){ setTimeout(()=>{ //成功執行resolve resolve('Hello World') //失敗執行reject reject("error message") }) }).then((data)=>{ //處理代碼 conssole.log(data) }).catch((err)=>{ //錯誤時執行這裏 console.log(err) })
//另一種方式,resolve和reject寫在then裏 new Promise((resolve,reject)){ setTimeout(()=>{ //正確時執行 resolve('Hello') //錯誤時執行 reject('error') },1000) }.then(data=>{ console.log(data) },err=>{ console.log(err) })
//鏈式編程 new Promise((resolve, reject) => { setTimeout(() => { resolve('aaa') }, 1000) }).then(res => { // 1.本身處理10行代碼 console.log(res, '第一層的10行處理代碼'); // 2.對結果進行第一次處理 return new Promise((resolve, reject) => { // resolve(res + '111') reject('err') }) }).then(res => { console.log(res, '第二層的10行處理代碼'); return new Promise(resolve => { resolve(res + '222') }) }).then(res => { console.log(res, '第三層的10行處理代碼'); }).catch(err => { console.log(err); })
//普通寫法 return new Promise((resolve,reject)=>{ resolve(res+'111') }) //縮寫 return Promise.resolve(res+"111") //省略 return res+'111'
異步操做
普通方式 1. 發送對象 a.對象裏攜帶參數信息 b.成功執行的方法 2.action裏發起async //組件方法 updateInfo() { this.$store.dispatch('aUpdateInfo', { message: '我是攜帶的信息', success: () => { console.log('裏面已經完成了'); } } //action方法 aUpdateInfo(context, payload) { setTimeout(() => { context.commit('updateInfo') console.log(payload.message); payload.success() }, 1000) } promise方式 1.發送參數信息 2.action返回promise對象 a.promise對象裏發起async 3.在組件執行then方法 //組件方法 updateInfo() { this.$store .dispatch('aUpdateInfo', '我是攜帶的信息') .then(res => { console.log('裏面完成了提交'); console.log(res); }) } //action方法 aUpdateInfo(context, payload) { return new Promise((resolve, reject) => { setTimeout(() => { context.commit('updateInfo'); console.log(payload); resolve('1111111') }, 1000) }) }
all方法
Promise.all([ new Promise((resolve, reject) => { setTimeout(() => { resolve({name: 'why', age: 18}) }, 2000) }), new Promise((resolve, reject) => { setTimeout(() => { resolve({name: 'kobe', age: 19}) }, 1000) }) ]).then(results => { console.log(results); })
VueX
核心概念
- State
- getters
- Mutation
- action
- module
getters
//普通寫法 powerCounter(state) { return state.counter * state.counter }
//傳參數寫法 //在組件中這麼寫 <h2>{{$store.getters.moreAgeStu(12)}}</h2> //getters這麼寫 moreAgeStu(state) { // return function (age) { // return state.students.filter(s => s.age > age) // } return age => { return state.students.filter(s => s.age > age) } }
mutation
//不傳參數寫法 //在組件這麼寫方法 subtraction() { this.$store.commit('decrement') } //在mutation這麼寫 decrement(state) { state.counter-- }
//傳參數寫法 //在組件中這麼寫方法 addCount(count) { // payload: 負載 // 1.普通的提交封裝 //這麼寫,payload就是參數 // this.$store.commit('incrementCount', count) // 2.特殊的提交封裝 //若是這麼寫,mutation要拿到參數須要payload.參數 this.$store.commit({ type: 'incrementCount', count }) }, //在mutation中這麼寫 incrementCount(state, payload) { // console.log(count); state.counter += payload.count },
響應規則
//能夠實時響應 Vue.set(state.info, 'address', '洛杉磯') Vue.delete(state.info, 'age') //不能夠實時響應 state.info['address'] = '洛杉磯' delete state.info.age
action
沒參數
//調用action方法,在組件中這麼寫 asyncUpdateName() { this.$store.dispatch('aUpdateName') } //action方法 aUpdateName(context) { console.log(context); setTimeout(() => { context.commit('updateName', 'wangwu') }, 1000) }
有參數時
//有參數 //在組件這麼寫 updateInfo() { // this.$store.dispatch('aUpdateInfo', { // message: '我是攜帶的信息', // success: () => { // console.log('裏面已經完成了'); // } // }) this.$store .dispatch('aUpdateInfo', '我是攜帶的信息') .then(res => { console.log('裏面完成了提交'); console.log(res); }) } //在action這麼寫 // aUpdateInfo(context, payload) { // setTimeout(() => { // context.commit('updateInfo') // console.log(payload.message); // payload.success() // }, 1000) // }, aUpdateInfo(context, payload) { return new Promise((resolve, reject) => { setTimeout(() => { context.commit('updateInfo'); console.log(payload); resolve('1111111') }, 1000) }) }
module
//獲取a模塊的state <h2>{{$store.state.a.name}}</h2> //調用a模塊的mutation,getters直接調用就行,不用加模塊名
Getters接收根節點的數據
getters: { fullname(state) { return state.name + '11111' }, fullname2(state, getters) { return getters.fullname + '2222' }, fullname3(state, getters, rootState) { return getters.fullname2 + rootState.counter } }
action接收根節點數據
//局部狀態經過 context.state 暴露出來,根節點狀態則爲 context.rootState actions: { aUpdateName(context) {//也能夠用對象結構aUpdateName({state,commit,rootState}){} console.log(context); console.log("iiiii"); setTimeout(() => { context.commit('updateName', 'wangwu') }, 1000) } }
axios
export function request(config) { // 1.建立axios的實例 const instance = axios.create({ baseURL: 'http://123.207.32.32:8000', timeout: 5000 }) // 2.axios的攔截器 // 2.1.請求攔截的做用 instance.interceptors.request.use(config => { // console.log(config); // 1.好比config中的一些信息不符合服務器的要求 // 2.好比每次發送網絡請求時, 都但願在界面中顯示一個請求的圖標 // 3.某些網絡請求(好比登陸(token)), 必須攜帶一些特殊的信息 return config }, err => { // console.log(err); }) // 2.2.響應攔截 instance.interceptors.response.use(res => { // console.log(res); return res.data }, err => { console.log(err); }) // 3.發送真正的網絡請求 return instance(config) }
Vue配置
添加別名
//vue.config.js文件 module.exports = { configureWebpack: { resolve: { alias: { 'assets': '@/assets', 'common': '@/common', 'components': '@/components', 'network': '@/network', 'views': '@/views', } } } }