Vue实现底部导航栏切换页面及图片

2023-11-02

前言

刚进新公司,有幸接触到从前后端不分离到前后端分离的一个过程,最开始对vue不太熟悉,下班自学一周就开始做了,可能会有很多问题,若有写不好的地方大佬们可以提出。

一、实现效果

需求:vue底部导航点击切换图标
效果:
在这里插入图片描述
在这里插入图片描述

二、大概思路图

在这里插入图片描述

三、代码实现

index.js(vuex)

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    // 目录标识(感觉不应该使用 localStorage,应该使用sessionStorage)
    DirectoryIdentifier: localStorage.getItem('DirectoryIdentifier') ? localStorage.getItem('DirectoryIdentifier') : ''
  },
  mutations: {
    // 保存目录标识
    saveDirectoryIdentifier (state, directoryIdentifier) {
      localStorage.setItem('DirectoryIdentifier', directoryIdentifier)
      state.DirectoryIdentifier = directoryIdentifier
    }
  }
})
export default store

login.vue

methods: {
    login () {
      if (this.loginForm.username === '' || this.loginForm.tmpPassword === '') {
        this.showPopup('账号或密码不能为空')
      } else {
        api.login(this.loginForm).then((data) => {
          console.log(data)
          if (data.code === '1') {
            // 保存目录标识(device)
            this.$store.commit('saveDirectoryIdentifier', 'device')
            this.$router.push('/home/device')
          } else {
            this.showPopup(data.message)
          }
        })
      }
    }

index.vue

<template>
  <div class = "main">
    <div><router-view></router-view></div>
    <ul class="nav-bottom">
      <li @click="directoryIdentifierClick('device')" v-if="isShowDevice">
          <router-link to="/home/device">
          <div>
            <span class="nav-bottom-span nav-img"><img :src='deviceImgUrl'></span>
            <span class="nav-bottom-span">名称</span>
          </div>
          </router-link>
      </li>
      <li @click="directoryIdentifierClick('deviceSensor')" v-if="isShowDeviceSensor">
        <router-link to="/home/device_sensor">
        <div>
          <span class="nav-bottom-span nav-img"><img :src='deviceSensoImgUrl'></span>
          <span class="nav-bottom-span">名称</span>
        </div>
        </router-link>
      </li>
      <li @click="directoryIdentifierClick('hospital')" v-if="isShowHospital">
        <router-link to="hospital" >
         <div>
          <span class="nav-bottom-span nav-img"><img :src='hospitalImgUrl'></span>
          <span class="nav-bottom-span">名称</span>
         </div>
        </router-link>
      </li>
      <li @click="directoryIdentifierClick('doctorReport')" v-if="isShowdDoctorReport">
        <router-link to="/home/doctor_report">
          <div>
          <span class="nav-bottom-span nav-img"><img :src='doctorReportImgUrl'></span>
          <span class="nav-bottom-span">名称</span>
          </div>
        </router-link>
      </li>
      <li @click="directoryIdentifierClick('user')" v-if="isShowUser">
        <router-link to="/home/user">
          <div>
          <span class="nav-bottom-span nav-img"><img :src='userImgUrl'></span>
          <span class="nav-bottom-span">名称</span>
          </div>
        </router-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'Home',
  data () {
    return {
      deviceImgUrl: '../../../static/img/device-nav-out.png',
      deviceSensoImgUrl: '../../../static/img/device-sensor-out.png',
      hospitalImgUrl: '../../../static/img/hospital-nav-out.png',
      doctorReportImgUrl: '../../../static/img/prescription-nav-out.png',
      userImgUrl: '../../../static/img/user-out.png',
      isShowDevice: false,
      isShowDeviceSensor: false,
      isShowHospital: false,
      isShowdDoctorReport: false,
      isShowUser: false
    }
  },
  // 钩子事件(触发机制:初始化) 刷新标识定位问题
  mounted: function () {
    // 这个是获取权限,如果没有可以去掉
    this.getWechatChanelAcl()
    // mounted - 初始化定位标识
    this.initIdentifier()
  },
  // 钩子事件(触发机制:数据修改时)
  beforeUpdate: function () {
    // 这个是获取权限,如果没有可以去掉
    this.getWechatChanelAcl()
  },
  methods: {
    directoryIdentifierClick (directory) {
      this.setGrayIdentifier(directory)
      this.$store.commit('saveDirectoryIdentifier', directory)
    },
    // 设置灰色图片
    setGrayIdentifier (directory) {
      this.deviceImgUrl = (directory === 'device' ? '../../../static/img/device-nav-active.png' : '../../../static/img/device-nav-out.png')
      this.deviceSensoImgUrl = (directory === 'deviceSensor' ? '../../../static/img/device-sensor-active.png' : '../../../static/img/device-sensor-out.png')
      this.hospitalImgUrl = (directory === 'hospital' ? '../../../static/img/hospital-nav-active.png' : '../../../static/img/hospital-nav-out.png')
      this.doctorReportImgUrl = (directory === 'doctorReport' ? '../../../static/img/prescription-nav-active.png' : '../../../static/img/prescription-nav-out.png')
      this.userImgUrl = (directory === 'user' ? '../../../static/img/user-active.png' : '../../../static/img/user-out.png')
    },
     // mounted - 初始化定位标识
    initIdentifier () {
      let directoryIdentifier = this.$store.state.DirectoryIdentifier
      if (directoryIdentifier === null) {
        this.deviceImgUrl = '../../../static/img/device-nav-active.png'
      } else {
        this.setGrayIdentifier(directoryIdentifier)
      }
    },
    // mounted-beforeUpdate 获取目录资源权限
    getWechatChanelAcl () {
      let wechatChanelAcl = JSON.parse(this.$store.state.WechatChanelAcl)
      for (let index = 0; index < wechatChanelAcl.length; index++) {
        const chanelAcl = wechatChanelAcl[index]
        if (chanelAcl.permission === 'wecharsalechanel:rp_device:list') {
          this.isShowDevice = true
        } else if (chanelAcl.permission === 'wecharsalechanel:device_sensor:list') {
          this.isShowDeviceSensor = true
        } else if (chanelAcl.permission === 'wecharsalechanel:hospital:list') {
          this.isShowHospital = true
        } else if (chanelAcl.permission === 'wecharsalechanel:doctor_report:list') {
          this.isShowdDoctorReport = true
        } else if (chanelAcl.permission === 'wecharsalechanel:user:list') {
          this.isShowUser = true
        }
      }
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.main {
  background: #eee;
}
.nav-bottom {
    padding-top: 0;
    width: 100%;
    position: fixed;
    bottom: 0;
    border-top: 1px solid #eee;
    color: gray;
    background: #fff;
    height: 4rem;
}
.nav-bottom>li {
    float: left;
    width: 20%;
    text-align: center;
    box-sizing: border-box;
    height: 4rem;
}
.nav-bottom-span {
    font-size: 14px;
    display: block;
    line-height: 0.6rem;
    padding-top: 0.6rem;
}
.nav-img img {
    height: 1.3rem;
}
</style>

测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue实现底部导航栏切换页面及图片 的相关文章

  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • javascript 使用 onclick 创建按钮

    我正在尝试使用 javascript 创建一个具有 onclick 事件的按钮 该事件调用 head 中定义的函数 该函数接收相对于按钮的 dom 对象作为参数 我该怎么做呢 ex
  • 如何使用 LinkedIn javascript sdk 检索包括所有字段的职位列表?

    我想要获取 LinkedIn 会员在其个人资料中输入的每个职位的 ID 头衔 摘要 开始日期 结束日期 当前状态和公司名称 我测试了一个查询休息控制台 https apigee com console linkedin我得到了想要的结果 查
  • 如何根据按钮单击折叠和展开 Kendo UI 树视图中的所有树节点?

    这是行不通的 您可以使用此代码 1 崩溃 折叠kendoTree查看文档 http docs kendoui com api web treeview methods collapse treeview kendoTreeView var
  • Google 饼图未显示所有数据行

    我正在尝试绘制人口与国家名称的关系图 我发现 Google 可视化库仅渲染前几个 实际上数字似乎是随机的 具体取决于我使用的数据 有时添加 其他 条目 但它没有t 实际上具有其余条目的值 Example 1 With all countri
  • 通知用户消息仍在输入中

    我正在使用 Laravel 5 6 7 Socket IO 和 vue js 我没有使用 Pusher 和 redis 下面是我的代码 用于向与我一对一聊天的用户发送消息 var url http localhost 6001 apps M
  • 是否可以覆盖 javaScript 原始数据类型?

    问题是不言自明的 我知道可以扩展原始数据类型 例如string但有可能覆盖它吗 这是在采访中被问到的一个问题 不 你不能覆盖任何东西 Ecma脚本定义原始类型 http es5 github com x4 3 2 Undefined Nul
  • Bing.com 如何创建放大的缩略图?

    当我使用 Bing com 搜索图像时 我发现它们的图像经过精心裁剪和排序 当您将鼠标放在图像上时 会弹出另一个窗口 其中显示放大的图像 我想在我的程序中做同样的事情 我检查了他们页面的源代码 他们正在使用 javascript 但我仍然不
  • 点击问题:动态生成的链接不触发点击功能

    下面是两个代码片段 由于某种原因什么也没有发生 但来自同一个 JS 文件的其他 jQuery 函数在带有 UL 的页面上执行得很好 这是在盯着我看吗 ul class paganation li 1 li li a href 2 a li
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • 对象数组 - 在 Vue.js 生态系统中更新对象的正确方法

    我不确定问题到底出在哪里 但我会看看是否有人可以帮助我理解我的代码出了什么问题 我正在利用 Vuex 商店来跟踪某些不断变化的状态 我这样做如下 import Vue from vue import Vuex from vuex Vue u
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • 使用 JavaScript 的计时器

    我想使用java脚本实现计时器 我想随着间隔的变化而减少计时器 Example假设我的计时器从 500 开始 我想要根据级别减少计时器 例如1 一级定时器应减1 且递减速度应较慢 2 2级定时器应递减2 递减速度应为中等3 3级定时器应减3
  • 元素中优先考虑 ngclick 而非 nghref

    tl dr 如何强制 Angular 只执行 ngclick 指令 a 元素而不清空 删除href 我的网站在某些元素上有一些自定义行为 模式打开 位置栏更新等 但对于 SEO 索引我also需要它成为一个 a 元素与href包含有效链接的
  • 使用Promise而不拒绝它会导致内存泄漏吗? [复制]

    这个问题在这里已经有答案了 代码如下 function test value return new Promise function fulfill reject try fulfill true catch e throw e 我担心的是
  • 常规 JavaScript 可以与 jQuery 混合使用吗?

    例如 我可以采用这个脚本 来自 Mozilla 教程 https developer mozilla org en Canvas tutorial Basic usage
  • 在 Google Apps 脚本中的文本前插入换行符

    我需要在 Google 文档中的某些文本之前插入一些换行符 尝试过这种方法但出现错误 var body DocumentApp getActiveDocument getBody var pattern WORD 1 var found b
  • 如何根据所需表单输入的值更改 CSS 样式

    我想知道如何编写 javascript 来改变所需的表单元素的样式 如果它们有价值的话就改变它们 我想要做的是当所需的文本字段为空时 在它们周围有一个彩色边框 并在它们有值时删除边框样式 我想做的是编写一个 javascript 函数来检查
  • Laravel 使用 laravel-cors 和 axios 进行 POST 的“CSRF 令牌不匹配”

    我有一个正在运行的domain A拉拉维尔 5 8返回 API 的引擎网络路线 它必须检查来源才能只服务几个域 包括domain B Barryvdh laravel cors我安装了barryvdh laravel cors https
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐