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 相关文章推荐
基于jquery的给文章加入关键字链接
Oct 26 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
Nov 11 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
JavaScript判断变量是否为空的自定义函数分享
Jan 31 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
jQuery表格行上移下移和置顶的实现方法
Oct 08 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
如何提高Dom访问速度
Jan 05 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
Sep 24 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
Sep 26 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
Nov 04 Javascript
vue/cli 配置动态代理无需重启服务的方法
May 20 Vue.js
浅谈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过滤黑名单关键字的方法
2014/12/01 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
js 页面执行时间计算代码
2009/03/04 Javascript
比较搞笑的js陷阱题
2010/02/07 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
javascript运算符语法全面概述
2016/07/14 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
jQuery设计思想
2017/03/07 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
python监控文件并且发送告警邮件
2018/06/21 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
python实现车牌识别的示例代码
2019/08/05 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
Python json读写方式和字典相互转化
2020/04/18 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
电气个人求职信范文
2014/02/04 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
租车协议书
2015/01/27 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书