感兴趣的朋友可以去我的语雀平台进行查看更多的知识。
https://www.yuque.com/ambition-bcpii/muziteng
props
作用:让路由组件更方便的收到参数
{
name:'detail',
path:'detail/:id',
component:Detail,
//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件
// props:{a:900}
//第二种写法:props值为布尔值,为true时,则把路由收到的所有params参数通过props传给Detail组件
// props:true
//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
props($route){
return {
id: $route.query.id,
title: $route.query.title
}
}
}
实例:
src/router/index.js
// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router';
// 引入组件
import Home from "@/pages/Home";
import About from "@/pages/About";
import News from "@/pages/News";
import Message from "@/pages/Message";
import Detail from "@/pages/Detail";
// 创建并暴露一个路由器
export default new VueRouter({
routes: [
{
path: '/home',
component: Home,
children: [
{
path: "news",
component: News,
},
{
path: "message",
component: Message,
children: [
{
name: "detail", // name配置项为路由命名
path: "detail/:id/:title", // 使用占位符声明接受params参数
component: Detail,
// props的第一种写法,值为对象,该对象中的key-value都会以props的形式传给Detail组件
// props: {a: 1, b: 'hello'}
// props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的params参数,以props的形式传给Detail组件
// props: true,
// props的第三种写法,值为函数
props($route) { // 这里可以使用解析赋值
return {
id: $route.params.id,
title: $route.params.title,
}
}
}
]
}
]
},
{
path: '/about',
component: About,
}
]
})
src/pages/Message.vue
-
{{ m.title }}
src/pages/Detail.vue
- 消息编号:{{ id }}
- 消息标题:{{ title }}
push
是追加历史记录replace
是替换当前记录,路由跳转时候默认为push
方式News
News
push
,点开新页面就会在栈顶追加一个地址,后退,栈顶指针向下移动,改为replace
就是不追加,而将栈顶地址替换src/App.vue
About
Home
)作用:不借助
实现路由跳转,让路由跳转更加灵活
this.$router.push({})
内传的对象与
中的to
相同
this.$router.replace({})
this.$router.forward()
前进
this.$router.back()
后退
this.$router.go(n)
可前进也可后退,n为正数前进n,为负数后退
this.$router.push({
name:'detail',
params:{
id:xxx,
title:xxx
}
})
this.$router.replace({
name:'detail',
params:{
id:xxx,
title:xxx
}
})
实例:
src/components/Banner.vue
Vue Router Demo
src/pages/Message.vue
-
{{ m.title }}
作用:让不展示的路由组件保持挂载,不被销毁
// 缓存一个路由组件
// include中写想要缓存的组件名,不写表示全部缓存
// 缓存多个路由组件
实例:
src/pages/News.vue
- news001
- news002
- news003
src/pages/Home.vue
我是Home的内容
activated
和deactivated
是路由组件所独有的两个钩子,用于捕获路由组件的激活状态
具体使用
activated
路由组件被激活时触发deactivated
路由组件失活时触发 src/pages/News.vue
- 欢迎学习Vue
- news001
- news002
- news003
作用:对路由进行权限控制
分类:全局守卫、独享守卫、组件内守卫
meta
路由元信息
// 全局前置守卫:初始化时、每次路由切换前执行
router.beforeEach((to,from,next) => {
console.log('beforeEach',to,from)
if(to.meta.isAuth){ // 判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'teng'){ // 权限控制的具体规则
next() // 放行
}else{
alert('暂无权限查看')
}
}else{
next() // 放行
}
})
// 全局后置守卫:初始化时、每次路由切换后执行
router.afterEach((to,from) => {
console.log('afterEach',to,from)
if(to.meta.title){
document.title = to.meta.title //修改网页的title
}else{
document.title = 'vue_test'
}
})
实例:
src/router/index.js
// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router';
// 引入组件
import Home from "@/pages/Home";
import About from "@/pages/About";
import News from "@/pages/News";
import Message from "@/pages/Message";
import Detail from "@/pages/Detail";
// 创建并暴露一个路由器
const router = new VueRouter({
routes: [
{
name: 'zhuye',
path: '/home',
meta: {title: '主页'},
component: Home,
children: [
{
name: 'xinwen',
path: "news",
component: News,
meta: {isAuth: true, title: '新闻'}
},
{
name: 'xiaoxi',
path: "message",
component: Message,
meta: {isAuth: true, title: '消息'},
children: [
{
name: "detail", // name配置项为路由命名
path: "detail/:id/:title", // 使用占位符声明接受params参数
component: Detail,
meta: {isAuth: true, title: '详情'},
// props的第三种写法,值为函数
props($route) { // 这里可以使用解析赋值
return {
id: $route.params.id,
title: $route.params.title,
}
}
}
]
}
]
},
{
name: 'guanyu',
path: '/about',
component: About,
meta: {title: '关于'}
}
]
})
// 全局前置路由守卫---初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to, from, next) => {
console.log("前置路由守卫", to, from)
// 判断是否需要鉴权
if (to.meta.isAuth) {
if (localStorage.getItem('school') === 'teng') {
next()
} else {
alert("学校名不对,无权限查看")
}
} else {
next()
}
})
// 全局后置路由守卫---初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to, from) => {
console.log("后置路由守卫", to, from)
document.title = to.meta.title || 'Vue学习'
})
export default router;
beforeEnter(to,from,next){
console.log('beforeEnter',to,from)
if(localStorage.getItem('school') === 'atguigu'){
next()
}else{
alert('暂无权限查看')
}
}
实例:
src/router/index.js
// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router';
// 引入组件
import Home from "@/pages/Home";
import About from "@/pages/About";
import News from "@/pages/News";
import Message from "@/pages/Message";
import Detail from "@/pages/Detail";
// 创建并暴露一个路由器
const router = new VueRouter({
routes: [
{
name: 'zhuye',
path: '/home',
meta: {title: '主页'},
component: Home,
children: [
{
name: 'xinwen',
path: "news",
component: News,
meta: {isAuth: true, title: '新闻'},
// 独享守卫,特点路由切换之后被调用
beforeEnter: (to, from, next) => {
if (to.meta.isAuth) {
if (localStorage.getItem('school') === 'teng') {
next()
} else {
alert("学校名不对,无权限查看")
}
} else {
next()
}
}
},
{
name: 'xiaoxi',
path: "message",
component: Message,
meta: {isAuth: true, title: '消息'},
children: [
{
name: "detail", // name配置项为路由命名
path: "detail/:id/:title", // 使用占位符声明接受params参数
component: Detail,
meta: {isAuth: true, title: '详情'},
// props的第三种写法,值为函数
props($route) { // 这里可以使用解析赋值
return {
id: $route.params.id,
title: $route.params.title,
}
}
}
]
}
]
},
{
name: 'guanyu',
path: '/about',
component: About,
meta: {title: '关于'}
}
]
})
// 全局后置路由守卫---初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to, from) => {
console.log("后置路由守卫", to, from)
document.title = to.meta.title || 'Vue学习'
})
export default router;
//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {... next()},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {... next()},
实例:
src/pages/About.vue
我是About的内容
对于一个url
来说,什么是hash
值?
#
及其后面的内容就是hash
值
hash
值不会包含在HTTP
请求中,即:hash
值不会带给服务器
hash
模式
#
号,不美观history模式
const router = new VueRouter({
mode:'history',
routes:[...]
})
export default router
Vant
Cube UI
Mint UI
https://nutui.jd.com/#/
Element UI
IView UI
element-ui
:npm i element-ui -S
src/main.js
import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui'; // 引入ElementUI组件库
import 'element-ui/lib/theme-chalk/index.css'; // 引入ElementUI全部样式
Vue.config.productionTip = false
Vue.use(ElementUI) // 使用ElementUI
new Vue({
el:"#app",
render: h => h(App),
})
src/App.vue
babel-plugin-component
npm i babel-plugin-component -D
babel-config-js
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset',
["@babel/preset-env", { "modules": false }]
],
plugins: [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
]
]
}
src/main.js
import Vue from 'vue'
import App from './App.vue'
import { Button,Row } from 'element-ui' // 按需引入
Vue.config.productionTip = false
Vue.component(Button.name, Button);
Vue.component(Row.name, Row);
/* 或写为
* Vue.use(Button)
* Vue.use(Row)
*/
new Vue({
el:"#app",
render: h => h(App),
})