vue-路由-1-动态子路由-钩子

简介: 先理清楚 router基础,在切换到 脚手架项目就容易了

1. 前言


先理清楚 router基础,在切换到 脚手架项目就容易了


2.嵌套路由


书接上文  可以直接套用上篇文章的模板

核心

路由的嵌套 children属性,对应的值也是个路由配置

可以嵌套多层

redirect

默认的子路由渲染

redirect: "/comment",


const rs = [
        {
            // 默认路由
            path: "/",
            component: Home
        },
        {
            // 第二种方式:通过命名式路由跳转
            path: "/home",
            name: "home",
            component: Home
        },
        {
            path: "/artD",
            name: "article",
            component: Article,
            // 默认的子路由渲染
            redirect: "/comment",
            // 设置Article同级路由下的子路由配置信息
            // 子路由设置
            children: [
                {
                    path: "/artDetil",
                    name: "art",
                    component: ArtDetail,
                },
                {
                    path: "/comment",
                    name: "comment",
                    component: Comment
                }
            ]
        }
    ];

只需要更改这个配置就行, 其他的和上篇文章一样


3.  监听  路由  watch


注意

$route


watch: {
                $route: function (newV, oldV) {
                    console.log("路由改变", newV, oldV)
                    this.artObj = this.$route.query.obj;
                }
            },

第二种写法


watch: {
  '$route' (to, from) {
    const toDepth = to.path.split('/').length
    const fromDepth = from.path.split('/').length
    this.transitionName = toDepth < fromDepth ? 'slide-right' : 'slide-left'
  }
}



4. 路由钩子


可以回想node的 中间件 usenext的用法


beforeRouteUpdate(newV, oldV,next) {
            // 路由正常切换
            next()
            this.artObj = newV.query.obj;
            console.log("------beforeRouteUpdate",newV.query.obj.title);
            console.log("------路由旧的:",oldV.query.obj.title);
        },
        routeUpdated() {
            console.log("updated")
        },



5.路由 简易案例


基本 html结构


<nav id="tab-bar" v-show="showNav">
                <ul id="tab-bar-list">
                    <li class="tab-bar-item" :class="{active:currentTabIndex==0}">
                        <a href="#/home">首页</a>
                    </li>
                    <li class="tab-bar-item" :class="{active:currentTabIndex==1}">
                        <!-- 在vue中推荐使用router-link标签实现页内跳转 -->
                        <router-link to="/addressbook">通讯录</router-link>
                    </li>
                    <li class="tab-bar-item" :class="{active:currentTabIndex==2}">
                        <router-link to="/discovery">发现</router-link>
                    </li>
                    <li class="tab-bar-item" :class="{active:currentTabIndex==3}">
                        <router-link to="/setting">设置</router-link>
                    </li>
                </ul>
            </nav>
        <!-- 路由页面切换时,也可以通过transition添加动画 -->
        <transition :name="aniType">
            <!-- 和动态组件相同,页面级组件之间切换时也是销毁消失的组件,切回时再次创建,如果希望保存消失的组件,可以使用keep-alive -->
            <keep-alive>
                <!-- 在vue中,使用router-view作为路由视图,根据hash值匹配到的组件会显示在router-view中 -->
                <router-view></router-view>
            </keep-alive>
        </transition>


有二级页面的  一级页面组件


<script type="text/html" id="addressbook">
    <div class="add-root first-level-page">
        <h1>联系人联系人联系人</h1>
        <ul>
            <li v-for="p in peoples">
                <router-link :to="'/addressbook/chat/'+p">{{p}}</router-link>
            </li>
        </ul>
    </div>
</script>


二级页面


var chat = {
        template:`
            <div class="chat-root">
                <button @click="backClick">返回</button>
                <p>和{{name}}聊天中。。。。。</p>
            </div>
        `,
        // mounted钩子函数在组件渲染完毕之后调用,如果组件被隐藏并使用了keep-alive,再次切回时,mounted不会再次调用。
        // mounted(){
        //     console.log(this.$route);
        // }
        //activated钩子函数,当组件被激活时调用(隐藏后再次出现)
        activated(){
            // console.log(this.$route);
        },
        computed:{
            name:function(){
                return this.$route.params.name;
            }
        },
        methods:{
            backClick(){
                history.back();
            }
        }
    }


计算属性 动态判断显示哪个界面


computed:{
            //当前显示的页面索引
            currentTabIndex(){
                if(this.$route.fullPath=="/home"){
                    return 0;
                }
                if(this.$route.fullPath=="/addressbook"){
                    return 1;
                }
                if(this.$route.fullPath=="/discovery"){
                    return 2;
                }
                if(this.$route.fullPath=="/setting"){
                    return 3;
                }
            }
        }


路由监听


mounted(){
            var nPageLevel = this.$route.fullPath.split("/").length;
            if(nPageLevel==2){
                this.showNav = true;
            }else{
                this.showNav = false;
            }
        },
        watch:{
            // $route对象可以使用watch进行监听,每当页面的hash值发生变化时,监听函数就会调用
            $route:function(n,o){
                // 根据原始页面和目标页面判断需要执行的动画类型
                var oldPageLevel = o.fullPath.split("/").length;
                var nPageLevel = n.fullPath.split("/").length;
                console.log(oldPageLevel);
                console.log(nPageLevel);
                if(oldPageLevel>nPageLevel){
                    //执行返回动画
                    this.aniType = "pageout";
                }else if(oldPageLevel<nPageLevel){
                    //执行进入动画
                    this.aniType = "pagein";
                }else{
                    //不执行动画
                    this.aniType = "";
                }
                if(nPageLevel==2){
                    this.showNav = true;
                }else{
                    this.showNav = false;
                }
            }
        },



相关文章
|
9天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
65 1
|
20天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
2月前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
35 1
|
2月前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
37 1
|
2月前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
2月前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1067 0
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
50 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
46 1

热门文章

最新文章