详解Nuxt内导航栏的两种实现方式


Posted in Javascript onApril 16, 2020

方式一 | 通过嵌套路由实现

在pages页面根据nuxt的路由规则,建立页面

1. 创建文件目录及文件

详解Nuxt内导航栏的两种实现方式

根据规则,如果要创建子路由,子路由的文件夹名字,必须和父路由名字相同

所以,我们的文件夹也为index,index文件夹需要一个默认的页面不然nuxt的路由规则就不能正确匹配页面

一级路由是根路由

二级路由是index,user,默认进入index路由

下面是router页面自动生成的路由

{
  path: "/",
  component: _93624e48,
  children: [{
   path: "",
   component: _7ba30c26,
   name: "index"
  }, {
   path: "user",
   component: _6934afa7,
   name: "index-user"
  }]
 }

2. html页面增加nutx-child配合子路由跳转

<template>
 <div class="container">
  <div>
   <logo />
   <h1 class="title">
    nuxt-demo
   </h1>
   // 直接访问路由
   <!-- <nuxt-link to="/users">用户列表</nuxt-link> -->
   // 通过push的方式直接访问路由路径
   <!-- <el-button @click="$router.push('/users')">用户列表</el-button> -->
   // 通过push的方式,同时用对象的方式访问路由
   <el-button @click="$router.push({name: 'index'})">首页</el-button>
   <el-button @click="$router.push({name: 'index-user'})">用户详情</el-button>
  </div>
  // nuxt规定的子路由插槽
  <nuxt-child></nuxt-child>
 </div>
</template>

这里就拿官方demo改了一下,可以看到,切换路由的时候,只有子路由页面是变换的,父路由部分是没有变换的

详解Nuxt内导航栏的两种实现方式 

方式二 | 创建公共组件实现

这个方法是需要用到vuex的,当然了,如果嫌麻烦,用storage也行

在components内创建公共组件

1.在pages文件夹创建页面,一个主页,一个用户页面,一个活动页面

详解Nuxt内导航栏的两种实现方式

创建页面的过程就不一一细说了,具体就是文件夹下面一个index.vue,router就会读这个index为路由指定的页面

我们看下.nuxt文件夹下面的router.js页面

详解Nuxt内导航栏的两种实现方式 

这就是建立好的路由

2. 创建公共组件

详解Nuxt内导航栏的两种实现方式 

这里偷个懒,用的element的导航栏组件

<template>
 <div id="nav-wrapper">
  <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect">
   <el-menu-item index="1" @click="$router.push({name: 'index'})">首页</el-menu-item>
   <el-menu-item index="3" @click="$router.push({name: 'users'})">用户页面</el-menu-item>
   <el-menu-item index="4" @click="$router.push({name: 'active'})">活动页面</el-menu-item>
  </el-menu>
 </div>
</template>

3. 在所有路由页面导入创建的公共组件

<template>
 <div class="container">
  <div>
   <logo />
   <h1 class="title">
    nuxt-demo
   </h1>
   <navBar />
  </div>
 </div>
</template>

<script>
import Logo from '~/components/Logo.vue'
import navBar from '~/components/nav.vue'

export default {
 components: {
  Logo,
  navBar
 }
}
</script>

<style>

这样就完成了第一步,我们看下预览

详解Nuxt内导航栏的两种实现方式

问题出现了,虽然我们的路由变换了,但是导航栏的状态确没有同步,因为路由跳转的时候,组件状态会刷新,所以这个时候,需要共享状态,所以,我这里用的是vuex

4. 使用vuex同步导航栏状态

直接在store文件夹内进行添加就行,nuxt里推荐的两种vuex使用方法

第一种是普通创建

详解Nuxt内导航栏的两种实现方式

第二种是模块化创建

详解Nuxt内导航栏的两种实现方式

这里我选的是第二种方式,我也建议使用这种,因为方便维护,各种状态一目了然

我们看下目录结构,这里和在vue使用的vuex目录是一样的

详解Nuxt内导航栏的两种实现方式

这里就不一一详细说明每个文件内容了,本次重点是使用vuex来同步状态

我们把状态同步到vuex中,这样每次页面进来的时候,直接读取vuex中的数据,就可以同步导航栏状态栏了

4.1 vuex使用报错

store/index.js should export a method that returns a Vuex

instance.vuex在nuxt中是需要导出一个store实例

我们这里需要改动一下store文件下的index页面

详解Nuxt内导航栏的两种实现方式 

我们继续回到导航栏组件内

<template>
 <div id="nav-wrapper">
  <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect">
   <el-menu-item index="1" @click="$router.push({name: 'index'})">首页</el-menu-item>
   <el-menu-item index="3" @click="$router.push({name: 'users'})">用户页面</el-menu-item>
   <el-menu-item index="4" @click="$router.push({name: 'active'})">活动页面</el-menu-item>
  </el-menu>
 </div>
</template>

<script>
 import {mapGetters, mapMutations} from 'vuex'
 export default{
  data() {
   return {
    activeIndex: '1',
    activeIndex2: '1'
   };
  },
  computed: {
   ...mapGetters([
    'barIndex'
   ])
  },
  methods: {
   ...mapMutations({
    'change_index': 'CHANGE_INDEX'
   }),
   handleSelect(key, keyPath) {
    console.log(key, keyPath);
    this.activeIndex = key
    // 每次切换导航栏,会把当前状态同步到vuex中
    this.change_index(this.activeIndex)
   }
  },
  created() {
   if (this.barIndex) { // 判断vuex内是否有上一次存储的数据,有就同步到当前状态
    this.activeIndex = this.barIndex
   }
   console.log('vuex', this.activeIndex)
  }
 }
</script>

这样,我们就已经可以同步导航栏状态了

详解Nuxt内导航栏的两种实现方式

到此这篇关于详解Nuxt内导航栏的两种实现方式的文章就介绍到这了,更多相关Nuxt内导航栏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
Feb 09 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 Javascript
js实现图片上传并正常显示
Dec 19 Javascript
JavaScript基础重点(必看)
Jul 09 Javascript
jQuery简单入门示例之用户校验demo示例
Jul 09 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
Aug 05 Javascript
jQuery自适应轮播图插件Swiper用法示例
Aug 24 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
vue.js中toast用法及使用toast弹框的实例代码
Aug 27 Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 Javascript
手写Vue弹窗Modal的实现代码
Sep 11 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
Apr 16 #Javascript
vue下canvas裁剪图片实例讲解
Apr 16 #Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
Apr 16 #Javascript
js String.prototype.trim字符去前后空格的扩展
Aug 23 #Javascript
Vue Object 的变化侦测实现代码
Apr 15 #Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 #Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
Apr 15 #Javascript
You might like
PHP实现可自定义样式的分页类
2016/03/29 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
php压缩文件夹最新版
2018/07/18 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
详解Python中的动态属性和特性
2018/04/07 Python
python保留小数位的三种实现方法
2020/01/07 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
法学专业应届生求职信
2013/10/16 职场文书
大学生饮食配送创业计划书
2014/01/04 职场文书
客服专员岗位职责
2014/02/28 职场文书
元旦晚会主持词
2014/03/24 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python