Vue页面手动刷新,实现导航栏激活项还原到初始状态


Posted in Javascript onAugust 06, 2020

场景描述:在页面中存在顶部导航和左侧导航,左侧导航和右侧内容区使用了命名视图实现,点击左侧导航的链接时,右侧内容区相应显示不同组件内容。问题:在当前链接手动刷新浏览器(例如:浏览器地址为/enterprise/list),顶部导航激活项还原到初始状态(这里默认是“工作台”项)。

原理:每次刷新都会重新实例化Vue,也就是会调用created方法。

<template>
 <el-menu :default-active="defaultActiveIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect" :router="true">
   <el-menu-item index="/">工作台</el-menu-item>


<el-menu-item index="/enterpriseManager">企业管理</el-menu-item>


<el-menu-item index="/orderManager">订单管理</el-menu-item>


<el-menu-item index="/systemManager">系统管理</el-menu-item>

</el-menu>
</template>
<script>
export default {
 name: 'app',
 data () {
  return {
   defaultActiveIndex: "/"
  }
 },
 created() {
  // 组件创建完后获取数据,
  // 此时 data 已经被 observed 了
  this.fetchData()
 },
 methods: {
  handleSelect(index){
   this.defaultActiveIndex = index;
  },
  jumpTo(url){
   this.defaultActiveIndex = url;
   this.$router.push(url); //用go刷新
  },
  fetchData () {
   var cur_path = this.$route.path; //获取当前路由
   var routers = this.$router.options.routes; // 获取路由对象
   var nav_type = "";
   for(var i=0; i<routers.length; i++){
    var children = routers[i].children;
    if(children){
     for(var j=0; j<children.length; j++){
      var grand_children = children[j].children;
      if(grand_children){
       for(var k=0; k<grand_children.length; k++){
        if(grand_children[k].path == cur_path){
         nav_type = routers[i].type;
         break;
        }
       }
      }
     }
    }
   }
   if(nav_type == "home"){
    this.defaultActiveIndex = "/";
   } else if(nav_type == "enterprise"){
    this.defaultActiveIndex = "/enterpriseManager";
   }
  }
 }
 watch: {
  '$route': 'fetchData'
 }
}
</script>

附上router配置格式:

export default [
{
 path: '/',
 type: 'home', //自定义type区分不同模块菜单
 name: 'home',
 redirect: '/dashboard',
 component: Home,
 menuShow: true,
 children: [
  {
   path: '/dashboard',
   component: HomeNav,
   name: 'dashboard',
   leaf: true, // 只有一个节点
   iconCls: 'icon-home', // 图标样式class
   menuShow: true,
   children: [
    { path: '/dashboard', component: Dashboard, name: '首页', menuShow: true }
   ]
  },
  {
   path: '/mySet',
   component: HomeNav,
   name: '我的设置',
   iconCls: 'el-icon-menu',
   menuShow: true,
   children: [
    { path: '/mySet/plan', component: Plan, name: '行程计划', menuShow: true },
    { path: '/mySet/maillist', component: Maillist, name: '通讯录', menuShow: true }
   ]
  }
 ]
},
{
 path: '/enterpriseManager',
 type: 'enterprise',
 name: 'enterprise',
 component: Home,
 redirect: '/enterprise/list',
 menuShow: true,
 children: [
  {
   path: '/enterpriseList',
   component: EnterpriseNav,
   name: 'enterpriseList',
   leaf: true, // 只有一个节点
   iconCls: 'icon-home', // 图标样式class
   menuShow: true,
   children: [
    { path: '/enterprise/list', component: EnterpriseList, name: '企业列表', menuShow: true }
   ]
  },
  {
   path: '/enterpriseAdd',
   component: EnterpriseNav,
   name: 'enterpriseAdd',
   leaf: true, // 只有一个节点
   iconCls: 'el-icon-menu',
   menuShow: true,
   children: [
    { path: '/enterprise/add', component: EnterpriseAdd, name: '企业添加', menuShow: true }
   ]
  },
  {
   path: '/enterpriseValidate',
   component: EnterpriseNav,
   name: 'enterpriseValidate',
   leaf: true, // 只有一个节点
   iconCls: 'el-icon-menu',
   menuShow: true,
   children: [
    { path: '/enterprise/validate', component: EnterpriseValidate, name: '企业认证', menuShow: true }
   ]
  }
 ]
}
]

补充知识:vue手动刷新视图以及其他小问题

最近把手头上一个使用angularJS+jquery各种七七八八组件写的页面拿vue+elementUI重写了一边, 真是极度丝滑, 记录一些vue和elementUI的小问题

1.如果vue中的数据结构比较庞大的话, 十分有可能会出现model更新而视图不更新/model和视图都不更新也不报错的情况, 此时需要手动刷新vue的数据, 在change或click事件中, 使用this.$forceUpdate()手动刷新视图

//像这样
 changeSef: function () {
  //手动刷新视图
  var that = this;
  that.$forceUpdate();
 },

2.在vue中使用setTimeout

//错误示范
setTimeout(bidOrderInit, 200);
//上面那样是不行的,网上查了下, 大致是说在setTimeout中this指向window对象, 
//于是乎被定时的方法中就使用不到vue的this对象了
//正确示范
//可以无视对ie的支持时
setTimeout(()=> {
 this.bidOrderInit();
}, 200);
//需要兼容ie时
setTimeout(function () {
 this.bidOrderInit();
}, 200);

以上这篇Vue页面手动刷新,实现导航栏激活项还原到初始状态就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
网页自动跳转代码收集
Sep 27 Javascript
jQuery实现手机号码输入提示功能实例
Apr 30 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
利用jQuery中的ajax分页实现代码
Feb 25 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
微信小程序 开发经验整理
Feb 15 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
JavaScript 完成注册页面表单校验的实例
Aug 19 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 jQuery
vee-validate vue 2.0自定义表单验证的实例
Aug 28 Javascript
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
ztree+ajax实现文件树下载功能
May 18 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
Aug 06 #Javascript
前端开发基础javaScript的六大作用
Aug 06 #Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
Aug 06 #Javascript
解决vue-router路由拦截造成死循环问题
Aug 05 #Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 #Javascript
vue相同路由跳转强制刷新该路由组件操作
Aug 05 #Javascript
解决vue路由name同名,路由重复的问题
Aug 05 #Javascript
You might like
php下封装较好的数字分页方法
2010/11/23 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
javascript读取xml
2006/11/04 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
Python数据库小程序源代码
2019/09/15 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
举例讲解Python装饰器
2020/12/24 Python
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
高三地理教学反思
2014/01/11 职场文书
幼师求职信
2014/06/23 职场文书
个人整改方案范文
2014/10/25 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
推广普通话主题班会
2015/08/17 职场文书