• vue路由总结


    基本用法及模板

    【首先,安装路由的包】:npm install vue-router --save
    
    【main.js】页面
    
    import Vue from 'vue'
    import App from './App'
    import VueRouter from 'vue-router'  /* 1、引入路由 */
    
    /* 4、引入需要路由跳转的相关组件页面 */
    import Mans from './components/Mans.vue'   
    import Users from './components/Users.vue'
    import List from './components/List.vue'
    
    Vue.config.productionTip = false 
    Vue.use(VueRouter)   /*2、声明路由的使用 */
    
    const router=new VueRouter({   /*5、配置路由,包括路径设置,组件设置 */
      routes:[
        {path:"/",component:Users}, 
        {path:"/mans",component:Mans},   /* /mans是定义路径名称,这里也可以定义为/pigs,/haha等*/
        {path:"/list",component:List},
        {path:"*",redirect:"/mans"}   /*当路由路径输入错误匹配不上时,默认跳转到"/mans"路径下*/
      ],
      mode:"history"   /* 此行代码可以去除路径中的# */
    })
    
    new Vue({
      el: '#app',
      router,   /* 3、在实例化对象里面注册router */
      components: { App },   /* 注意这里是根组件所在处 */
      template: '<App/>'   /* 6、前往根组件处(这里根组件是App.vue)设置路由跳转 */
    })
    
    
    【App.vue】页面
    <template>
      <div id="app">
        <!-- 7、router-link用于跳转路由,router-link在任何子组件中均可使用。 --> 
        <p><router-link to="/">跳转到Users页面</router-link></p>
        <p><router-link to="/mans">跳转到Mans页面</router-link></p>
        <p><router-link to="/list">跳转到List页面</router-link></p> 
    
        <!-- 6、router-view用于展示路由,类似于react路由的this.props.children -->
          <router-view></router-view> 
        
      </div>
    </template>
    
    <script>
      export default {
        name: 'App',
        data(){
          return {
            
          }
        },
        methods:{
          
        }
      }
    </script>
    
    <style></style>
    
    

    知识点讲解

    【tag="div"】
    App.vue页面:
    <p><router-link to="/list" tag="div" >跳转到List页面</router-link></p>   <!--tag="div"的意思是将router-link在dom中设置为以div标签呈现,原本默认router-link是a标签的-->
    
    【动态绑定路由地址,给路由命名,第一种方式】
    <template>
        <div>
            <p><router-link :to="homeLink">跳转到Home主页面</router-link></p>   /*下方在data中定义了homeLink:"/",这里便可以通过:to="homeLink"的方式动态绑定路由,以后直接改动homeLink便可改变路由*/
            <p><router-link to="/mans">跳转到Mans页面</router-link></p>
        </div>
    </template>    
    
    <script>
        export default{
            el:"Home",
            data(){
                return{
                    homeLink:"/"
                }
            }
        }
    </script>
    
    【给路由命名,第二种方式】
    main.js页面:
    const router=new VueRouter({   
      routes:[
        {path:"/",component:Users}, 
        {path:"/mans",name:"mansLink",component:Mans},  /*给此路由命名为mansLink*/
        {path:"/list",component:List},    
        {path:"*",redirect:"/mans"} 
      ],
      mode:"history"  
    })
    Header.vue页面:
    <template>
      <div id="header">
        <!-- 7、router-link用于跳转路由,router-link在任何子组件中均可使用。 --> 
        <p><router-link to="/">跳转到Users页面</router-link></p>
        <p><router-link :to="{name:'mansLink'}">跳转到Mans页面</router-link></p>   /*命名后路由的书写方式*/
        <p><router-link to="/list">跳转到List页面</router-link></p> 
      </div>
    </template>
    
    【设置默认匹配的路由】
    const router=new VueRouter({   
      routes:[
        {path:"/",component:Users}, 
        {path:"/mans",component:Mans},  
        {path:"*",redirect:"/mans"}   /*当路由路径输入错误匹配不上时,默认跳转到"/mans"路径下*/
      ],
      mode:"history"  
    })
    
    【返回上一页,跳转指定页面】
    Home.vue页面:
    <template>
        <div class="home">
            <button v-on:click="goBack" >返回上一页</button>
            <button v-on:click="goPoint">跳转到指定路由:Menu<button>
        </div>
    </template>
    
    <script>
        export default{
            methods:{
                goBack:function(){
                    this.$router.go(-1)  //跳转到上一次浏览的页面
                },
                goPoint:function(){    
                    //this.$router.replace("/menu")   //跳转到指定的路由下
                    //this.$router.replace({name:"menuLink"})  //跳转到指定的路由名字下
                    //this.$router.push("/menu")   //通过push进行指定路由跳转(常用方式)
                    this.$router.push({name:"menuLink"})
                }
            }
        }
    </script>
    

    一级路由,二级路由,三级路由

    【main.js】页面
    import Vue from 'vue'
    import App from './App'
    import VueRouter from 'vue-router'  
    
    /*一级路由*/
    import Mans from './components/Mans.vue'   
    import Users from './components/Users.vue'
    import List from './components/lists/List.vue'
    
    /*二级路由*/
    import ListFood from './components/lists/ListFood.vue'
    import ListPlay from './components/lists/ListPlay.vue'
    import ListSee from './components/lists/ListSee.vue'
    
    /*三级路由*/
    import ListFoodCake from './components/lists/listfood/ListFoodCake.vue'
    import ListFoodCookie from './components/lists/listfood/ListFoodCookie.vue'
    
    Vue.config.productionTip = false 
    Vue.use(VueRouter)   
    
    const router=new VueRouter({   
      routes:[
        {path:"/",name:"usersLink",component:Users}, 
        {path:"/mans",name:"mansLink",component:Mans},   /*一级路由*/
        {path:"/list",name:"listLink",redirect:"/list/listPlay",component:List,children:[   /*二级路由*/
            {path:"/list/listFood",name:"foodLink",redirect:"/list/listFood/listFoodCake",component:ListFood,children:[  /*三级路由*/
                {path:"/list/listFood/listFoodCake",name:"cakeLink",component:ListFoodCake},
                {path:"/list/listFood/listFoodCookie",name:"cookieLink",component:ListFoodCookie},
            ]},
            {path:"/list/listPlay",name:"playLink",component:ListPlay},
            {path:"/list/listSee",name:"seeLink",component:ListSee},
        ]},
        {path:"*",redirect:"/"}  
      ],
      mode:"history"  
    })
    
    new Vue({
      el: '#app',
      router,   
      components: { App },   
      template: '<App/>'   
    })
    
    ——————————————————————
    
    【App.vue】页面
    <template>
         <div class="users">
                <router-link to="{name:'usersLink'}">用户</router-link>
                <router-link to="{name:'mansLink'}">男人装</router-link>
                <router-link to="{name:'listLink'}">列表</router-link>
    
                <div>
                    <router-view></router-view>   /*一级路由的路由展示*/
                </div>
         </div>
    </template>
    
    【List.vue】页面
    <template>
         <div class="list">
                <router-link to="{name:'foodLink'}">美食</router-link>
                <router-link to="{name:'playLink'}">娱乐</router-link>
                <router-link to="{name:'seeLink'}">观赏</router-link>
    
                <div>
                    <router-view></router-view>   /*二级路由的路由展示*/
                </div>
         </div>
    </template>
    
    【ListFoodCake.vue】页面
    <template>
         <div class="listFoodCake">
                <router-link to="{name:'cakeLink'}">蛋糕</router-link>
                <router-link to="{name:'cookieLink'}">饼干</router-link>
    
                <div>
                    <router-view></router-view>   /*三级路由的路由展示*/
                </div>
         </div>
    </template>
    

    全局守卫&路由独享守卫

    【main.js】页面
    import Vue from 'vue'
    import App from './App'
    import VueRouter from 'vue-router' 
    
    import Mans from './components/Mans.vue'   
    import Users from './components/Users.vue'
    import List from './components/List.vue'
    
    Vue.config.productionTip = false 
    Vue.use(VueRouter)   
    
    const router=new VueRouter({   
      routes:[
        {path:"/",component:Users}, 
        {path:"/mans",component:Mans,beforeEnter:(to,from,next)=>{   /*beforeEnter,路由独享守卫,仅在此路由中生效,和全局守卫的区别是作用域不同*/
            if(from.path=="login" || from.path=="/register"){   
            next();
        }else{
            alert("非登陆状态,不能访问此页面!");   /
            next("/login");
        }
        }}, 
        {path:"/list",component:List},
        {path:"*",redirect:"/mans"}  
      ],
      mode:"history"   
    })
    
    /*全局守卫,示例*/
    router.beforeEach((to,from,next)=>{  /*to:要进入的路由,from:你从哪一个路由离开,next:对应的函数*/
        if(to.path=="login" || to.path=="/register"){   /*判断用户是否在登录注册页面,如果是,执行next()进行下一步操作*/
            next();
        }else{
            alert("您还没登录,请先登录!");   /*如果用户在未登录或注册的情况下想点击其他页面,会弹框提醒用户登录注册,然后next()函数引导用户跳转到/login页面*/
            next("/login");
        }
    })
    
    new Vue({
      el: '#app',
      router,   
      components: { App },  
      template: '<App/>' 
    })
    

    组件内守卫

    【Header.vue】页面
    <script>
        export default{
            data(){
                return {
                    name:"二狗子"
                }
            },
            beforeRouteEnter:(to,from,next)=>{  /*进入页面之前*/
                /*alert("Hello"+this.name)*/   /*这行代码中的thia.name是undefined,因为beforeRouteEnter在data之前执行,所以获取不到data里的数据,因此要用下面的方法*/
                next(vm=>{
                    alert("Hello"+vm.name);
                })
            },
            beforeRouteLeave(to,from,next){  /*离开页面之前*/
                if(confirm("确定离开吗?")==true){
                    next()
                }else{
                    next(false)   /*弹框点击确定则离开此页面,弹框点击取消则不做反应*/
                }
            }
        }
    </script>
    

    路由模块单独抽离出来

    在src文件夹下新建routers.js
    
    【main.js】页面抽离路由前
    import Vue from 'vue'
    import App from './App'
    import VueRouter from 'vue-router'  
    
    /*1、路由引入,抽离出去*/
    /*一级路由*/
    import Mans from './components/Mans.vue'   
    import Users from './components/Users.vue'
    import List from './components/lists/List.vue'
    /*二级路由*/
    import ListFood from './components/lists/ListFood.vue'
    import ListPlay from './components/lists/ListPlay.vue'
    import ListSee from './components/lists/ListSee.vue'
    /*三级路由*/
    import ListFoodCake from './components/lists/listfood/ListFoodCake.vue'
    import ListFoodCookie from './components/lists/listfood/ListFoodCookie.vue'
    
    Vue.config.productionTip = false 
    Vue.use(VueRouter)   
    
    /*2、路由配置,抽离出去*/
    const routes=[
        {path:"/",name:"usersLink",component:Users}, 
        {path:"/mans",name:"mansLink",component:Mans},   /*一级路由*/
        {path:"/list",name:"listLink",redirect:"/list/listPlay",component:List,children:[   /*二级路由*/
            {path:"/list/listFood",name:"foodLink",redirect:"/list/listFood/listFoodCake",component:ListFood,children:[  /*三级路由*/
                {path:"/list/listFood/listFoodCake",name:"cakeLink",component:ListFoodCake},
                {path:"/list/listFood/listFoodCookie",name:"cookieLink",component:ListFoodCookie},
            ]},
            {path:"/list/listPlay",name:"playLink",component:ListPlay},
            {path:"/list/listSee",name:"seeLink",component:ListSee},
        ]},
        {path:"*",redirect:"/"}  
      ],
    
    const router=new VueRouter({   
      routes,
      mode:"history"  
    })
    
    new Vue({
      el: '#app',
      router,   
      components: { App },   
      template: '<App/>'   
    })
    
    【main.js】页面抽离路由后
    import Vue from 'vue'
    import App from './App'
    import VueRouter from 'vue-router'  
    import {routes} from './routers'   /*3、路由模块引入*/
    
    Vue.config.productionTip = false 
    Vue.use(VueRouter)   
    
    const router=new VueRouter({   
      routes,
      mode:"history"  
    })
    
    new Vue({
      el: '#app',
      router,   
      components: { App },   
      template: '<App/>'   
    })
    
    【routers.js】页面
    /*1、路由引入,抽离进来*/
    /*一级路由*/
    import Mans from './components/Mans.vue'   
    import Users from './components/Users.vue'
    import List from './components/lists/List.vue'
    /*二级路由*/
    import ListFood from './components/lists/ListFood.vue'
    import ListPlay from './components/lists/ListPlay.vue'
    import ListSee from './components/lists/ListSee.vue'
    /*三级路由*/
    import ListFoodCake from './components/lists/listfood/ListFoodCake.vue'
    import ListFoodCookie from './components/lists/listfood/ListFoodCookie.vue'
    
    //2、路由配置,抽离进来,3、并暴露出去*/
    export const routes=[
        {path:"/",name:"usersLink",component:Users}, 
        {path:"/mans",name:"mansLink",component:Mans},   /*一级路由*/
        {path:"/list",name:"listLink",redirect:"/list/listPlay",component:List,children:[   /*二级路由*/
            {path:"/list/listFood",name:"foodLink",redirect:"/list/listFood/listFoodCake",component:ListFood,children:[  /*三级路由*/
                {path:"/list/listFood/listFoodCake",name:"cakeLink",component:ListFoodCake},
                {path:"/list/listFood/listFoodCookie",name:"cookieLink",component:ListFoodCookie},
            ]},
            {path:"/list/listPlay",name:"playLink",component:ListPlay},
            {path:"/list/listSee",name:"seeLink",component:ListSee},
        ]},
        {path:"*",redirect:"/"}  
      ],
    

    路由复用

    【Users.vue】页面
    <template>
         <div class="users">
                <router-link to="{name:'usersLink'}">用户</router-link>
                <router-link to="{name:'mansLink'}">男人装</router-link>
                <router-link to="{name:'listLink'}">列表</router-link>
    
                <div>
                    <router-view></router-view>   /*一级路由的路由展示*/
                </div>
                <div>   /*1、二级路由的路由在这里复用,为每个router-view添加对应的name,实现复用*/
                    <p><router-view name="listfood"></router-view></p>
                    <p><router-view name="listplay"></router-view></p>
                    <p><router-view name="listsee"></router-view></p>
                </div>
         </div>
    </template>
    
    【routers.js】页面
    /*一级路由*/
    import Mans from './components/Mans.vue'   
    import Users from './components/Users.vue'
    import List from './components/lists/List.vue'
    /*二级路由*/
    import ListFood from './components/lists/ListFood.vue'
    import ListPlay from './components/lists/ListPlay.vue'
    import ListSee from './components/lists/ListSee.vue'
    /*三级路由*/
    import ListFoodCake from './components/lists/listfood/ListFoodCake.vue'
    import ListFoodCookie from './components/lists/listfood/ListFoodCookie.vue'
    
    export const routes=[
        /*{path:"/",name:"usersLink",component:Users}, */  /*2、更改前*/
        {path:"/",name:"usersLink",components:{   /2、更改后:component加s,添加多个组件并为这些组件命名以方便调用*/
            default:Users,  /*default,默认组件为Users*/
            "listfood":listFood,
            "listplay":listPlay,
            "listsee":listSee,
        }}, 
        {path:"/mans",name:"mansLink",component:Mans},   /*一级路由*/
        {path:"/list",name:"listLink",redirect:"/list/listPlay",component:List,children:[   /*二级路由*/
            {path:"/list/listFood",name:"foodLink",redirect:"/list/listFood/listFoodCake",component:ListFood,children:[  /*三级路由*/
                {path:"/list/listFood/listFoodCake",name:"cakeLink",component:ListFoodCake},
                {path:"/list/listFood/listFoodCookie",name:"cookieLink",component:ListFoodCookie},
            ]},
            {path:"/list/listPlay",name:"playLink",component:ListPlay},
            {path:"/list/listSee",name:"seeLink",component:ListSee},
        ]},
        {path:"*",redirect:"/"}  
      ],
    

    页面控制滚动行为

    滚动行为即通过路由导入到当前页面后,浏览器所展示的这部分是整个大页面的哪个位置。
    比如一个长页面的高度有5000px,而浏览器只能展示960px高度的这一部分页面。通过控制滚动行为我们可以设置,当路由跳转过来时,我们展示给用户的是长页面的1000px到1960px这一部分。
    
    【main.js】
    const router = new VueRouter({
        routes,
        mode:"history",
        scrollBehavior(to,from,savePosition){
            return {x:0,y:1000}  /*从(0,1000)的位置开始展示页面*/
            return {selector:".subtitle"}  /*从class="subtitle"的元素开始展示页面*/
        }
    })
    

    贴一份项目中路由的代码

    【src/router/index.js】页面
    
    import Vue from 'vue'
    import Router from 'vue-router'
    Vue.use(Router)
    
    
    import Index from '@/pages/index/index'  //首页
    import Login from '@/pages/user/login'   //登录
    import Register from '@/pages/user/register'   //注册
    import GoodsSearch from '@/pages/search/goodsSearch'   //商品搜索
    import NotFound from '@/pages/notFound/notFound'   //404
    
    export default new Router({
        mode: 'history',  //去掉url中的#
        routes: [
            /* ----首页---- */
            {
                path: '/',
                name: 'Index',
                component: Index,
                meta:{title:'商城'}
            },
    
            /* ----登录注册---- */
            {
                path:'/user/login',
                name:'Login',
                component:Login,
                meta:{title:'登录'}
            },
            {
                path:'/user/register',
                name:'Register',
                component:Register,
                meta:{title:'注册'}
            },
    
            /* ----商品相关---- */
            {
                path:'/search/goodsSearch',
                name:'GoodsSearch',
                component:GoodsSearch,
                meta:{
                    title:'商品搜索'
                }
            },
    
            /* ----404---- */
            {
                path:'/notFound',
                name:'NotFound',
                component:NotFound,
                meta:{
                    title:'页面不存在'
                }
            },
            {
                path:'*',
                redirect:'/notFound',
            }
        ]
    })
    

    vue路由引申

    1、路由有一个meta属性,可以给该路由挂载一些信息,设置一些自己title、显示隐藏、左右滑动的方向之类的
    meta: {
          title: "HelloWorld",    //要显示的title
          show: true         //设置导航隐藏显示
    }
    使用的时候:this.$route.meta.show
    <div v-show="this.$route.meta.show"></div>
    
    
    2、动态路由,获取路由中携带的参数
    {
        path:"/demo/:id",
        component:Demo,
    }
    获取数据this.$route.params.动态路由的名字,this.$route.params.id获取id参数
    
    
    3、路由别名alias
    { 
        path: '/a', 
        component: A, 
        alias: '/b' 
    }
    用户访问 /b 时,url会保持为 /b ,但是路由匹配则为 /a ,
    简单地说就是给 /a 起了一个外号叫做 /b ,但是本质上还是 /a
    
  • 相关阅读:
    libevent简介[翻译]3 前言
    libevent简介[翻译]2 关于异步IO的简单介绍
    gdb调试子进程
    openSUSE Firewalld
    libevent简介[翻译]1 关于这个文档
    构建libevent pdf 文档
    openSUSE编译libevent
    为openSUSE添加源
    .Net Core3.0 WebApi 项目框架搭建 五:仓储模式
    .Net Core3.0 WebApi 项目框架搭建 四:JWT权限验证
  • 原文地址:https://www.cnblogs.com/huihuihero/p/11423346.html
Copyright © 2020-2023  润新知