Vue——嵌套路由

news/2024/7/10 1:40:42 标签: vue, 路由器

路由

有关路由的详细信息可以去vue的官网去查看,我这里只是自己实例的一个理解和总结。

单页面程序离不开路由的分配,自始至终只有一个页面存活,因此有关路由跳转的逻辑要合理配置


vueRouter_6">vue-Router

选择官方使用的vue-router库,因此要先准备环境

  • 安装
$ npm install vue-router

安装之后就要配置路由,但是为了方便维护路由节点,可以创建单独的文件存放路由配置,因此创建router文件夹,添加index.js

  • index.js

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

export default new VueRouter({
	routes: []
})


然后在根入口文件中导入router,并配置到vue实例中。

  • main.js
import router from './router'

 new Vue({
    el: '#app',
    components: {App},
    template: '<App/>',
    router
})

这样就能在各个模块中使用路由了。


实例

在src目录下创建views目录,分别创建about、home、news、message、detail的vue页面。

  • 路由映射文件——index.js

import Vue from 'vue'
import VueRouter from 'vue-router'

import About from '../views/About.vue'
import Home from '../views/Home.vue'
import News from '../views/News.vue'
import Message from '../views/Message'
import Detail from '../views/detail.vue'

Vue.use(VueRouter)

export default new VueRouter({
    routes: [
        {path: '/', redirect: '/about'},
        {path: '/about', component: About},
        {
            path: '/home',
            component: Home,
            children: [
                {path: 'news', component: News},
                {
                    path: 'message',
                    component: Message,
                    children: [
                    {path: 'detail/:id', component: Detail}
                    ]
                },
                {path: '', redirect: 'news'}

            ]
        }
    ]
})

路由映射配置好之后就要开始使用了

使用 router-link 组件来导航。 通过传入 to 属性指定链接。 默认会被渲染成一个 <a> 标签

<template>
    <div>
        <div class="row">
            <div class="col-xs-offset-2 col-xs-8">
                <div class="page-header">
                    <h2>Router basic-2</h2>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-xs-2 col-xs-offset-2">
                <div class="list-group">
                <router-link to="/about" class="list-group-item">About</router-link>
                <router-link to="/home" class="list-group-item">Home</router-link>
                    <!-- <a href="#/about" class="list-grou-item router-link-exact-active activeClass">About</a>
                    <a href="#/home" class="list-group-item">Home</a> -->
                </div>
            </div>
            <div class="col-xs-6">
                <div class="panel">
                    <div class="panel-body">
                        <keep-alive>
                        <router-view></router-view>
                        </keep-alive>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

样式是使用的bootstrap的cdn,将其以link的形式引用到index.html中。
APP中是分成了两个块,头部用来显示信息,下边则是组件的部分,其中左侧添加了路由导航,右侧将路由匹配到的组件渲染出来。


页面

接着就要实现页面的信息了,当点击左侧的home导航,右侧就会将home的组件渲染到右侧。

<template>
<div>
    <ul class="nav nav-tabs">
        <li>
            <router-link to="/home/news" >news</router-link>
        </li>
        <li>
            <router-link to="/home/message" >Message</router-link>
        </li>
    </ul>
    <div>
    <router-view></router-view>
    </div>
</div>
</template>

此处可以看到在home页面中也有路由的嵌套,当点击home中的message导航时,就会将message组件的内容渲染出来


<template>
<div>
    <ul>
        <li v-for="message in messages" :key="message.id">
            <router-link :to="`/home/message/detail/${message.id}`">{{message.title}}</router-link>
        </li>
    </ul>
    <router-view></router-view>
</div>
</template>

<script>
export default {
    data () {
        return {
            messages: []
        }
    },
    mounted () {
        setTimeout(() => {
            const temp = [
                { id: 1, title: 'message' },
                { id: 2, title: 'message' },
                { id: 3, title: 'message' },
                { id: 4, title: 'message' }
            ]
            this.messages = temp
        }, 500)
    }
}
</script>

在这里插入图片描述
当点击message时就会将vue实例中的messages赋值,然后绑定到页面中。
其中当点击循环出来的title时还会再次触发路由,此时将该条数据的ID传给detail,然后把detail组件放在下边渲染出来。


当detail组件初始化的时候就应该去获取路由参数,然后根据参数中的值去请求后台拿到相应的数据,然后在实现绑定渲染的效果。但这个实例中没有与后台交互,因此在初始化拿到数据后就自动创建一个模拟数据(忘了用插件了)。

<template>
<div>
    <ul>
        <li>id: {{$route.params.id}}</li>
        <li>title: {{detail.title}}</li>
        <li>content: {{detail.content}}</li>
    </ul>
</div>
</template>

<script>
export default {
    data () {
        return {
            detail: {}
        }
    },
    methods: {
        getDetail (id) {
             this.detail = {id: id, title: 'message' + id, content: 'message content'}
        }
    },
    mounted () {
        const id = this.$route.params.id
        this.getDetail(id)
    },
    watch: {
        $route: function () {
        this.getDetail(this.$route.params.id)
        }
    }
}
</script>

这里添加了一个监视器,用来监听路由上的ID值,每当有变化就改变data中的数据,重新获取当前值。


router-view

另外一种方式就是通过标签传值,当message组件被渲染时代表其通过router-view标签,此时可以在标签上添加参数来传值,而被渲染的组件内部只需要通过props来获取即可。

	// father
    <router-view msg="abc"></router-view>
	// son
	  props: {
        msg: String
    },

总结

vue-router作为vue的官方库应该是很强的,只不过目前接触的比较少,只能稍微明白怎么用。目前明白的就是有一个路由导航,当触发路由后将导航匹配到的组件通过路由标签渲染出来。有关路由取值目前还没总结,这也是一个比较重要的知识。这次的传值是通过路由 :id 直接配置的,相当于一个占位符,要想进入该页面,在触发时就要把id传进去。


http://www.niftyadmin.cn/n/1834389.html

相关文章

html / js / flash的视频、音频播放器

1.首先&#xff0c;目前最好的flash js的播放器&#xff0c;是JW Player&#xff0c;目前版本是6.0&#xff0c;这个免费版本&#xff0c;有JW的Logo&#xff0c;右键菜单也有JW的说明。但是&#xff0c;对于一般用户&#xff0c;这完全不碍事&#xff01;&#xff01; 2.当时…

vue+element+axios+axios拦截+ajax请求抽离+less项目搭建

样本在我的下载 //使用淘宝镜像 npm install -g cnpm --registryhttps://registry.npm.taobao.orgvue init webpack vue-pc // 创建项目cnpm i // 装包cnpm i element-ui -D // 安装elementcnpm install babel-plugin-component -D //element按需引入src/main.js import ./c…

了解雪碧图

所谓雪碧图就是讲很多小图标放在一张图上。其是一种CSS图像合并技术&#xff0c;该方法是将小图标和背景图像合并到一张图片上&#xff0c;然后利用css的背景定位来显示需要显示的图片部分。 这样做的好处 将多张图片合并到一张图片中&#xff0c;可以减小图片的总大小将多张图…

vue-router 滚动行为

var routernew VueRouter({routes:[],scrollBehavior(to,from,savedPosition){//return 滚动的位置} })例子 scrollBehavior(to,from,savedPosition){return{x:number,y:number} }滚动到锚点 scrollBehavior (to, from, savedPosition) {if (to.hash) {return {selector: to.…

C#继承小结——面向对象编程的三大机制之一

继承反应了类和类之间的关系。 世界上很多事物都是有共性的&#xff0c;共性的那一部分我们就抽象为基类&#xff0c;用于派生其它类&#xff0c;这样提高了代码的复用性&#xff0c;使得代码的结构清晰易读&#xff0c;而且易于代码的扩展和维护。 C#的继承只能继承自一个基类…

css之昼夜交替

在看了B站up主阿阳热爱前端的一个HTMLCSS教程实例后&#xff0c;跟着做了一遍&#xff0c;具体的代码和效果如下&#xff1a; 效果&#xff1a; 昼夜交替 源码&#xff1a; 阿阳热爱前端 / alternately 对于此篇&#xff0c;我只是总结我学到或需要复习的一些知识点&#xff0c…

为什么有些人说 Windows 7 不如 Windows XP 好用?

Win7做了很多改进&#xff0c;在一些细节方面也有了提升。为什么还有这么多人认为WinXP更好用呢&#xff1f; XP&#xff1a; 处于16位PC和32位PC交接时代 并成功交接 Windows 7 &#xff1a; 处于32位PC和64位PC交接时代 也即将成功交接 &#xff08;本来应该是他的前任V…

[vue]——question

v-show和v-if v-show和v-if都是用来控制组件显隐的指令&#xff0c;区别在于两者的实现原理。 v-show是通过css的display属性来控制显示与隐藏v-if是将实现组件的销毁与渲染&#xff0c;并不是简单地显示与隐藏 因此关于两者的使用时要判断该组件是否会频繁切换&#xff0c;…