npm install vue-router --save
一般我们手动安装的时候,可以先在src目录下创建router
然后创建在此文件夹中创建index.js文件
// 配置路由相关信息
import Vue from 'vue'
import Router from 'vue-router'
import contentCpn from '@/components/contentCpn'
// 1. 通过Vue.use(插件) ,安装插件
Vue.use(Router)
// 2. 创建VueRouter对象
// 3. 将router对象传入到vue实例
export default new Router({
// 配置路由和组件之间的映射关系
routes: [
{
path: '/',
name: 'contentCpn',
component: contentCpn
}
]
})
使用vue-router的步骤
第一步:创建路由组件
第二步:配置路由映射:组件和路径映射关系
第三步:使用路由:通过<router-link?>和<router-view?>
一个链接跳转到路由,一个是路由的显示
使用
$route.params.参数名
<template>
<div>
<h3>动态路由</h3>
<p>{{$route.params.name}}</p>
</div>
</template>
<script>
export default {
name: 'dynamicCpn',
data () {
return {
}
}
}
</script>
<style scoped> /* scoped 表示 仅在当前组件生效。 */
</style>
App.vue
<template>
<div id="app">
<h2>你好,世界。。。</h2>
<router-link to="/hello">哈喽</router-link>
<router-link v-bind:to="'/user/' + name">动态路由</router-link>
<router-view></router-view>
</div>
</template>
index.js
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '../components/HelloWorld.vue'
import dynamicCpn from '../components/dynamicCpn.vue'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/hello',
component: HelloWorld
},
{
path: '/user/:name',
component: dynamicCpn
}
],
mode: 'history' // html5中的history模式
})
import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '../components/HelloWorld.vue'
// import dynamicCpn from '../components/dynamicCpn.vue'
/* 路由 懒加载 */
const HelloWorld = () => import('../components/HelloWorld')
const dynamicCpn = () => import('../components/dynamicCpn')
Vue.use(Router)
export default new Router({
routes: [
{
path: '/hello',
component: HelloWorld
},
{
path: '/user/:name',
component: dynamicCpn
}
],
mode: 'history' // html5中的history模式
})
import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '../components/HelloWorld.vue'
// import dynamicCpn from '../components/dynamicCpn.vue'
/* 路由 懒加载 */
const HelloWorld = () => import('../components/HelloWorld')
/* 嵌套子路由 */
const HelloAAA = () => import('../components/HelloAAA')
const HelloBBB = () => import('../components/HelloBBB')
const dynamicCpn = () => import('../components/dynamicCpn')
Vue.use(Router)
export default new Router({
routes: [
{
path: '',
redirect: '/hello'
},
{
path: '/hello',
component: HelloWorld,
children: [
{
path: '',
redirect: 'HelloAAA'
},
{
path: 'HelloAAA',
component: HelloAAA
},
{
path: 'HelloBBB',
component: HelloBBB
}
]
},
{
path: '/user/:name',
component: dynamicCpn
}
],
mode: 'history', // html5中的history模式
linkActiveClass: 'active'
})
<template>
<div>
<p>你好,helloworld</p>
<router-link to="/hello/HelloAAA">AAA</router-link>
<router-link to="/hello/HelloBBB">BBB</router-link>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
传递参数的主要有两种类型: params和query
params的类型:
$route.params.abc
query的类型
<template>
<div id="app">
<h2>你好,世界。。。</h2>
<router-link to="/hello">哈喽</router-link>
<router-link v-bind:to="'/user/' + name">动态路由</router-link>
<router-link :to="profile">档案</router-link>
<button @click="profileClick">档案按钮测试</button>
<router-view></router-view>
</div>
</template>
<script>
// import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
data () {
return {
name: '张三',
profile: {
path: '/profile',
query: {
name: '张三',
age: 18,
height: '176cm'
}
}
}
},
methods: {
profileClick () {
this.$router.push(this.profile)
}
}
}
</script>
<style>
.active {
color: red;
}
</style>
<template>
<div>
<h2>我是 profile 组件</h2>
<h2>{{$route.query}}</h2>
</div>
</template>
<script>
export default {
name: 'profile'
}
</script>
在router文件夹下的index.js中
const router = new Router({
routes: [
{
path: '',
redirect: '/hello'
},
{
path: '/hello',
component: HelloWorld,
meta: {
title: '首页'
},
children: [
{
path: '',
redirect: 'HelloAAA'
},
{
path: 'HelloAAA',
component: HelloAAA
},
{
path: 'HelloBBB',
component: HelloBBB
}
],
// 元 数据
},
{
path: '/user/:name',
component: dynamicCpn,
meta: {
title: '动态路由'
}
},
{
path: '/profile',
component: profile,
meta: {
title: '关于'
}
}
],
mode: 'history', // html5中的history模式
linkActiveClass: 'active'
})
// 前置钩子 (hook) 或者 前置守卫
router.beforeEach((to, from, next) => {
// 从from跳转到to
document.title = to.matched[0].meta.title
// next是必须要执行的
next()
})
// 如果是后置钩子,也就是afterEach, 不需要主动调用next()函数
router.afterEach((to, from) => {
console.log('当前页面: ' + to.matched[0].meta.title);
console.log('上一次页面:', from.matched[0] === undefined ? '为空' : from.matched[0].meta.title);
})
// 上面使用的守卫是 全局 守卫
export default router
我们可以在路由配置上直接定义 beforeEnter
守卫
const router = new VueRouter({
routers: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ............
}
}
]
})
组件中的js代码
export default {
name: 'dynamicCpn',
data () {
return {
}
},
beforeRouteEnter: (to, from, next) => {
console.log('组件内的守卫')
next()
}
}
例如在 profile.vue中
<template>
<div>
<h2>我是 profile 组件</h2>
<h2>{{$route.query}}</h2>
</div>
</template>
<script>
export default {
name: 'profile',
created () {
console.log('profile created')
},
destroyed () {
console.log('profile destroyed')
}
}
</script>
当我们在App.vue中 使用keep-alive标签包裹
<template>
<div id="app">
<h2>你好,世界。。。</h2>
<router-link to="/hello">哈喽</router-link>
<router-link v-bind:to="'/user/' + name">动态路由</router-link>
<router-link :to="profile">档案</router-link>
<button @click="profileClick">档案按钮测试</button>
<keep-alive>
<router-view></router-view>
</keep-alive>
</div>
</template>
运行的时候, profile组件的生命周期, 最开始进行 created, 之后就不再销毁 和 创建
使用keep-alive标签包裹之后, 会有 执行两个函数 activated 和 disactivated
export default {
name: 'profile',
created () {
console.log('profile created')
},
destroyed () {
console.log('profile destroyed')
},
activated () {
console.log('activated')
},
deactivated () {
console.log('deactivated')
}
}
当不再使用keep-alive标签包裹时,这两个函数不再生效.
使用组件守卫进行实现
HelloWorld.vue
<template>
<div>
<p>你好,helloworld</p>
<router-link to="/hello/HelloAAA">AAA</router-link>
<router-link to="/hello/HelloBBB">BBB</router-link>
<keep-alive>
<router-view></router-view>
</keep-alive>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
path: '/hello/HelloAAA'
}
},
props: {
msg: String
},
activated () {
// $router 为VueRouter实例对象
this.$router.push (this.path).catch(err => err)
},
beforeRouteLeave (to, from, next) {
console.log(this.path)
// $route 为当前router跳转对象
this.path = this.$route.path
console.log('HelloWorld路由离开之前')
next()
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
keep-alive是vue内置的一个组件, 可以使被包含的组件保留状态, 或者避免重新渲染
它们有两个非常重要的属性:
router-view也是一个组件, 如果被包在keep-alive里面, 所有路径匹配到的视图组件都会被缓存
<keep-alive exclude="profile"> <!-- 这里使用的是 组件中的 name -->
<router-view></router-view>
</keep-alive>
import axios from 'axios'
axios({
url : '',
params: {
xxx : 'xxx'
}
}).then(function (res) {
console.log(res)
}).catch (function (err) {
console.log(err)
})
// 或者
axios(...).then (res => {
console.log(res)
}).catch (err => {
console.log(err)
})
axios (config)
axios.request (config)
axios.get (url[, cnofig])
axios.delete (url[, cnofig])
axios.head (url[, cnofig])
axios.post (url[, data[, cnofig]])
axios.put (url[, data[, cnofig]])
axios.patch (url[, data[, cnofig]])
发送post请求
request({
url: '/api/login',
method: 'POST',
headers: {
'content-type': 'application/json'
},
data: JSON.stringify(this.user)
}).then (msg => {
let status = msg.data.code
this.$message(msg.data.msg)
if (status === 200) {
this.$router.push({path: '/chaoxing'})
}
}).catch(err => console.log(err))
// 并发请求
axios.all ([
axios ({
url: 'http://66.lacknb.cn/api/answer',
params: {
problem: '分时系统是什么'
}
}),
axios ({
url: 'http://66.lacknb.cn/test/api/jitang'
})
]).then(results => {
console.log(results[0])
console.log(results[1])
})
还可以使用axios.spread
// 还可以这样写, 直接将结果分开
axios.all ([
axios ({
url: 'http://66.lacknb.cn/api/answer',
params: {
problem: '分时系统是什么'
}
}),
axios ({
url: 'http://66.lacknb.cn/test/api/jitang'
})
]).then(axios.spread ( (res1, res2) => {
console.log(res1)
console.log(res2)
}))
全局默认配置
axios.defaults.baseURL = 'http://66.lacknb.cn'
axios.defaults.timeout = 5000 // 设置超时时间 5 秒
// 自定义请求头
axios.defaults.headers = {
'x-Requestd-With': 'XMLHttpRequest'
}
参数
url、method、params(get请求参数)
查询对象序列化函数 paramsSerializer: function (params) {}
data: {},post请求提供的参数 requestBody
跨域是否带token,withCredentials: false
响应数据格式:responseType: 'json'
创建实例、并使用
/* axios的实例 */
const instance1 = axios.create({
baseURL: 'http://66.lacknb.cn',
timeout: 5000
})
instance1 ({
url: '/test/api/jitang'
}).then (res => {
console.log(res)
})
axios的封装
在src目录创建network文件夹,然后在这个文件夹中创建request.js
import axios from 'axios'
export function request (config) {
// 1. 创建axios实例
const instance = axios.create ({
baseURL: 'http://66.lacknb.cn',
timeout: 5000
})
// 2. 发送真正的网络请求
return instance (config)
}
使用的时候,直接可以这样使用。
import {request } from './network/request'
request ({
url: '/test/api/jitang'
}).then (res => {
console.log(res)
})