安裝
1.直接下載 / CDN
https://unpkg.com/vue-router/dist/vue-router.js
你也可以像https://unpkg.com/vue-router@2.0.0/dist/vue-router.js 這樣指定 版本號 或者 Tag。
在 Vue 後面載入 vue-router,它會自動安裝的:
<script src="/path/to/vue.js"></script>
<script src="/path/to/vue-router.js"></script>
2. NPM
npm install vue-router
如果在一個模組化工程中使用它,必須要透過 Vue.use() 明確地安裝路由功能:
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
如果使用全域性的 script 標籤,則無須如此 (手動安裝)。
定義路由
1.每個路由應該對映一個元件。 其中"component" 可以是透過 Vue.extend() 建立的元件構造器,或者,只是一個元件配置物件。
const routes = new VueRouter({
routes:[
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
})
2.巢狀路由
實際生活中的應用介面,通常由多層巢狀的元件組合而成。同樣地,URL 中各段動態路徑也按某種結構對應巢狀的各層元件,例如:
/user/foo/profile /user/foo/posts
+------------------+ +-----------------+
| User | | User |
| +--------------+ | | +-------------+ |
| | Profile | | +------------> | | Posts | |
| | | | | | | |
| +--------------+ | | +-------------+ |
+------------------+ +-----------------+
藉助 vue-router,使用巢狀路由配置,就可以很簡單地表達這種關係。
<div id="app">
<router-view></router-view>
</div>
const User = {
template: '<div>User {{ $route.params.id }}</div>'
}
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User }
]
})
這裡的 <router-view> 是最頂層的出口,渲染最高階路由匹配到的元件。同樣地,一個被渲染元件同樣可以包含自己的巢狀 <router-view>。例如,在 User 元件的模板新增一個 <router-view>:
const User = {
template: `
<div class="user">
<h2>User {{ $route.params.id }}</h2>
<router-view></router-view>
</div>
`
}
要在巢狀的出口中渲染元件,需要在 VueRouter 的引數中使用 children 配置:
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User,
children: [
{
// 當 /user/:id/profile 匹配成功,
// UserProfile 會被渲染在 User 的 <router-view> 中
path: 'profile',
component: UserProfile
},
{
// 當 /user/:id/posts 匹配成功
// UserPosts 會被渲染在 User 的 <router-view> 中
path: 'posts',
component: UserPosts
}
]
}
]
})
==注意,以 / 開頭的巢狀路徑會被當作根路徑。這讓你充分的使用巢狀元件而無須設定巢狀的路徑。==
你會發現,children配置就是像routes配置一樣的路由配置陣列,所以呢,你可以巢狀多層路由。
此時,基於上面的配置,當你訪問/user/foo時,User的出口是不會渲染任何東西,這是因為沒有匹配到合適的子路由。如果你想要渲染點什麼,可以提供一個 空的 子路由:
const router = new VueRouter({
routes: [
{
path: '/user/:id', component: User,
children: [
// 當 /user/:id 匹配成功,
// UserHome 會被渲染在 User 的 <router-view> 中
{ path: '', component: UserHome },
// ...其他子路由
]
}
]
})
命名檢視
有時候想同時 (同級) 展示多個檢視,而不是巢狀展示,例如建立一個佈局,有 sidebar (側導航) 和 main (主內容)兩個檢視,這個時候命名檢視就派上用場了。你可以在介面中擁有多個單獨命名的檢視,而不是隻有一個單獨的出口。如果router-view沒有設定名字,那麼預設為 default。
<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>
一個檢視使用一個元件渲染,因此對於同個路由,多個檢視就需要多個元件。確保正確使用 components 配置 (帶上 s):
const router = new VueRouter({
routes: [
{
path: '/',
components: {
default: Foo,
a: Bar,
b: Baz
}
}
]
})
路由傳參方式
一、
to裡的值可以是一個字串路徑,或者一個描述地址的物件。例如:
// 字串
<router-link to="apple"> to apple</router-link>
// 物件
<router-link :to="{path:'apple'}"> to apple</router-link>
// 命名路由
<router-link :to="{name: 'applename'}"> to apple</router-link>
//直接路由帶查詢引數query,位址列變成 /apple?color=red
<router-link :to="{path: 'apple', query: {color: 'red' }}"> to apple</router-link>
// 命名路由帶查詢引數query,位址列變成/apple?color=red
<router-link :to="{name: 'applename', query: {color: 'red' }}"> to apple</router-link>
//直接路由帶路由引數params,params 不生效,如果提供了 path,params 會被忽略
<router-link :to="{path: 'apple', params: { color: 'red' }}"> to apple</router-link>
// 命名路由帶路由引數params,位址列是/apple/red
<router-link :to="{name: 'applename', params: { color: 'red' }}"> to apple</router-link>
二、router.push(...)方法
場景:<button @click="gotoTargetView">點選跳轉到目標路由user頁面</button>
1.透過呼叫$router物件的push()方法,向push()方法傳遞一個路由配置物件,透過params來傳遞引數
==注意:使用params必須和name屬性一起使用,否則要跳轉的目標路由頁面無法透過params獲取到傳遞過來的引數。==
//路由配置
{
path: '/user',
name: 'user',
component: User
}
//方法
gotoTargetView(){
this.$router.push({name:"user", params:{userName:"lhb"}});//注意name不能換成path:"/user"
}
//目標元件user
this.$route.params.userName;//User.vue元件中就可以透過$route的params獲取到引數
2.透過呼叫$router物件的push()方法,向push()方法傳遞一個路由配置物件,需要透過query來傳遞引數
==注意:使用query的時候,可以透過path屬性也可以透過name屬性來指定目標路由。這種情況下,query傳遞的引數會顯示在url後面?userName=?&,如:http://localhost:8082/about?userName=lhb==
//路由配置
{
path: '/user',
name: 'user',
component: User
}
//方法
gotoTargetView(){
this.$router.push({name:"user",query:{"userName":"lhb"}});
this.$router.push({path:"/user",query:{"userName":"lhb"}});
}
//目標元件user
this.$route.query.userName;//User.vue元件中就可以透過$route的query獲取到引數
3.透過路由配置,配置動態路由引數:
上面的路由配置都是嚴格匹配的,只有要訪問的路徑與路由配置中的path一模一樣,才能跳轉到相應的元件上.但有時現實卻不是這樣的,當我們去訪問網站並登入成功後,它會顯示歡迎你,+你的名字。不同的使用者登入,只是顯示"你的名字"部分不同,其它部分是一樣的。這就表示,它是一個元件,假設是user元件。不同的使用者(就是使用者的id不同),它都會導航到同一個user元件中。這樣我們在配置路由的時候,就不能寫死,就是路由中的path屬性,不能寫死,那要怎麼設定?導航到user元件,路徑中肯定有user,id不同,那就給路徑一個動態部分來匹配不同的id.在vue-router中,動態部分以:開頭,那麼路徑就變成了/user/:id,這條路由就可以這麼寫:{ path:"/user/:id", component: user }.
//路由配置
{
path: '/user/:userName',
name: 'user',
component: User
}
//方法
gotoTargetView() {
this.$router.push({path:`/user/${userName}`});
}
//目標元件user
this.$route.params.userName;//User.vue元件中就可以透過$route的params獲取到引數
4.在元件中配置請求
//配置路由
{
path:"/Menu/edit",
components:{
menu_edit:MenuEdit,
},
meta: { requiresAuth: true }
}
//配置請求
<router-link :to="{path:'/Menu/edit',query:{id:record.id}}">Edit</router-link>
//獲取引數
this.$route.query.id,
三、注意:
1、關於帶引數的路由總結如下:
無論是直接路由“path" 還是命名路由“name”,帶查詢引數query,位址列會變成“/url?查詢引數名:查詢引數值“;
直接路由“path" 帶路由引數params params 不生效;
命名路由“name" 帶路由引數params 位址列保持是“/url/路由引數值”;
2、設定路由map裡的path值:
帶路由引數params時,路由map裡的path應該寫成: path:'/apple/:color' ;
帶查詢引數query時,路由map裡的path應該寫成: path:'/apple' ;
3、獲取引數方法:
在元件中:{{$route.params.color}}
在js裡: this.$route.params.color/this.$route.query.color
Form表單
1.form: this.$form.createForm(this) 註冊form表單
2.v-decorator="[id, options]" 註冊form表單中的標籤
id 必填輸入控制元件唯一標誌。支援巢狀式的寫法
options.initialValue 子節點的初始值,型別、可選值均由子節點決定
options.rules 校驗規則
options.valuePropName 子節點的值的屬性,如 Switch 的是 'checked'
3.resetFields() 重置表單方法,如果使用initialValue設定了初始值,則重置為初始值
4.validateFields()校驗並獲取一組輸入域的值與Error,若fieldNames引數為空,則校驗全部元件
moment使用
1.在vue-cli3中已將moment擴充套件下載並放在node-modules檔案中,使用時只需在元件中 import moment from "moment" 就可以
2.引入moment
//require 方式
var moment=require('moment');
//import 方式
import moment from 'moment';
2.設定moment區域為中國
//require 方式
require('moment/locale/zh-cn')
moment.locale('zh-cn');
//import 方式
import 'moment/locale/zh-cn'
moment.locale('zh-cn');
3.格式化時間型別
1.取當天時間,以YYYY年MM月DD日形式顯示
var now=moment().format("YYYY年MM月DD日");
2.任意時間戳格式化,以YYYY-MM-DD HH:mm:ss形式顯示
注意:時間戳需要13位,PHP時間戳一般是10位
var t1=moment(1411641720000).format('YYYY-MM-DD HH:mm:ss');
獲取前一天日期,格式以YYYY-MM-DD形式顯示
var t11=moment().day(0).format('YYYY-MM-DD');
獲取本週五日期,格式以YYYY-MM-DD形式顯示
var t12=moment().weekday(5).format('YYYY-MM-DD');
獲取上週五日期,格式以YYYY-MM-DD形式顯示
var t13=moment().weekday(-3).format('YYYY-MM-DD');
4.獲取當前年份、月份、日期
var t14=moment().year()
var t15=moment().month()//此處月份從0開始,當前月要+1
var t16=moment().date();
注意這個地方,日期不是.day()/days()
結合t14,t15,t16就可以輸出你想要的任何和當前日期、月份相關的日期
例如:我想獲取去年今天的完整日期,如:今天是2018-7-23,我要輸出的是2017-7-23
console.log(`${t14-1}-${t15+1}-${t16}`);
當然這不是獲取去年今天日期最好的辦法,但你可以拼出很多你想要的組合,下面會介紹更好的獲取去年今日的方法。
獲取上個月今天的日期,格式以YYYY-MM-DD顯示
var t18=moment().subtract(1, 'months').format('YYYY-MM-DD');
獲取上個月日期,格式以YYYY-MM顯示
var t19=moment().subtract(1, 'months').format('YYYY-MM')
獲取前一天日期,格式以YYYY-MM-DD顯示
var t20 = moment().subtract(1, 'days').format('YYYY-MM-DD');
獲取去年今天的日期,格式以YYYY-MM-DD顯示,即簡便的獲取去年今天日期的方法
var t21= moment().subtract(1, 'year').format('YYYY-MM-DD');
獲取兩個小時之後的時間
var t22=moment().add(2,'hours').format('YYYY-MM-DD HH:mm:ss');
這個的應用是獲取時間戳過期時間
比較也很簡單,只要獲取當前時間,一樣的format用><=號比較就可以了
獲取五天前的日期
例如:今天2018-7-23,獲取到的時間是2018-7-18
var t23=moment().subtract(5, 'days').format('YYYY-MM-DD');
注意
1.在ant-desgin-vue元件中,例如:樹形控制元件元件,引數:defaultSelectedKeys 與 引數 selectedKeys 的區別,以default開頭的引數,其值必須是固定的,如若設定成變動的你將看不到效果
vue-cookie的使用
1.安裝vue-cookie(其實vue-cli3中的node_modules資料夾中已經有vue-cookie,無需再安裝)
npm install vue-cookie --save
2.在 mian.js 引入和透過 Vue.use() 明確地安裝
//在 main.js 中引入
import Vue from 'Vue'
import VueCookie from 'vue-cookie'
// 全域性掛載
Vue.use(VueCookie)
3.元件中使用Cookie
// 設定cookie
this.$cookie.set('test', 'Hello world!', 1);
// 獲取方式
this.$cookie.get('test');
// 刪除 cookie
this.$cookie.delete('test');
注意:$cookie關鍵名稱不能設定為['expires','max-age','path','domain','secure']
4.vue-router + vue-cookies實現登入超時退出
4.1、在main.js中引入vue-cookie
import VueCookie from "vue-cookie";
Vue.use(VueCookie);
4.2、在登入的時候將使用者資訊/登入狀態存入cookie中
this.$cookie.set('user_token',[使用者資訊]);
4.3、在路由檔案中(route.js)註冊全域性前置守衛
//路由守衛
router.beforeEach((to, from, next) => {
document.title = to.matched[0].meta.title;
//在vue-router中獲取使用者token
var user_token = router.app.$cookie.get('user_token');
//判斷如果不是進入登入頁面
if (to.fullPath != '/login'){
//根據獲取的使用者token資訊,判斷是否登入
if (user_token) {
//執行下一步
next()
} else {
//未登入則進入下Login登入頁
next({
path: '/login'
});
}
}else{
next();
}
});
1、首先,在vue-cli專案的src路徑下新建一個axios資料夾,在axios資料夾裡新建api.js和request.js,api.js用於寫介面,對axios的封裝寫在request.js裡,專案機構如圖:
2、開始封裝Axios,
2.1、安裝 axios
$ npm install axios
2.2、在request.js檔案中
import axios from 'axios';
const service = axios.create({
baseURL: "http://www.vueadmin.io", // api的base_url
timeout: 5000, //請求超時時間
headers: {},
withCredentials: false, // `withCredentials` 表示跨域請求時是否需要使用憑證,預設 false
responseType: 'json', // `responseType` 表示伺服器響應的資料型別,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream',預設 json
});
// 請求攔截器
service.interceptors.request.use(function (config) {
// 在傳送請求之前做些什麼
return config;
}, function (error) {
// 對請求錯誤做些什麼
return Promise.reject(error);
});
// 響應攔截器
service.interceptors.response.use(function (response) {
// 對響應資料做點什麼
return response
}, function (error) {
// 對響應錯誤做點什麼
return Promise.reject(error);
});
export default service;
3、Axios介面的呼叫方式
3.1、在api.js檔案中(我們把介面統一寫在api.js檔案裡。當然,如果你的業務非常複雜的話,建議把不同業務的api分開放到不同的檔案裡,這樣方便以後維護)
// 載入request.js檔案
import service from './request';
//登入介面
export const Login = data => {
return service({
url: "/index.php/admin/Login/login",
method: 'post',
data
})
};
//獲取選單
export const GetMenu = data => {
return service({
url: "/index.php/admin/Menu/getMenu",
method: 'get',
params: data,
})
};
//注意,get與post請求時的傳參方式不一樣
4、在元件中使用
<template>
<a-form id="components-form-demo-normal-login" :form="form" class="login-form" @submit="handleSubmit">
<h2 id="title">{{systemName}}</h2>
<a-form-item>
<a-input v-decorator="['username',{ rules: [{ required: true, message: 'Please input your username!' }] }]" placeholder="Username">
<a-icon slot="prefix" type="user" style="color: rgba(0,0,0,.25)"/>
</a-input>
</a-form-item>
<a-form-item>
<a-input v-decorator="['password',{ rules: [{ required: true, message: 'Please input your Password!' }] }]" type="password" placeholder="Password">
<a-icon slot="prefix" type="lock" style="color: rgba(0,0,0,.25)"/>
</a-input>
</a-form-item>
<a-form-item>
<a-checkbox v-decorator="['remember',{valuePropName: 'checked',initialValue: true,}]">
Remember me
</a-checkbox>
<a class="login-form-forgot" href="">
Forgot password
</a>
<a-button type="primary" html-type="submit" class="login-form-button">
Log in
</a-button>
Or <router-link to="/register">
register now!
</router-link>
</a-form-item>
</a-form>
</template>
<script>
import {Login} from '../../axios/api';
export default {
name: "Login",
created() {
const params = {
username:values.username,
password:values.password,
remember:values.remember
};
//使用登入介面
Login(params).then((response)=>{
if (response.data.code === 1){
//在這裡處理返回資料
}
});
},
};
</script>
<style scoped>
</style>
本作品採用《CC 協議》,轉載必須註明作者和本文連結