vue 小白初次实践踩坑(二)-路由与location

本文介绍了Vue小白在实践中遇到的路由问题,包括如何实现点击导航跳转页面并保持选中状态,以及如何根据location判断首次进入时的导航选中状态。涉及到Vue路由的使用及模拟layui导航的hover样式应用。

vue 小白初次实践踩坑(二)-路由与location

需求:

第一种:要求点击不同的导航跳转到另一个页面,在另一个页面上也有通用的导航,刚刚点击的那个导航应该处于选中状态(高亮)

<template>
    <div>
        <ul class="header-menu" ref="MainHeader" @mouseleave="handleLeaveMainHeader">
            <li v-for="(item,index) in nav_data" :key="index" :id="item.id" :class="{active:index === activeIndex}" 
            @mouseenter="setCurrentNav(index)">
                <a :href="item.url" target="_blank">{{item.name}}</a>
            </li>
            <span class="nav-underline" :style="currentNavStyle" style="opacity: 0;" ref="bar"></span>
        </ul>
    </div>
</template>

<script>
    export default{
        name:'RpNavHead',
        data() {
            return {
                activeNav:1,
                currentNavStyle:{
                    width:'0',
                    left:'0'
                },
                nav_data:[
                    {
                        id:'navWorkbench',
                        name:'工作台',
                        url:'//hc.hanmaker.com/app_common/index.php?m=workbench&a=index',
                    },
                    {
                        id:'navWorkReport',
                        name:'工作报告',
                        url:'//okr.hanmaker.com/#/myreport/wrtreport?source=1',
                    },
                    {
                        id:'navApproval',
                        name:'审批流程',
                        url:'//approval.hanmaker.com/approval-index',
                    },
                    {
                        id:'navYun',
                        name:'团队文档',
                        url:'//yun.hanmaker.com/index/personal/17',
                    },
                    {
                        id:'navWj',
                        name:'韩创问卷',
                        url:'//wj.hanmaker.com/survey#/home',
                    },
                    {
                        id:'navAssessment',
                        name:'评估',
                        url:'//okr.hanmaker.com/#/assessment/template?source=1',
                    },
                    {
                        id:'navOkr',
                        name:'OKR',
                        url:'//okr.hanmaker.com/#/okr/my?source=1',
                    }
                ]
            }
        },
        computed: {
            //通过路由与location计算,返回对应的index
            activeIndex(){
               let route_name  = this.$route.path;
               if(route_name.indexOf('/okr')==0){
                   return 6;
               }
               if(route_name.indexOf('/assessment')==0){
                   return 5;
               }
               if(this.$route.name == 'EditTemplate'){
                   if(this.$store.state.location == 'assess_template'){
                       return 5;
                   }
               }
                return 1;
            }
        },  
        methods: {
            setCurrentNav (index) {
                this.currentNav = index;
                let client = this.$refs.bar.getBoundingClientRect();
                this.currentNavStyle = this.getNavStyle(index);
            },
            getNavStyle (index) {
                let childNodes = this.$refs.MainHeader.childNodes;
                let width = childNodes[index].clientWidth+'px';
                let left = 0;
                if (index > 0) {
                    for (let i = 0; i < index; i++) {
                       left += childNodes[i].clientWidth
                    }
                }
                left +='px';
                let opacity = 0;
                if (opacity == 0){
                    opacity = 1;
                }else{
                    return false
                }
                return {width, left, opacity}
            },
            handleLeaveMainHeader () {
                let client = this.$refs.bar.getBoundingClientRect();
                this.currentNavStyle = {
                    width:'0',
                    left:client.left-240+(this.$refs.bar.clientWidth/2)+'px',
                }
                this.$forceUpdate();
            },
        },
    }
</script>

这段代码还涉及关于模拟layui导航hover跟随样式,仅供参考!

第二种:只有两个导航,在第一次根据链接进入时,选中的状态根据location判断:

<template>
    <el-container class="hc-container">
        <el-header class="hc-header">
            <rp-header/>
        </el-header>
        <el-container class="hc-container-body">
            <el-aside width="240px" class="hc-aside">
                <rp-side v-if="!isAssessment && !isOkr"/>
                <pg-side v-if="isAssessment"/>
                <okr-side v-if="isOkr"/>
            </el-aside>
            <!-- 移动端导航 -->
            <div class="admin-aside-nav">
                <div class="admin-aside-nav-body">
                    <ul>
                    //根据location判断
                        <li @click="cur=0" :class="{'is_active':location=='myreport'}">
                            <router-link class="nav-item" to="/myreport/wrtreport">
                                <span>我的报告</span>
                            </router-link>
                        </li>
                        //根据location判断
                        <li @click="cur=1" :class="{'is_active':location=='member'}">
                            <router-link class="nav-item" to="/member">
                                <el-badge :value="$store.state.report_count" :max="99" class="item"
                                          :hidden="$store.state.report_count==0">
                                    <span>成员报告</span>
                                </el-badge>
                            </router-link>
                        </li>
                    </ul>
                </div>
            </div>
            <el-main class="hc-main admin-main">
                <router-view></router-view>
            </el-main>
        </el-container>
    </el-container>
</template>

<script>
    // @ is an alias to /src
    import RpHeader from '../components/RpHeader'
    import RpSide from '../components/RpSide'
    import PgSide from '../components/PgSide'
    import OkrSide from '../components/OkrSide'

    export default {
        name: 'Home',
        components: {
            RpHeader,
            RpSide,
            PgSide,
            OkrSide
        },
        data() {
            return {
                cur: 0,
                is_showSide: 1
            }
        },
        computed: {
            isAssessment() {
                if (this.$route.path.indexOf('assessment') >= 0) {
                    return true;
                }
                return false;
            },
            isOkr() {
                if (this.$route.path.indexOf('okr') >= 0) {
                    return true;
                }
                return false;
            },
            //把location传过来
            location(){
                return this.$store.state.location;
            }
        },
    }
</script>

<style scoped>
</style>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值