vue 二级菜单制作

第一种方法,用命名路由传值

代码如下:

在绑定时<router-link :to="{name:'home1'}">小说首页</router-link>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div>
            <!-- 变量需要绑定 -->
            <router-link :to="{name:'home1'}">小说首页</router-link>-----------------
            <!-- 绑定变量 -->
            <router-link :to="artObj">小说列表</router-link>
            <!-- query的参数 会在地址栏 进行拼接 类似get请求的参数方式
            params 并不会出现在  地址栏当中 -->
            <!-- <router-link :to="{name:'detailName',params:{id:123},query:{name:'zh'}}">详情页</router-link> -->
        </div>
        <hr>
        <!-- 路由出口 就是匹配路径的页面在哪里显示 -->
        <router-view></router-view>
    </div>
    <script src="../zuoye/作业-星级评分/vue.js"></script>
    <!-- 需要引用路由文件 -->
    <script src="./vue-router.js"></script>
    <script type="text/x-template" id="first">
        <div class="first-wrapper">
            <h1>小说首页加载完成</h1>
            <ul>
                <li v-for="(v, index) in names" :key="index">
                    <span>{{v}}</span>
                </li>
            </ul>
        </div>
    </script>
    <script type="text/x-template" id="second">
        <div class="second-wrapper">
            <h1>小说列表页</h1>
            <ul>
                <li v-for="(v, index) in articles" :key="index">
                    <router-link :to="{name:'detailName',params:{id:v.id},query:{obj:v}}">命名路由-跳转-传参:{{v.title}}</router-link>
                </li>
            </ul>
        </div>
    </script>
    <!-- 小说详情页 -->
    <script type="text/x-template" id="artDetail">
        <div>
            <h1>{{artDetailObj.title}}</h1>
            <h1>{{artDetailObj.content}}</h1>
        </div>
    </script>
    <script>
        // 数据
        var dataArr = [
            {
                id: 1,
                title: "天龙八部",
                content: "北宋年间,外族纷纷觊觎大宋国土,形成汉、辽对立的局面。丐帮帮主乔峰(胡军饰)因拒绝副帮主妻康敏(钟丽缇饰)之爱遭报复指为契丹人后裔而受尽中原武林人士唾弃。乔峰为平反遂四出追查身世,期间认识了大理世子段誉(林志颖饰)及虚竹和尚(高虎饰),并结拜为兄弟。乔峰追寻身世时屡遭奸人所害,含冤莫白,更错杀红颜知己阿朱(刘涛饰),后为救朱妹阿紫(陈好饰)寻医至大辽,辗转成为大辽国南院大王,但与中原关系则更趋恶劣。段誉为人豁达开朗,对貌若天仙的王语嫣(刘亦菲饰)一见倾心,可惜语嫣只钟情其表哥慕容复(修庆饰),令三人陷入一段纠缠不清的苦恋。虚竹天性纯良,宅心仁厚,深得高人指点,武功高强,后被选为西夏驸马。乔峰、段誉和虚竹在异域拥有着举足轻重的地位,在汉辽相争的时势下,各种江湖及情感上的恩恩怨怨正等着他们去面对   。"
            },
            {
                id: 2,
                title: "价值-张磊",
                content: "介绍了张磊的个人历程、他所坚持的投资理念和方法以及他对价值投资者自我修养的思考,还介绍了他对具有伟大格局观的创业者、创业组织以及对人才、教育、科学观的理解"
            },
            {
                id: 3,
                title: "人生若只初见",
                content: "似在谈诗词,又似在谈风月。她不拘泥于对古典诗词字面的理解,也非传统意义上的简单赏析,而是一种风格独特、感情丰富的散文随笔"
            }
        ];
        // 首页
        const First = {
            template: "#first",
            data() {
                return {
                    names: ['首页模块-1', '首页模块-2', '首页模块-3', '首页模块-4', '首页模块-5']
                }
            }
        }
        // 列表页
        const Second = {
            template: "#second",
            data() {
                return {
                    articles: dataArr
                }
            }
        }
        // 详情页
        const ArticleDetail = {
            template: "#artDetail",
            data(){
              return{
                artId:"",
                artDetailObj:null
              }  
            },
            created() {
                this.artId = this.$route.params.id
                this.artDetailObj = this.$route.query.obj 
            },
        }
        // 路由表
        // 命名路由就是给 路由起个别名
        var routes = [
            {
                // 路由表有这个值 上面需要绑定 {name:'home1'}
                path: "/",
                name: "home1",
                component: First
            },
            {
                path: "/second",
                name: "artiD",
                component: Second
            },
            {
                path: "/detail",
                name: "detailName",
                component: ArticleDetail
            }
        ]
        // 路由实例
        const router = new VueRouter({
            routes
        })
        // vue实例
        new Vue({
            el: "#app",
            router,
            data: {
                artObj: {
                    name: "artiD"
                }
            },
            components: {
                First,
                Second,
                ArticleDetail
            }
        })
    </script>
</body>

</html>

如果需要添加评论页:

在列表页添加显示方法:

<script type="text/x-template" id="second">
        <div class="second-wrapper">
            <h1>小说列表页</h1>
            <!-- 常规path写法 -->
            <router-link to="/pinglun">评论页</router-link>
            <!-- 命名路由的写法 -->
            <!-- <router-link :to="{name:'pl'}">评论页</router-link> -->
            <ul>
                <li v-for="(v, index) in articles" :key="index">
                    <router-link :to="{name:'detailName',params:{id:v.id},query:{obj:v}}">命名路由-跳转-传参:{{v.title}}</router-link>
                </li>
            </ul>
            <!-- 怎样区分 一级路由  二级路由 -->
            <!-- 哪个页面的路由一般对应哪个界面的路由出口 -->
            <router-view></router-view>
        </div>
    </script>

 添加模块

<script type="text/x-template" id="comment">
        <div>
            <h1>评论页</h1>
            <ul>
                <li>小说不错</li>
                <li>男主很帅</li>
                <li>挂太多了</li>
                <li>希望不是来凑数的</li>
            </ul>
        </div>

    </script>
// 评论页
        const Comment = {
            template: "#comment"
        }

 路由表写法:

// 路由表
        // 命名路由就是给 路由起个别名
        var routes = [
            {
                // 路由表有这个值 上面需要绑定 {name:'home1'}
                path: "/",
                name: "home1",
                component: First
            },
            {
                path: "/second",
                name: "artiD",
                component: Second,
                // 默认子路由渲染 path 
                redirect: "/pinglun",
                children: [
                    //详情页
                    {
                        path: "/pinglun",
                        name: "pl",
                        component: Comment

                    },
                    {
                        path: "/detail",
                        name: "detailName",
                        component: ArticleDetail
                    }

                ]
            },

        ]

第二种方式:path跳转传值

与第一方式不同在于:<router-link to="/?name=zh&age=18">小说首页</router-link>

注意::这个to在绑定时,不加:!!!!

 命名路由 name 和 路由表里面的name对应 ? 后面 不进行路由匹配
 也就是路由匹配  匹配的是url里面 路径部分
 也就是端口号后面 ? 前面的部分

<div id="app">
        <div>
            <router-link to="/?name=zh&age=18">小说首页</router-link>-----------------
            <!-- 绑定变量 -->
            <router-link :to="artObj">小说列表</router-link>
        <hr>
        <!-- 路由出口 就是匹配路径的页面在哪里显示 -->
        <router-view></router-view>
    </div>

 在当前页面二级菜单的跳转有更改

<script type="text/x-template" id="second">
        <div class="second-wrapper">
            <h1>小说列表页</h1>
            <ul>
                <li v-for="(v, index) in articles" :key="index">
                    <!-- path跳转
                        0. :to=基本结构 绑定变量 模板字符串
                    1.复制 详情页的path
                    2.参数拼接?
                 -->
                    <router-link :to="'/detail/'+v.id+ '?title='+v.title+'&content='+v.content">path路由-跳转-传参:{{v.title}}</router-link>
                </li>
            </ul>
        </div>
    </script>
// 首页
        const First = {
            template: "#first",
            data() {
                return {
         names: ['首页模块-1', '首页模块-2', '首页模块-3', '首页模块-4', '首页模块-5']
                }
            }
        }
        // 列表页
        const Second = {
            template: "#second",
            data() {
                return {
                    articles: dataArr
                }
            },
        }
        // 详情页
        const ArticleDetail = {
            template: "#artDetail",
            data(){
              return{
                artId:"",
                artDetailObj:{}
              }  
            },
            created() {
                
                this.artDetailObj.title= this.$route.query.title
                this.artDetailObj.content= this.$route.query.content
                
            },
        }

 

第三种方式;当前页显示二级菜单内容:

方式二的基础上加上: <router-view></router-view>

 <script type="text/x-template" id="second">
        <div class="second-wrapper">
            <h1>小说列表页</h1>
            <ul>
                <li v-for="(v, index) in articles" :key="index">
                    <!-- path跳转
                        0. :to=基本结构 绑定变量 模板字符串
                    1.复制 详情页的path
                    2.参数拼接?  &
                    字符串的 基础拼接
                 -->
                    <router-link :to="'/detail/'+v.id+ '?title='+v.title+'&content='+v.content">path路由-跳转-传参:{{v.title}}</router-link>
                </li>
            </ul>
            <router-view></router-view>
            <!-- 路由出口
            一级路由对应一级路由的出口
            二级路由对应路由的出口
            路由在那个界面写,出口就在那个界面
            配置二级路由
            -->
        </div>
    </script>

在路由表更改代码如下:关键代码:二级菜单需要用children.

 var routes = [
            {
                // 路由表有这个值 上面需要绑定 {name:'home1'}
                path: "/",
                name: "home1",
                component: First
            },
            {
                path: "/second",
                name: "artiD",
                component: Second,
                // 配置子路由 二级路由
                children: [
                    {
                        path: "/detail/:artId",
                        name: "detailName",
                        component: ArticleDetail
                        // 路由可以无限的嵌套  三级路由  四级路由  一般不会超过5层
                        // children[]
                    }

                ]
            },
        ]

第三种写法优化.路由监听,当前页面点击刷新.需要加watch事件.

 // 详情页
        const ArticleDetail = {
            template: "#artDetail",
            data() {
                return {
                    artId: "",
                    artDetailObj: null
                }
            },
            watch:{
                $route:function(newV,oldV){
                    console.log("详情页-----newV",newV);
                    console.log("详情页-----oldV",oldV);
                    this.artDetailObj = this.$route.query.obj
                }
            },
            created() {
                this.artId = this.$route.params.id
                this.artDetailObj = this.$route.query.obj
            },
        }

使用路由钩子实现二级页面在当前页显示

// 详情页
        const ArticleDetail = {
            template: "#artDetail",
            data() {
                return {
                    artId: "",
                    artDetailObj: null
                }
            },
           
            created() {
                // 两种传值
                // params接收的 传递的参数信息
                console.log("详情页--路由", this.$route.params)
                // query 接收的url地址栏的参数
                console.log("详情页--路由", this.$route.query)
                // 获取用户传过来的id
                // 需要一个数据 来接收 传过来的值
                this.artId = this.$route.params.id
                console.log("传过来的----id", this.artId);
                this.artDetailObj = this.$route.query.obj
            },
            // 路由钩子函数 路由的生命周期
            // 注意不要加r  route 
            beforeRouteUpdate (newV, oldV, next) {
                // 必须允许路由继续往前走
                next()
                console.log("------路由更新之前newV",newV);
                console.log("------路由更新之前oldV",oldV);
                this.artDetailObj = newV.query.obj
            },
            routeUpdate(){
                console.log("路由更新之后");

            }
        }

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值