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 相关文章推荐
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
Oct 16 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
Dec 18 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
May 19 Javascript
用JavaScript获取页面文档内容的实现代码
Jun 10 Javascript
javascript运算符——位运算符全面介绍
Jul 14 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
Aug 10 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
Nov 28 Javascript
vue-router配合ElementUI实现导航的实例
Feb 11 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
Vue中fragment.js使用方法小结
Feb 17 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
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
模板引擎正则表达式调试小技巧
2011/07/20 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
设定php简写功能的方法
2019/11/28 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
js获取提交的字符串的字节数
2009/02/09 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Django返回json数据用法示例
2016/09/18 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
应届毕业生的自我鉴定
2013/11/13 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
详解OpenCV曝光融合
2022/04/29 Python