前端Vue框架系列—— 学习笔记总结Day04

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

文章目录

  • 第五章 路由
    • 5.1 理解路由
    • 5.2 基本使用
    • 5.3 几个注意事项
    • 5.4 多级路由
    • 5.5 路由的query参数
    • 5.6 路由命名
    • 5.7 路由的params参数
    • 5.8 路由的props配置
    • 5.9 router-link的replace属性
    • 5.10 编程式路由导航
    • 5.11 缓存路由组件
    • 5.12 两个新的生命周期钩子
    • 5.13 全局路由守卫
    • 5.14 独享路由守卫
    • 5.15 组件内路由守卫
    • 5.16 路由器的两种工作模式
  • 第六章 Vue UI组件库
    • 6.1 常用的UI组件库
    • 6.2 element-ui基本使用
    • 6.3 element-ui按需引入

第五章 路由

5.1 理解路由

  1. 理解: 一个路由(route)就是一组映射关系(key - value),多个路由需要路由器(router)进行管理。
  2. 前端路由:key是路径,value是组件。

5.2 基本使用

  • src/components/About.vue

    <template><h2>我是About的内容</h2>
    </template><script>export default {name:'About'}
    </script>
    
  • src/components/Home.vue

    <template><h2>我是Home的内容</h2>
    </template><script>export default {name:'Home'}
    </script>
    
  • src/main.js

    //引入Vue
    import Vue from 'vue'
    //引入App
    import App from './App.vue'
    //引入VueRouter
    import VueRouter from 'vue-router'
    //引入路由器
    import router from './router'//关闭Vue的生产提示
    Vue.config.productionTip = false
    //应用插件
    Vue.use(VueRouter)//创建vm
    new Vue({el:'#app',render: h => h(App),router:router
    })
  • src/router/index.js

    // 该文件专门用于创建整个应用的路由器
    import VueRouter from 'vue-router'
    //引入组件
    import About from '../components/About'
    import Home from '../components/Home'//创建并暴露一个路由器
    export default new VueRouter({routes:[{path:'/about',component:About},{path:'/home',component:Home}]
    })
  • src/App.vue

    <template><div><div class="row"><div class="col-xs-offset-2 col-xs-8"><div class="page-header"><h2>Vue Router Demo</h2></div></div></div><div class="row"><div class="col-xs-2 col-xs-offset-2"><div class="list-group"><!-- 原始html中我们使用a标签实现页面的跳转 --><!-- <a class="list-group-item active" href="./about.html">About</a> --><!-- <a class="list-group-item" href="./home.html">Home</a> --><!-- Vue中借助router-link标签实现路由的切换 --><router-link class="list-group-item" active-class="active" to="/about">About</router-link><br><router-link class="list-group-item" active-class="active" to="/home">Home</router-link></div></div><div class="col-xs-6"><div class="panel"><div class="panel-body"><!-- 指定组件的呈现位置 --><router-view></router-view></div></div></div></div></div>
    </template><script>export default {name:'App',}
    </script>

效果:
在这里插入图片描述
在这里插入图片描述


总结:

  1. 安装vue-router,命令:npm i vue-router

  2. 应用插件:Vue.use(VueRouter)

  3. 编写router配置项:

    //引入VueRouter
    import VueRouter from 'vue-router'
    //引入Luyou 组件
    import About from '../components/About'
    import Home from '../components/Home'//创建router实例对象,去管理一组一组的路由规则
    const router = new VueRouter({routes:[{path:'/about',component:About},{path:'/home',component:Home}]
    })//暴露router
    export default router
    
  4. 实现切换(active-class可配置高亮样式)

    <router-link active-class="active" to="/about">About</router-link>
    
  5. 指定展示位置

    <router-view></router-view>
    

5.3 几个注意事项

  1. 路由组件通常存放在pages文件夹,一般组件通常存放在components文件夹。
  2. 通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。
  3. 每个组件都有自己的$route属性,里面存储着自己的路由信息。
  4. 整个应用只有一个router,可以通过组件的$router属性获取到。

5.4 多级路由

  • src/pages/Home.vue

    <template><div><h2>Home组件内容</h2><div><ul class="nav nav-tabs"><li><router-link class="list-group-item" active-class="active" to="/home/news">News</router-link></li><li><router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link></li></ul><router-view></router-view></div></div>
    </template><script>export default {name:'Home'}
    </script>
    
  • src/pages/News.vue

    <template><ul><li>news001</li><li>news002</li><li>news003</li></ul>
    </template><script>export default {name:'News'}
    </script>
    
  • src/pages/Message.vue

    <template><div><ul><li><a href="/message1">message001</a>&nbsp;&nbsp;</li><li><a href="/message2">message002</a>&nbsp;&nbsp;</li><li><a href="/message/3">message003</a>&nbsp;&nbsp;</li></ul></div>
    </template><script>export default {name:'Message'}
    </script>
    
  • src/router/index.js

    // 该文件专门用于创建整个应用的路由器
    import VueRouter from 'vue-router'
    //引入组件
    import About from '../pages/About'
    import Home from '../pages/Home'
    import News from '../pages/News'
    import Message from '../pages/Message'//创建并暴露一个路由器
    export default new VueRouter({routes:[{path:'/about',component:About},{path:'/home',component:Home,children:[ //通过children配置子路由{path:'news',component:News,},{path:'message',component:Message,}]}]
    })

效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结:
1. 配置路由规则,使用children配置项:

routes:[{path:'/about',component:About,},{path:'/home',component:Home,children:[ //通过children配置子级路由{path:'news', //此处一定不要写:/newscomponent:News},{path:'message',//此处一定不要写:/messagecomponent:Message}]}
]
  1. 跳转(要写完整路径):

    <router-link to="/home/news">News</router-link>
    

5.5 路由的query参数

  • src/router.index.js

    // 该文件专门用于创建整个应用的路由器
    import VueRouter from 'vue-router'
    //引入组件
    import About from '../pages/About'
    import Home from '../pages/Home'
    import News from '../pages/News'
    import Message from '../pages/Message'
    import Detail from '../pages/Detail'//创建并暴露一个路由器
    export default new VueRouter({routes:[{path:'/about',component:About},{path:'/home',component:Home,children:[{path:'news',component:News,},{path:'message',component:Message,children:[{path:'detail',component:Detail,}]}]}]
    })
    
  • src/pages/Detail.vue

    <template><ul><li>消息编号:{{$route.query.id}}</li><li>消息标题:{{$route.query.title}}</li></ul>
    </template><script>export default {name:'Detail',mounted() {console.log(this.$route)},}
    </script>
    
  • src/pages/Message.vue

    <template><div><ul><li v-for="m in messageList" :key="m.id"><!-- 跳转路由并携带query参数,to的字符串写法 --><!-- <router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">{{m.title}}</router-link>&nbsp;&nbsp; --><!-- 跳转路由并携带query参数,to的对象写法 --><router-link :to="{path:'/home/message/detail',query:{id:m.id,title:m.title}}">{{m.title}}</router-link></li></ul><hr><router-view></router-view></div>
    </template><script>export default {name:'Message',data() {return {messageList:[{id:'001',title:'消息001'},{id:'002',title:'消息002'},{id:'003',title:'消息003'}]}},}
    </script>
    

效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结:

  1. 传递参数

    <!-- 跳转并携带query参数,to的字符串写法 -->
    <router-link :to="/home/message/detail?id=666&title=你好">跳转</router-link><!-- 跳转并携带query参数,to的对象写法 -->
    <router-link :to="{path:'/home/message/detail',query:{id:666,title:'你好'}}"
    >跳转</router-link>
    
  2. 接收参数:

    $route.query.id
    $route.query.title
    

5.6 路由命名

  • src/pages/Home.vue

    <template><div><h2>Home组件内容</h2><div><ul class="nav nav-tabs"><li><router-link class="list-group-item" active-class="active" to="/home/news">News</router-link></li><li><router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link></li></ul><router-view></router-view></div></div>
    </template><script>export default {name:'Home'}
    </script>
    
  • src/pages/News.vue

    <template><ul><li>news001</li><li>news002</li><li>news003</li></ul>
    </template><script>export default {name:'News'}
    </script>
    

    src/pages/Message.vue

    <template><div><ul><li v-for="m in messageList" :key="m.id"><!-- 跳转路由并携带query参数,to的字符串写法 --><!-- <router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">{{m.title}}</router-link>&nbsp;&nbsp; --><!-- 跳转路由并携带query参数,to的对象写法 --><router-link :to="{name:'xiangqing',query:{id:m.id,title:m.title}}">{{m.title}}</router-link></li></ul><hr><router-view></router-view></div>
    </template><script>export default {name:'Message',data() {return {messageList:[{id:'001',title:'消息001'},{id:'002',title:'消息002'},{id:'003',title:'消息003'}]}},}
    </script>
    
  • src/router/index.js

    // 该文件专门用于创建整个应用的路由器
    import VueRouter from 'vue-router'
    //引入组件
    import About from '../pages/About'
    import Home from '../pages/Home'
    import News from '../pages/News'
    import Message from '../pages/Message'
    import Detail from '../pages/Detail'//创建并暴露一个路由器
    export default new VueRouter({routes:[{name:'guanyu',path:'/about',component:About},{path:'/home',component:Home,children:[{path:'news',component:News,},{path:'message',component:Message,children:[{name:'xiangqing',path:'detail',component:Detail,}]}]}]
    })

总结:

  1. 作用:可以简化路由的跳转。

  2. 如何使用

    1. 给路由命名:

      {path:'/demo',component:Demo,children:[{path:'test',component:Test,children:[{name:'hello' //给路由命名path:'welcome',component:Hello,}]}]
      }
      
    2. 简化跳转:

      <!--简化前,需要写完整的路径 -->
      <router-link to="/demo/test/welcome">跳转</router-link><!--简化后,直接通过名字跳转 -->
      <router-link :to="{name:'hello'}">跳转</router-link><!--简化写法配合传递参数 -->
      <router-link :to="{name:'hello',query:{id:666,title:'你好'}}"
      >跳转</router-link>
      

5.7 路由的params参数

  • 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:'/about',component:About},{path:'/home',component:Home,children:[{path:'news',component:News},{path:'message',component:Message,children:[{name:'xiangqing',path:'detail/:id/:title',//使用占位符声明接收params参数component:Detail}]}]}]
    })
    
  • src/pages/Message.vue

    <template><div><ul><li v-for="m in messageList" :key="m.id"><!-- 跳转路由并携带params参数,to的字符串写法 --><!-- <router-link :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link>&nbsp;&nbsp; --><!-- 跳转路由并携带params参数,to的对象写法 --><router-link :to="{name:'xiangqing',params:{id:m.id,title:m.title}}">{{m.title}}</router-link>&nbsp;&nbsp;</li></ul><hr/><router-view></router-view></div>
    </template><script>export default {name:'News',data(){return{messageList:[{id:'001',title:'消息001'},{id:'002',title:'消息002'},{id:'003',title:'消息003'}]}}}
    </script>
    
  • src/pages/Detail.vue

    <template><ul><li>消息编号:{{$route.params.id}}</li><li>消息标题:{{$route.params.title}}</li></ul>
    </template><script>export default {name:'Detail'}
    </script>
    

总结:

  1. 配置路由,声明接收params参数

    {path:'/home',component:Home,children:[{path:'news',component:News},{component:Message,children:[{name:'xiangqing',path:'detail/:id/:title', //使用占位符声明接收params参数component:Detail}]}]
    }
    
  2. 传递参数

    <!-- 跳转并携带params参数,to的字符串写法 -->
    <router-link :to="/home/message/detail/666/你好">跳转</router-link><!-- 跳转并携带params参数,to的对象写法 -->
    <router-link :to="{name:'xiangqing',params:{id:666,title:'你好'}}"
    >跳转</router-link>
    

    特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!

  3. 接收参数:

    $route.params.id
    $route.params.title
    

5.8 路由的props配置

  • src/pages/Message.vue

    <template><div><ul><li v-for="m in messageList" :key="m.id"><router-link :to="{name:'xiangqing',params:{id:m.id,title:m.title}}">{{m.title}}</router-link>&nbsp;&nbsp;</li></ul><hr/><router-view></router-view></div>
    </template><script>export default {name:'News',data(){return{messageList:[{id:'001',title:'消息001'},{id:'002',title:'消息002'},{id:'003',title:'消息003'}]}}}
    </script>
    
  • 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:'/about',component:About},{path:'/home',component:Home,children:[{path:'news',component:News},{path:'message',component:Message,children:[{name:'xiangqing',path:'detail/:id/:title',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,}}}]}]}]
    })
    
  • src/pages/Detail.vue

    <template><ul><li>消息编号:{{id}}</li><li>消息标题:{{title}}</li></ul>
    </template><script>export default {name:'Detail',props:['id','title']}
    </script>

总结:
作用:让路由组件更方便的收到参数

{name:'xiangqing',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}}
}

5.9 router-link的replace属性

  • src/pages/Home.vue
    <template><div><h2>Home组件内容</h2><div><ul class="nav nav-tabs"><li><router-link replace class="list-group-item" active-class="active" to="/home/news">News</router-link></li><li><router-link replace class="list-group-item" active-class="active" to="/home/message">Message</router-link></li></ul><router-view></router-view></div></div>
    </template><script>export default {name:'Home'}
    </script>
    

总结:

  1. 作用:控制路由跳转时操作浏览器历史记录的模式
  2. 浏览器的历史记录有两种写入方式:分别为pushreplacepush是追加历史记录,replace是替换当前记录。路由跳转时候默认为push
  3. 如何开启replace模式:<router-link replace .......>News</router-link>

5.10 编程式路由导航

  • src/components/Banner.vue

    <template><div class="col-xs-offset-2 col-xs-8"><div class="page-header"><h2>Vue Router Demo</h2><button @click="back">后退</button><button @click="forward">前进</button><button @click="test">测试一下go</button></div></div>
    </template><script>export default {name:'Banner',methods: {back(){this.$router.back()// console.log(this.$router)},forward(){this.$router.forward()},test(){this.$router.go(3)}},}
    </script>
    
  • src/pages/Message.vue

    <template><div><ul><li v-for="m in messageList" :key="m.id"><!-- 跳转路由并携带params参数,to的字符串写法 --><!-- <router-link :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link>&nbsp;&nbsp; --><!-- 跳转路由并携带params参数,to的对象写法 --><router-link :to="{name:'xiangqing',query:{id:m.id,title:m.title}}">{{m.title}}</router-link><button @click="pushShow(m)">push查看</button><button @click="replaceShow(m)">replace查看</button></li></ul><hr><router-view></router-view></div>
    </template><script>export default {name:'Message',data() {return {messageList:[{id:'001',title:'消息001'},{id:'002',title:'消息002'},{id:'003',title:'消息003'}]}},methods: {pushShow(m){this.$router.push({name:'xiangqing',query:{id:m.id,title:m.title}})},replaceShow(m){this.$router.replace({name:'xiangqing',query:{id:m.id,title:m.title}})}},}
    </script>
    
  • src/router/index.js

    // 该文件专门用于创建整个应用的路由器
    import VueRouter from 'vue-router'
    //引入组件
    import About from '../pages/About'
    import Home from '../pages/Home'
    import News from '../pages/News'
    import Message from '../pages/Message'
    import Detail from '../pages/Detail'//创建并暴露一个路由器
    export default new VueRouter({routes:[{name:'guanyu',path:'/about',component:About},{path:'/home',component:Home,children:[{path:'news',component:News,},{path:'message',component:Message,children:[{name:'xiangqing',path:'detail',component:Detail,//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。// props:{a:1,b:'hello'}//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。// props:true//props的第三种写法,值为函数props($route){return {id:$route.query.id,title:$route.query.title,a:1,b:'hello'}}}]}]}]
    })
  • src/pages/Detail.vue

    <template><ul><li>消息编号:{{id}}</li><li>消息标题:{{title}}</li></ul>
    </template><script>export default {name:'Detail',props:['id','title'],},}
    </script>
    

效果:
在这里插入图片描述


总结:

  1. 作用:不借助<router-link> 实现路由跳转,让路由跳转更加灵活

  2. 具体编码:

    //$router的两个API
    this.$router.push({name:'xiangqing',params:{id:xxx,title:xxx}
    })this.$router.replace({name:'xiangqing',params:{id:xxx,title:xxx}
    })
    this.$router.forward() //前进
    this.$router.back() //后退
    this.$router.go() //可前进也可后退
    

5.11 缓存路由组件

  • src/pages/News.vue

    <template><ul><li>news001 <input type="text"></li><li>news002 <input type="text"></li><li>news003 <input type="text"></li></ul>
    </template><script>export default {name:'News',beforeDestroy() {console.log('News组件即将被销毁了')},}
    </script>
    
  • src/pages/Home.vue

    <template><div><h2>Home组件内容</h2><div><ul class="nav nav-tabs"><li><router-link class="list-group-item" active-class="active" to="/home/news">News</router-link></li><li><router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link></li></ul><!-- 缓存多个路由组件 --><!-- <keep-alive :include="['News','Message']"> --><!-- 缓存一个路由组件 --><keep-alive include="News"><router-view></router-view></keep-alive></div></div>
    </template><script>export default {name:'Home',}
    </script>
    

效果:
在这里插入图片描述


总结:

  1. 作用:让不展示的路由组件保持挂载,不被销毁。

  2. 具体编码:

    <keep-alive include="News"> <router-view></router-view>
    </keep-alive>
    

5.12 两个新的生命周期钩子

src/pages/News.vue

<template><ul><li :style="{opacity}">欢迎学习Vue</li><li>news001 <input type="text"></li><li>news002 <input type="text"></li><li>news003 <input type="text"></li></ul>
</template><script>export default {name:'News',data() {return {opacity:1}},activated() {console.log('News组件被激活了')this.timer = setInterval(() => {console.log('@')this.opacity -= 0.01if(this.opacity <= 0) this.opacity = 1},16)},deactivated() {console.log('News组件失活了')clearInterval(this.timer)},}
</script>

效果:
在这里插入图片描述


总结:

  1. 作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
  2. 具体名字:
    1. activated路由组件被激活时触发。
    2. deactivated路由组件失活时触发。

5.13 全局路由守卫

src/router/index.js

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'//创建并暴露一个路由器
const router =  new VueRouter({routes:[{name:'guanyu',path:'/about',component:About,meta:{title:'关于'}},{name:'zhuye',path:'/home',component:Home,meta:{title:'主页'},children:[{name:'xinwen',path:'news',component:News,meta:{isAuth:true,title:'新闻'}},{name:'xiaoxi',path:'message',component:Message,meta:{isAuth:true,title:'消息'},children:[{name:'xiangqing',path:'detail',component:Detail,meta:{isAuth:true,title:'详情'},//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。// props:{a:1,b:'hello'}//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。// props:true//props的第三种写法,值为函数props($route){return {id:$route.query.id,title:$route.query.title,a:1,b:'hello'}}}]}]}]
})//全局前置路由守卫————初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{console.log('前置路由守卫',to,from)if(to.meta.isAuth){ //判断是否需要鉴权if(localStorage.getItem('school')==='school') {next()} else {alert('当前账号无权限查看!')}}else{next()}
})//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{console.log('后置路由守卫',to,from)document.title = to.meta.title || '管理系统'
})export default router

效果:
在这里插入图片描述


5.14 独享路由守卫

src/router/index.js

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'//创建并暴露一个路由器
const router =  new VueRouter({routes:[{name:'guanyu',path:'/about',component:About,meta:{title:'关于'}},{name:'zhuye',path:'/home',component:Home,meta:{title:'主页'},children:[{name:'xinwen',path:'news',component:News,meta:{isAuth:true,title:'新闻'},beforeEnter: (to, from, next) => {console.log('独享路由守卫',to,from)if(to.meta.isAuth){ //判断是否需要鉴权if(localStorage.getItem('school')==='school'){next()}else{alert('当前账号无权限查看!')}}else{next()}}},{name:'xiaoxi',path:'message',component:Message,meta:{isAuth:true,title:'消息'},children:[{name:'xiangqing',path:'detail',component:Detail,meta:{isAuth:true,title:'详情'},//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。// props:{a:1,b:'hello'}//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。// props:true//props的第三种写法,值为函数props($route){return {id:$route.query.id,title:$route.query.title,a:1,b:'hello'}}}]}]}]
})//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{console.log('后置路由守卫',to,from)document.title = to.meta.title || '硅谷系统'
})export default router

效果:
在这里插入图片描述


5.15 组件内路由守卫

src/pages/About.vue

<template><h2>我是About的内容</h2>
</template><script>export default {name:'About',//通过路由规则,进入该组件时被调用beforeRouteEnter (to, from, next) {console.log('About--beforeRouteEnter',to,from)if(to.meta.isAuth){ //判断是否需要鉴权if(localStorage.getItem('school')==='school'){next()}else{alert('当前账号无权限查看!')}}else{next()}},//通过路由规则,离开该组件时被调用beforeRouteLeave (to, from, next) {console.log('About--beforeRouteLeave',to,from)next()}}
</script>

总结:

  1. 作用:对路由进行权限控制

  2. 分类:全局守卫、独享守卫、组件内守卫

  3. 全局守卫:

    //全局前置守卫:初始化时执行、每次路由切换前执行
    router.beforeEach((to,from,next)=>{console.log('beforeEach',to,from)if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则next() //放行}else{alert('暂无权限查看')// next({name:'guanyu'})}}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'}
    })
    
  4. 独享守卫:

    beforeEnter(to,from,next){console.log('beforeEnter',to,from)if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制if(localStorage.getItem('school') === 'atguigu'){next()}else{alert('暂无权限查看')// next({name:'guanyu'})}}else{next()}
    }
    
  5. 组件内守卫:

    //进入守卫:通过路由规则,进入该组件时被调用
    beforeRouteEnter (to, from, next) {
    },
    //离开守卫:通过路由规则,离开该组件时被调用
    beforeRouteLeave (to, from, next) {
    }
    

5.16 路由器的两种工作模式

  1. 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
  2. hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
  3. hash模式
    1. 地址中永远带着#号,不美观 。
    2. 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
    3. 兼容性较好。
  4. history模式
    1. 地址干净,美观 。
    2. 兼容性和hash模式相比略差。
    3. 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。

第六章 Vue UI组件库

6.1 常用的UI组件库

  • 移动端常用UI组件库

    • Vant
    • Cube UI
    • Mint UI
  • PC端常用UI组件库

    • Element UI
    • IView UI

6.2 element-ui基本使用

  • 安装 element-uinpm i element-ui -S

  • src/main.js

    import Vue from 'vue'
    import App from './App.vue'
    //引入ElementUI组件库
    import ElementUI from 'element-ui';
    //引入ElementUI全部样式
    import 'element-ui/lib/theme-chalk/index.css';Vue.config.productionTip = false
    //使用ElementUI
    Vue.use(ElementUI)new Vue({el:"#app",render: h => h(App),
    })
  • src/App.vue

    <template><div><el-row><el-button>默认按钮</el-button><el-button type="primary">主要按钮</el-button><el-button type="success">成功按钮</el-button><el-button type="info">信息按钮</el-button><el-button type="warning">警告按钮</el-button><el-button type="danger">危险按钮</el-button></el-row><el-date-pickertype="date"placeholder="选择日期"></el-date-picker></div>
    </template><script>export default {name:'App',}
    </script>

效果:
在这里插入图片描述


6.3 element-ui按需引入

  • 安装 babel-plugin-componentnpm install 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 = falseVue.component(Button.name, Button);
    Vue.component(Row.name, Row);
    /* 或写为* Vue.use(Button)* Vue.use(Row)*/new Vue({el:"#app",render: h => h(App),
    })

 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java NIO为何导致堆外内存OOM了?

Java NIO为何导致堆外内存OOM了&#xff1f; 描述 某天报警&#xff1a;某台机器部署的一个服务突然无法访问。谨记第一反应登录机器查看日志&#xff0c;因为服务挂掉&#xff0c;很可能因OOM。这个时候在机器的日志中发现了如下的一些信息&#xff1a; nio handle failed j…

Leetcode—485.最大连续1的个数【中等】明天修改

2023每日刷题&#xff08;十五&#xff09; Leetcode—2.两数相加 迭代法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l…

Python使用got库如何写一个爬虫代码?

got库是一个Python的HTTP库&#xff0c;可以用于爬取网页数据。它提供了简单易用的API&#xff0c;支持异步请求和爬虫IP设置等功能。使用got库进行爬虫开发&#xff0c;可以快速地获取所需数据。下面是使用got库进行爬虫的基本步骤&#xff1a; 1、安装got库&#xff1a;可以使…

ruoyi框架前端修改message消失时间

修改教程 打开modal.js文件&#xff0c;找到Message.success&#xff0c;然后把参数设置进去就行。单位是10001秒。 // 可以设置的参数如下export interface ElMessageOptions {/** Message text */message: string | VNode/** Message type */type?: MessageType/** Custom …

4.5 Object类

思维导图&#xff1a; 4.5 Object类笔记总结 1. 定义和重要性 Java提供的Object类是所有Java类的根类。直接或间接&#xff0c;所有的Java类都继承自Object类。它被称为超类。 2. 默认行为 当创建一个新的类且没有显式地使用extends关键字指定一个父类时&#xff0c;该类默认…

Microsoft Edge不能工作了,可能原因不少,那么如何修复呢

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

金蝶云星空自定义校验器和使用

文章目录 金蝶云星空自定义校验器和使用 金蝶云星空自定义校验器和使用 1、创建类&#xff0c;并继承抽象接口 using Kingdee.BOS.Core; using Kingdee.BOS.Core.Validation; using System;namespace mm.K3.SCM.App.Service.PlugIn.SC.Validator {public class AfterOrderChe…

跨境电商大作战:2023黑色星期五准备指南

黑色星期五&#xff0c;作为全球购物狂欢的象征&#xff0c;已经成为了电商业务的一年一度的重要节点。尤其对于跨境电商来说&#xff0c;这一天意味着巨大的商机和挑战。为了在这个竞争激烈的时刻脱颖而出&#xff0c;跨境电商必须做好充分的准备。Nox聚星在这里给大家分享几个…

最新ai系统ChatGPT程序源码+详细搭建教程+以图生图+Dall-E2绘画+支持GPT4+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

Q-CTRL首次在量子市场获得ISO 27001国际标准认证

​&#xff08;图片来源&#xff1a;网络&#xff09; 国际公认的ISO 27001标准概述了信息安全管理系统&#xff08;ISMS&#xff09;的实施&#xff0c;并表现了管理风险的能力&#xff0c;包括与客户数据安全相关的风险。总部位于悉尼的Q-CTRL是第一家获得ISO 27001认证的独…

学生成绩这样分发

作为一名老师&#xff0c;经常被问到这样的问题&#xff1a;“老师&#xff0c;我的成绩什么时候发&#xff1f;”、“老师&#xff0c;我的成绩出来了吗&#xff1f;”等等。倍感烦恼&#xff0c;需要花费时间来回答这些问题&#xff0c;而且有时候学生还会因为成绩不佳而抱怨…

C++对象的内存分布和虚函数表

Linux C/C 开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全) c中一个类中无非有四种成员&#xff1a;静态数据成员和非静态数据成员&#xff0c;静态函数和非静态函数。 1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。 2.静态数据成员被提取出来…

OpenSSL生成CA证书

基本概念 证书类别 根证书&#xff1a;生成服务端证书&#xff0c;客户端证书的基础。自签名。服务端证书&#xff1a;由根证书签发。配置在服务器上。客户端证书&#xff1a;由根证书签发。配置在浏览器、移动APP等客户端上。 认证方式 单向认证&#xff08;Client鉴权Serv…

jsoncpp fatal error C1083: 无法打开编译器生成的文件

使用jsoncpp库的时候&#xff0c;在Debug模式下正常&#xff0c;但是release却报错&#xff0c;开始以为是开发项目设置问题&#xff0c;于是网络搜索&#xff0c;发现是jsoncpp的编译选项问题。 修改生成静态库文件的工程的属性&#xff1a;路径为&#xff1a;菜单&#xff0…

用二维码搭建设备巡检系统,轻松实现扫码巡检和数字化台账

针对设备状态不透明、纸质记录效率低、故障报修不及时等设备点巡检的常见问题&#xff0c;可以在草料二维码上自主搭建涵盖点检、巡检、报修、维修、保养等功能的管理系统&#xff0c;无需安装APP&#xff0c;微信扫码就能查看设备档案、用表单替代纸质检查表。 譬如“台州沿海…

基于FPGA的图像差分运算及目标提取实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2022/07/28 01:51:…

ctfshow-web入门37-52

include($c);表达式包含并运行指定文件。 使用data伪协议 ?cdata://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg 是<?php system(cat flag.php);?> base64加密 源代码查看得到flag 38 多禁用了ph…

YOLO算法改进3【中阶改进篇】:添加HorNet卷积模块

论文地址:https://arxiv.org/pdf/2207.14284.pdf 源码地址:https://github.com/raoyongming/HorNet. HorNet是在Swin transformer结构的基础上,结合大核思想提出的新的网络结构模块,使用该模块,作者在ImageNet-1k数据集上做分类,分割以及检测任务都在当时达到了SOTA的效果…

数据可视化篇——pyecharts模块

在之前的文章中我们已经介绍过爬虫采集到的数据用途之一就是用作可视化报表&#xff0c;而pyecharts作为Python中可视化工具的一大神器必然就受到广大程序员的喜爱。 一、什么是Echarts&#xff1f; ECharts 官方网站 : https://echarts.apache.org/zh/index.html ECharts 是…

Python的错误和异常处理

一、错误和异常 编程中出现的错误大致可以分为两类&#xff1a;错误和异常。 (一)错误 错误又可以分为两类&#xff1a;语法错误和逻辑错误。 1. 语法错误 语法错误又称解析错误&#xff0c;它是指在编写程序时&#xff0c;程序的语法不符合Python语言的规范&#xff0c;导致…