vue-cli 3.0 通过 vuex.store 及 router.beforeEach 实现控制 主页面 tab-mune.active

最新使用vue-cli 3.0 重构公司H5商城,需要实现一个主页面底部 app-tab-menu(控制首页、我的等页面的菜单导航)

QQ图片20190621150343.png

因为将app-tab-menu放在 App.vue中与<router-view>同级,所以结合vue-routervuex来实现以下效果:
1.app-tab-menu 中的页面匹配当前页面时 ,显示该元素,否则隐藏
2.app-tab-menu对当前页面的item呈现单独的.active样式效果

以下即时简单的实现代码:


//
// App.vue
//
<template>
  <div id="app">
    <router-view/>
    <div class="app-tab-menu" v-show="showAppTabMenu">
      <router-link :to="{path:item.path}" class="app-tab-menu-item" v-bind:class="[item.pathName==currentPageName?'active':'']" v-for="item in appTabMenu">
        <span  class="icon" v-bind:class="[item.iconClass,item.pathName==currentPageName?'active':'']"></span>
        <p class="name">{{item.name}}</p>
      </router-link>
    </div>
  </div>
</template>
<script>
  export default {
    name: 'App',
    data() {
      return {
        appTabMenu:[
          {name:'首页',pathName:'home',path:'/',iconClass:'icon-app-tab-menu-home'},
          {name:'我的',pathName:'about',path:'/about',iconClass:'icon-app-tab-menu-my'},
        ],
      }
    },
    computed:{
      currentPageName(){ // 监听 store.state.currentPageName 的改变
        return this.$store.state.currentPageName;
      },
      showAppTabMenu(){ //  store.state.currentPageName 改变时,重新判断 app-tab-menu 是否需要显示
        let current = this.$store.state.currentPageName;
        let arr =this.appTabMenu.filter((v,i)=>{
          return v.pathName == current;
        });
        return arr.length;
      },
    },
    created() {
      console.log('App.vue created()');
    },
  }
</script>
//
// store.js
//
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    currentPageName:'',// store.state.currentPageName  是 app-tab-menu 是否显示判断的关键
  },
  mutations: {
    updatePageName(state,name){
      if(typeof name == 'string' && name.length>0){
        state.currentPageName = name;
      }
    }
  },
})
//
// router.js
//
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
import store from './store'

Vue.use(Router);

let router =  new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '*',
      name: '404',
      component: () => import(/* webpackChunkName: "404" */ './views/404.vue')
    },
    {
      path: '',
      name: 'null',
      redirect: { name: 'home' }
    },
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (about.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
    }
  ]
});

router.beforeEach((to,from,next)=>{
  console.log(`${from.name} ==>> ${to.name}`);
  store.commit('updatePageName',to.name);//路由改变时,显式的改变 store.state.currentPageName 状态值
  next();
});
export default router;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 4,876评论 0 1
  • 古木葱郁,银瀑飞泻,读一卷书,品一杯茶,就在安静的竹亭里。看一看这周遭冷绿,想一想便心生凉意。多美啊,多好...
    冰夫阅读 715评论 0 0
  • 今天继续阅读《有钱人和你想的不一样》的财富宝典的第6—10条。 6、欣赏他人 有钱人欣赏有钱人和成功人士,而穷人则...
    北夜极星阅读 903评论 0 1
  • 书中提出,人生七年就是一辈子,人一生可以过很多辈子,每一次都是一次重生。在读李笑来老师的这本书时,大脑高速运转,接...
    设计师爱读书_韩春峰阅读 4,700评论 0 4
  • 十二、金玲毒气 何谓金玲毒气?这要追溯到十五年前,那时的江湖,太平了很久,这主要归功于武林大宗都十分和睦,并无你争...
    五行缺水也缺你阅读 3,106评论 0 0