Vue Router - 路由的使用、两种切换方式、两种传参方式、嵌套方式

目录

一、Vue Router

1.1、下载

1.2、基本使用

a)引入 vue-router.js(注意:要在 Vue.js 之后引入).

 b)创建好路由规则

c)注册到 Vue 实例中

d)展示路由组件

1.3、切换路由的两种方式

1.3.1、以标签的方式切换

1.3.2、以 js 方式切换

1.3.3、在 VueRouter 中多次切换同一个路由存在问题

a)解决方法一:每次切换路由前手动判断

1.4、两种传参方式

1.4.1、通过 querystring 传参

1.4.2、通过 restful 传参

1.5、嵌套路由的使用


一、Vue Router


1.1、下载

通过 Vue Router 可以将现有的 Vue 开发更灵活,使得一个页面中展示多个不同的组件.

下载地址如下:

https://unpkg.com/vue-router/dist/vue-router.js

1.2、基本使用

a)引入 vue-router.js(注意:要在 Vue.js 之后引入).

    <script src="../js/vue.js"></script>
    <!-- router 必须在 vue.js 之后引入 -->
    <script src="../js/vue-router.js"></script>

 b)创建好路由规则

        //1.创建路由对象
        const router = new VueRouter({
            //配置路由规则:
            //path: 代表路由路径('#/' 这个哈希路由后面要添加的路由)
            //component: 代表路由路径对应的组件
            //redirect: 代表路由重定向
            //path: "*" 表示匹配所有路由
            routes: [
                // { path: '/', component: login }, //配置默认路由(一打开页面就有登录功能),但是!规范不建议一个组件对应多个路由
                { path: '/', redirect: '/login' }, //因此可以通过 redirect 进行重定向
                { path: '/login', component: login },
                { path: '/reg', component: register },
                { path: '*', component: notFound } //在老的版本,这个规则必须放在最后一行,但是后续官方做了优化,放哪都可以,但是建议还是放在结尾
            ]
        });

在实际的项目中,component 后面最好写成 箭头函数,可以提高效率(懒汉模式,使用的时候才加载).

最佳写法如下:

        //1.创建路由对象
        const router = new VueRouter({
            //配置路由规则:
            //path: 代表路由路径('#/' 这个哈希路由后面要添加的路由)
            //component: 代表路由路径对应的组件
            //redirect: 代表路由重定向
            //path: "*" 表示匹配所有路由
            routes: [
                { path: '/', redirect: '/login' },
                { path: '/login', component: () => import('../views/Login') }, //这里的 Login 就是 Login.vue 的前缀 
                { path: '/reg', component: () => import('../views/Reg') },
                { path: '*', component: () => import('../views/404') } 
            ]
        });

 

这里定义的组件如下:

        const login = {
            template: `<div><h2>登录功能</h2></div>`,
        }

        const register = {
            template: `<div><h2>注册功能</h2></div>`,
        }

        const notFound = {
            template: `<div><h2>404 not found 页面飞到外太空了~</h2></div>`,
        }

c)注册到 Vue 实例中

        const app = new Vue({
            el: "#app",
            data: {
                msg: "Vue路由章节"
            },
            router //2.注册路由
        });

d)展示路由组件

router-view 标签用来渲染组件

    <div id="app">

        <!-- 3.展示路由组件 -->
        <router-view></router-view>

    </div>

1.3、切换路由的两种方式

1.3.1、以标签的方式切换

        <!-- 1.链接 -->
        <a href="#/login">登录</a>
        <a href="#/reg">登录</a>
        <hr>
        <!-- 2.标签  必须要有 to 属性, to="路由路径" -->
        <router-link to="/login">登录</router-link>
        <router-link to="/reg">注册</router-link>
        <hr>
        <!-- 3.标签 -->
        <router-link :to="{path: '/login'}">登录</router-link>
        <router-link :to="{path: '/reg'}">注册</router-link>
        <hr>
        <!-- 4.标签  根据路由对象 name 属性来切换路由 -->
        <!-- 推荐:路由随时可能会变,而命名不会变,因此可以起到解耦合的作用 -->
        <router-link :to="{name: 'Login'}">登录</router-link>
        <router-link :to="{name: 'Register'}">注册</router-link>

以下是路由规则和组件

        const login = {
            template: `<div><h1>登录功能</h1></div>`
        }

        const register = {
            template: `<div><h1>注册功能</h1></div>`
        }

        //创建路由对象
        const router = new VueRouter({
            routes: [
                //name 表示这个路由对象的唯一身份标识
                { path: '/login', component: login, name: "Login" },
                { path: '/reg', component: register, name: "Register" },
            ]
        });

1.3.2、以 js 方式切换

a)例如通过点击事件,触发路由切换

        <button @click="loginSuccess()">一键注册成功</button>
        <!-- 展示组件 -->
        <router-view></router-view>

b)注册组件和创建路由规则

        const login = {
            template: `<div><h1>登录</h1></div>`
        }
        const reg = {
            template: `<div><h1>注册</h1></div>`
        }
        const router = new VueRouter({
            routes: [
                { path: "/", redirect: "/reg" },
                { path: "/login", component: login, name: "Login" },
                { path: "/reg", component: reg, name: "Reg" },
            ]
        });

c)js 切换路由

        const app = new Vue({
            el: "#app",
            data: {
                msg: "js 切换路由"
            },
            methods: {
                loginSuccess() {
                    // this.$router.push("/login");//不推荐
                    // this.$router.push({ path: '/login' });//不推荐
                    this.$router.push({ name: "Login" });//推荐使用名称切换
                }
            },
            router
        });

1.3.3、在 VueRouter 中多次切换同一个路由存在问题

在 VueRouter 中多次切换相同路由出现错误,如下:

有两种解决办法,如下:

首先我们要知道:

  • this.$route 代表当前路由对象 route.
  • this.$router 代表路由管理器对象 VueRouter.
a)解决方法一:每次切换路由前手动判断
        const app = new Vue({
            el: "#app",
            data: {
                msg: "js 切换路由"
            },
            methods: {
                loginSuccess() {
                    //在 VueRouter 中多次切换相同路由出现错误解决办法:
                    //1.每次切换前手动判断一下(不推荐,太麻烦)
                     if (this.$route.name != "Login") {
                         this.$router.push({ name: "Login" });
                     }

                }
            },
            router
        });

b)解决方法二:官方配置

在创建路由规则对象之后加入如下配置

        //2.官方配置:解决 VueRouter 中同一路由多次切换报错问题
        const original = VueRouter.prototype.push;
        VueRouter.prototype.push = function push(location) {
            return original.call(this, location).catch(err => err)
        };

之后你就可以直接写切换路由的方法了.

                loginSuccess() {
                    this.$router.push({ name: "Login" });
                }

1.4、两种传参方式

1.4.1、通过 querystring 传参

例如 /login?name=cyk&password=1111

a)如下四种路由传参方式(推荐最后一种)

        <!-- query -->
        <a href="#/login?name=cyk&password=123">登录</a>
        <router-link to="/login?name=cyk&password=123">登录</router-link>
        <router-link :to="{path: '/login', query:{name:'cyk', password:1111}}">登录</router-link>
        <router-link :to="{name: 'Login', query:{name:'cyk',password:1111}}">登录</router-link>

b)在组件中获取参数,如下:

        const login = {
            template: `<div><h1>登录功能</h1></div>`,
            created() { //生命周期:已执行完 组件内部事件 和 生命周期函数注册,自身的 data、methods、computed 属性注入和校验
                //通过 querystring 获取参数 
                console.log(this.$route); //获取当前路由对象
                console.log(this.$route.query.name);
                console.log(this.$route.query.password);
            }
        }

c)路由对象如下:

        //创建路由对象
        const router = new VueRouter({
            routes: [
                //querystring 传参
                { path: '/login', component: login, name: "Login" }
            ]
        });

1.4.2、通过 restful 传参

例如 /login/cyk/1111

a)如下三种传参方式(推荐最后一种)

        <!-- restful -->
        <a href="#/register/6/lyj">注册</a>
        <router-link :to="{path: '/register/11/lyj'}">注册</router-link>
        <router-link :to="{name: 'Register', params:{id:11, name:'lyj'}}">注册</router-link>

b)在组件中获取参数,如下:

        const register = {
            template: `<div><h1>注册功能</h1></div>`,
            created() {
                //通过 restful 获取参数
                console.log(this.$route); //获取当前路由对象
                console.log(this.$route.params.id);
                console.log(this.$route.params.name);
            }
        }

c)路由对象如下:

        //创建路由对象
        const router = new VueRouter({
            routes: [
                //querystring 传参
                { path: '/login', component: login, name: "Login" },
                //restful 传参
                { path: '/register/:id/:name', component: register, name: "Register" },
            ]
        });

1.5、嵌套路由的使用

在创建 VueRouter 中,path 还有一个 children 参数,用来定义嵌套子组件路由.

例如需求:

1.现在有一个用户列表

2.当点击 “添加用户信息” 时,显示以下对话框

3.点击提交后,回归用户列表路由

实现如下:

a)如下定义组件

    <template id="users">
        <div>
            <h3>用户列表</h3>
            <router-link :to="{name:'adduser'}">添加用户信息</router-link>
            <table border="1">
                <tr>
                    <td>id</td>
                    <td>name</td>
                </tr>
                <tr>
                    <td>{{ users.id }}</td>
                    <td>{{ users.name }}</td>
                </tr>
            </table>
            <!-- 显示嵌套子组件 -->
            <router-view></router-view>
        </div>
    </template>

    <template id="add-user">
        <div>
            <div>
                <span>id: </span>
                <input type="text">
            </div>
            <div>
                <span>name: </span>
                <input type="text">
            </div>
            <button @click="submit()">提交</button>
        </div>
    </template>

    <script>

        //用户列表
        const users = {
            template: '#users',
            data() {
                return {
                    users: [] //这里不能写死,需要请求后端得到参数
                }
            },
            created() {
                //在组件构建完成后,请求后端得到 users 的所有数据,覆盖空数组
                this.users = { id: 1, name: 'cyk' }
            }
        }

        //添加用户
        const adduser = {
            template: '#add-user',
            methods: {
                submit() {
                    //向后端发送请求
                    //提交完成后切换路由
                    this.$router.push({ name: 'users' });
                }
            }
        }
    </script>

b)创建路由对象

        //创建路由对象
        const router = new VueRouter({
            routes: [
                {
                    path: '/users', component: users, name: 'users',
                    children: [  //嵌套子组件路由
                        //注意:嵌套路由中,子路由不能使用 / 开头
                        { path: 'adduser', name: 'adduser', component: adduser } //可以通过 /users/useradd 访问到此
                    ]
                },
            ]
        });

c)注册到 Vue 实例中

        const app = new Vue({
            el: "#app",
            component: {
                users,
                adduser
            },
            router
        });

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue Router 是一个官方提供的 Vue.js路由管理器,可以用于构建单页面应用程序。嵌套路由是指在一个路由的组件中使用另一个路由。 在 Vue Router 中,可以通过在路由配置文件中定义嵌套路由嵌套路由的配置是以树形结构来组织的,父级路由将会嵌套渲染其子路由的组件。 下面是一个示例的路由配置文件,演示了如何使用嵌套路由: ```javascript import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const routes = [ { path: '/', component: Home, children: [ { path: '', component: Dashboard }, { path: 'about', component: About }, { path: 'products', component: Products, children: [ { path: '', component: ProductList }, { path: ':id', component: ProductDetail } ] } ] } ] const router = new VueRouter({ routes }) export default router ``` 在上面的代码中,父级路由 '/' 下包含了三个子路由:Dashboard、About 和 Products。而 Products 路由又包含了两个子路由:ProductList 和 ProductDetail。 在组件中使用嵌套路由时,需要在父级组件中使用 `<router-view>` 标签来渲染子路由的内容。 ```html <template> <div> <h1>Home</h1> <router-view></router-view> </div> </template> ``` 在父级组件的模板中,通过使用 `<router-view>` 标签,子路由的内容将会被渲染在这个位置。 这就是 Vue Router嵌套路由的基本使用方法。通过嵌套路由,可以更好地组织和管理应用程序的路由结构,实现更复杂的页面布局和导航功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值