介紹
Vue Router
是Vue.js官方提供的路由管理庫,用于實現前端應用的路由功能。它可以將前端路由映射到Vue組件,實現頁面的切換和導航等功能。Vue Router支持嵌套路由、路由參數、路由守衛等高級功能,能夠滿足各種復雜的路由需求。Vuex
是Vue.js官方提供的狀態管理庫,用于集中管理應用程序中的狀態。它將應用程序中的數據存儲在一個全局的store中,并提供了一些API來改變狀態和獲取狀態。Vuex的核心概念包括state(存儲應用程序的狀態)、mutations(用于改變狀態的方法)、actions(用于異步操作和提交mutations的方法)等。通過Vuex,可以實現狀態在組件間的共享和管理,提供了更好地組織和協調組件間的通信和數據流動。Axios
是一個基于Promise的HTTP客戶端庫,用于在瀏覽器和Node.js中發起HTTP請求。它提供了一系列的API來發送請求、攔截請求和響應、處理錯誤等。Axios支持瀏覽器的XMLHttpRequest和Node.js的http模塊,提供了更簡潔、易用和可配置的接口。在Vue.js開發中,Axios通常用于與后端API進行通信,發送異步請求獲取數據。Element UI
是一套基于 Vue.js 的桌面端 UI 組件庫,它提供了豐富的可復用組件,方便開發者快速構建現代化、美觀的 Web 應用程序。
安裝
項目根目錄下打開終端或命令行工具,運行以下命令來安裝相關依賴包:
npm install vue-router@3.0.1 vuex@3.0.1 axios element-ui --save
vue-router
1. 在 src/
目錄下新建 views
目錄。在此目錄中新建一個名為 404.vue
的文件,并添加以下內容:
<template>
<div class="error">
<div class="imgWrapper">
<img src="@img/errorPages/404.png" alt="404">
</div>
</div>
</template>
<style lang="less" scoped>
.error {
display: grid;
place-items: center;
height: 100vh;
}
</style>
404.png
圖片如果未添加會編譯報錯,找一張圖片放上去或者刪除圖片放入自己的文字即可。
2. 在 src/
目錄下找到并打開 App.vue
文件,用以下內容直接覆蓋現有內容:
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
<router-view>
是 Vue Router 提供的組件,用于在 Vue 應用中展示當前路由對應的組件內容。它作用類似于一個占位符,它定義了一個容器,在路由切換時,會根據不同的路由匹配,動態渲染對應的組件內容。
3. 在 src/
目錄下新建 router
目錄。在此目錄中新建一個名為 index.js
的文件,并添加以下內容:
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const pages = [
{
path: '/home',
component: (resolve) => require(['@/components/HelloWorld.vue'], resolve)
},
{
path: '/errorPage/404',
component: (resolve) => require(['@/views/404.vue'], resolve)
}
]
const router = new VueRouter({
routes: [
// 默認路由
{
path: '/',
redirect: '/home'
},
// 頁面路由
...pages,
// 沒有匹配的路由重定向到404頁面
{
path: '*',
redirect: '/errorPage/404'
}
]
})
// 路由跳轉前
router.beforeEach((to, from, next) => {
// 可用于攔截導航并執行一些操作,例如驗證用戶身份、權限控制等。
next()
})
// 路由跳轉后
router.afterEach((to, from) => {
window.scrollTo(0, 0) // 每次路由改變滾動條都回到頂部
})
export default router
這段代碼是一個基于Vue Router的路由配置。
以下是對代碼的解釋:
Vue.use(VueRouter)
是通過Vue.use()
方法來全局注冊 Vue Router 插件,使得我們可以在 Vue 實例中使用 Vue Router 的功能。const pages = [... ]
定義了一個數組變量pages
,用于存儲頁面路由配置。每個頁面路由配置以對象表示,對象中包括一個路由路徑path
和對應的組件component
。
這里使用了一個按需加載的方式,可以在需要時異步加載組件:
(resolve) => require(['xxx.vue'], resolve)
表示在路由激活時動態加載組件,并將解析后的組件傳遞給resolve
回調函數。換言之,當訪問對應的路由路徑時,路由系統會動態加載組件并渲染到匹配的路由視圖中。const router = new VueRouter({...})
是創建一個 Vue Router 實例,并配置其中的路由。在這里,路由配置包含三部分:
默認路由:將根路徑/
重定向到/home
路徑。
頁面路由:使用展開運算符...
將pages
數組中的頁面路由配置添加到路由配置中。
沒有匹配的路由重定向到404
頁面:當用戶訪問不存在的路徑時,將自動重定向到/errorPage/404
路徑。router.beforeEach((to, from, next) => {...})
是路由跳轉前的鉤子函數。在其中可以執行一些操作,例如驗證用戶身份、權限控制等。在這段代碼中,鉤子函數邏輯為空,即不執行任何操作。router.afterEach((to, from) => {...})
是路由跳轉后的鉤子函數。在這里,使用window.scrollTo(0, 0)
將滾動條位置重置為頂部,以確保每次路由改變時都會回到頂部。
4. 打開 src/main.js
文件,掛載到Vue實例:
import router from './router'
new Vue({
router
})
修改后的代碼如下:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import '@css/index.less'
// 禁用生產環境提示
Vue.config.productionTip = false
new Vue({
router,
render: (h) => h(App)
}).$mount('#app')
vuex
1. 在 src/
目錄下新建 store
目錄。在此目錄中新建一個名為 index.js
的文件,并添加以下內容:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 本地存儲-修改
const storageSet = (key, value) => {
localStorage.setItem(key, JSON.stringify(value))
}
// 本地存儲-獲取
const storageGet = (key) => {
return JSON.parse(localStorage.getItem(key))
}
export default new Vuex.Store({
// 數據源 使用:this.$store.state.xxx
state: {
user: {} // 用戶信息
},
// 派生數據 使用:this.$store.getters.xxx
getters: {
// 獲取當前-用戶對象
GET_USER(state) {
state.user = storageGet('STORE_USER') || {}
return state.user
}
},
// 更改數據-同步 使用:this.$store.commit('xxx', data)
mutations: {
// 保存當前-用戶對象
SET_USER(state, data) {
state.user = data
storageSet('STORE_USER', data)
}
},
// mutations裝飾器-異步
actions: {
}
})
這段代碼是一個基于 Vue 和 Vuex 的狀態管理工具的配置。以下是對代碼的解釋:
Vue.use(Vuex)
是通過Vue.use()
方法來全局注冊 Vuex 插件,使得我們可以在 Vue 實例中使用 Vuex 的功能。const storageSet = (key, value) => {...} 和 const storageGet = (key) => {...}
是兩個輔助函數,用于將數據存儲在本地的localStorage
中,并且可以在需要時獲取該數據。new Vuex.Store({...})
是創建一個 Vuex 的 Store 實例。這個實例將包含 Vuex 的核心架構和一些選項來定義應用程序的狀態管理。state
屬性用于定義倉庫store
的初始狀態,其中user
是一個空對象,用于存儲用戶信息。getters
屬性是派生狀態的計算屬性,允許我們從倉庫的數據中獲取一些衍生狀態。GET_USER getter
用于獲取當前用戶對象。mutations
屬性定義了一些同步方法,用來修改倉庫的狀態。在這里,只有一個SET_USER mutation
方法用于保存當前用戶對象,并同時將其存儲在本地localStorage
中。actions
屬性中可以定義一些異步方法,在需要時執行異步操作,并最終調用mutations
中的方法來修改狀態。
2. 打開 src/main.js
文件,掛載到Vue實例:
import store from './store'
new Vue({
store
})
修改后的代碼如下:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import '@css/index.less'
// 禁用生產環境提示
Vue.config.productionTip = false
new Vue({
router,
store,
render: (h) => h(App)
}).$mount('#app')
axios
在 src/
目錄下新建 api
目錄。在此目錄中新建一個名為 index.js 的文件,并添加以下內容:
import Vue from 'vue'
import axios from 'axios'
// 設置超時時長
axios.defaults.timeout = '60000'
// request攔截器
axios.interceptors.request.use((config) => {
return config
}, (error) => {
return Promise.reject(error)
})
// responese攔截器
axios.interceptors.response.use((res) => {
return res
}, (error) => {
return Promise.reject(error)
})
/**
* 設置請求header
* @param {Object} headers
*/
const setHeader = (headers) => {
for (const key in headers) {
axios.defaults.headers[key] = headers[key]
}
}
/**
* POST請求
* @param {String} url 地址
* @param {Object} params 參數
* @param {Object} headers headers
*/
export const methodPost = (url, params, headers = {}) => {
return new Promise((resolve, reject) => {
setHeader(headers)
axios.post(url, params).then((response) => {
resolve(response.data)
}).catch((error) => {
reject(error)
})
})
}
/**
* 文件上傳
* @param {String} url 地址
* @param {File} file 文件
*/
export const methodUpload = (url, file) => {
return new Promise((resolve, reject) => {
const formData = new FormData()
formData.append('file', file)
formData.append('currentDate', Date.now())
axios.post(url, formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
}).then((response) => {
resolve(response.data)
}).catch((error) => {
reject(error)
})
})
}
這段代碼是一個配置了axios 網絡請求庫的請求攔截器和響應攔截器,以及一些封裝的請求方法。
以下是對代碼的解釋:
axios.defaults.timeout = '60000'
設置了axios的默認超時時長為60秒。axios.interceptors.request.use((config) => {...}, (error) => {...})
是請求攔截器,用于在發送請求之前對請求進行一些處理。在這里,通過config
來獲取請求配置,可以對請求進行一些修改或處理,然后返回修改后的請求配置。如果在請求發送過程中發生錯誤,將會被catch
到并返回一個rejected
狀態的Promise
。axios.interceptors.response.use((res) => {...}, (error) => {...})
是響應攔截器,用于在接收到響應后對響應進行一些處理。在這里,通過res
來獲取響應數據,可以對響應進行一些修改或處理,然后返回修改后的響應數據。如果在響應過程中發生錯誤,將會被catch
到并返回一個rejected
狀態的Promise
。const setHeader = (headers) => {...}
是一個工具函數,用于設置請求的header
。將傳入的header
參數遍歷,并將其設置到axios
的默認headers
中。export const methodPost = (url, params, headers = {}) => {...}
是一個封裝的POST
請求方法。該方法接收一個url
、一個params
對象和一個可選的headers
對象作為參數,使用axios.post
方法發送POST
請求,并返回一個Promise
對象。如果請求成功,將會將響應數據作為resolved
狀態返回;如果請求失敗,將會將錯誤作為rejected
狀態返回。export const methodUpload = (url, file) => {...}
是一個文件上傳方法。該方法接收一個url
和一個file
對象作為參數,使用FormData
將file
對象附加到請求體中,并將請求發送到指定的url
。同樣,該方法也返回一個Promise
對象,在上傳成功時將響應數據作為resolved
狀態返回,失敗時將錯誤作為rejected
狀態返回。
這些封裝的請求方法可以方便地在應用中進行網絡請求,并對請求和響應進行統一的處理。
通過下面的方式便可引入調用:
import { methodPost } from '@/api'
methodPost('接口地址', {}).then((res) => {
// 請求成功
}).catch((err) => {
// 請求失敗
})
element-ui
1. 打開 src/main.js
文件,掛載到Vue實例:
import Element from 'element-ui'
import "element-ui/lib/theme-chalk/index.css"
// Element掛載到Vue
Vue.$message = Element.Message
Vue.use(Element)
修改后的代碼如下:
import Vue from 'vue'
import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'
import router from './router'
import store from './store'
import '@css/index.less'
// 禁用生產環境提示
Vue.config.productionTip = false
// Element掛載到Vue
Vue.$message = Element.Message
Vue.use(Element)
new Vue({
router,
store,
render: (h) => h(App)
}).$mount('#app')
2. 打開之前創建的 src/api/index.js
文件,找到以下代碼塊:
// responese攔截器
axios.interceptors.response.use((res) => {
return res
}, (error) => {
return Promise.reject(error)
})
在添加 Vue.$message.error(error.toString())
代碼, 如下:
// responese攔截器
axios.interceptors.response.use((res) => {
return res
}, (error) => {
Vue.$message.error(error.toString())
return Promise.reject(error)
})
這樣響應時的錯誤信息就能通過 Element 的 Message 組件來顯示了。
更多組件的使用方式,可到 element-ui 官方文檔 中查看。
框架搭建整體流程
-
第一步 Vue2 使用 Vue 腳手架 Vue CLI 搭建一個 Vue.js 前端項目框架
-
第二步 Vue2 vue.config.js 基礎配置,路徑別名alias
-
第三步 Vue2 vue.config.js 集成 Less 配置 sourceMap+全局變量
-
第四步 Vue2 配置ESLint
-
第五步 Vue2 vue.config.js 使用image-minimizer-webpack-plugin配置圖片壓縮
-
第六步 Vue2 集成全家桶 vue-router vuex axios 和 element-ui
-
第七步 Webpack 配置多環境和全局變量 cross-env 和 webpack.DefinePlugin