vue-router入门

156 阅读1分钟

Vue核心插件之路由模式

  • 单页面应用的路由模式:哈希模式和history.
  • vue路由原理:哈希模式(核心:锚点)

原理

<a href="#login">登陆</a>
<a href="#register">注册</a>
<div id="app"></div>
<!-- 原理 -->
<script type="text/javascript">
    let app = document.getElementById("app");

    addEventListener("hashchange", function() {
        // console.log(location.hash)
        switch (location.hash) {
            case "#login":
                app.innerHTML = "我是登陆页"
                break;
            case "#register":
                app.innerHTML = "我是注册页"
                break;
            default:
                break;
        }
    })
</script>

安装使用(路由是以插件的形式引入到我们的vue项目)

vue-router:vue的核心插件.

  • 安装:
npm i vue-router -S
  • 使用:
Vue.use(VueRouter)
  • 创建路由对象
var router=new VueRouter();
  • 配置路由规则:
router.addRouters([路由对象])
// 路由对象{[path:"锚点",component:"组件"]}
  • 交给Vue,并在Vue留坑router,

演示代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script>
        <!-- 引入路由插件 -->
        <script src="../js/vue-router.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <router-view></router-view>
        </div>
        <script type="text/javascript">
            var Login={
                template:`
                    <div>我是登陆页面</div>
                `
            }
            // 安装路由插件
            Vue.use(VueRouter);
            // 创建路由对象
            var router=new VueRouter({
                // 配置路由
                routes:[
                    {
                        path:"/login",
                        name:"login",
                        component:Login
                    }
                ]
            });
			
            new Vue({
                el:"#app",
                router
            })
        </script>
    </body>
</html>

路由的跳转

<!-- 标签跳转 -->
<router-link to="/login">登陆</router-link>
|
<router-link to="/register">注册</router-link> 
<!-- js跳转 -->
this.$router.push({path:"/login"}) 
this.$router.replace({path:"/login"}) // 不会对新的history记录
this.$router.go(-1) // 返回,读history后退一个记录

$route:路由信息对象只读

$router:路由操作对象,只写

路由的传参和取参

<!-- 传参 -->
<!-- 查询参 -->
<router-link :to="{name:'login',query:{id:1}}">登陆</router-link>
//this.id = this.$route.query.id
|
<!-- 路由参 -->
<router-link :to="{name:'register',params:{id:'2'}}">注册</router-link>
//this.id=this.$route.params.id

解决不刷新问题

<router-view :key="$route.fullpath"></router-view>

Vue嵌套路由和路由守卫

嵌套路由

<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script>
        <script src="../js/vue-router.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <div id="app">
            <router-view :key="$route.fullpath"></router-view>
        </div>
        <script type="text/javascript">
            var nav = {
                template: `
                    <div>
                        <router-link :to="{name:'nav.index'}">首页</router-link>
                        <router-link :to="{name:'nav.about'}">关于</router-link>
                        <router-link :to="{name:'nav.mine'}">我的</router-link>
                        <router-view :key="$route.fullpath"></router-view>
                    </div>
                `
            }
            var index = {
                template: `
                    <div>我是首页</div>
                `
            }
            var about = {
                template: `
                    <div>我是关于页面</div>
                `
            }
            var mine = {
                template: `
                    <div>我是我的页面</div>
                `
            }

            Vue.use(VueRouter);
            var router = new VueRouter({
                routes: [{
                    path: "/nav",
                    name: "nav",
                    component: nav,
                    // 嵌套路由增加这个属性,配置嵌套路由
                    children: [{
                        path: "",
                        redirect: "/nav/index"
                    }, {
                        path: "index",
                        name: "nav.index",
                        component: index,
                    }, {
                        path: "about",
                        name: "nav.about",
                        component: about,
                    }, {
                        path: "mine",
                        name: "nav.mine",
                        component: mine,
                    }]
                }]
            })

            new Vue({
                el: "#app",
                router
            })
        </script>
    </body>
</html>

路由守卫

new Vue({
    el: "#app",
    router,
    // 路由守卫
    mounted() {
        router.beforeEach((to,from,next)=>{
            console.log(to);
            next();
        })
    }
})