状态输出导航栏html,Vue实现导航栏效果(选中状态刷新不消失)_百厌_前端开发者...

d88ef897999d28f7a13c8054010b4c39.png

1、首先把这些小图片放到src/assets路径下面(自动base64编码)

5daf1144e03067aa8375dd989cc7082e.png

73ccdbbd96cc5cdf315e7796393e1aaa.png

2、在data()里边定义一个选中对应的变量isSelect,和循环遍历的数组,数组下面放图标对应的文字,和选中,未选中的图片地址。  注意:图片的地址不要直接写,直接写就是字符串,不仅会出现显示不出图片的情况,而且打包之后,还是这里地址,不会变。使用webpack提供的require引入图片地址就可以解决以上问题。

data () {

return {

isSelect: '首页',

nav: [

{title: '首页', url: require('../../assets/common/首页@2x.png'), url_one: require('../../assets/common/首页_active@2x.png')},

{title: '店铺', url: require('../../assets/common/店铺@2x.png'), url_one: require('../../assets/common/店铺_active@2x.png')},

{title: '创业直播', url: require('../../assets/common/直播@2x.png'), url_one: require('../../assets/common/直播_active@2x.png')},

{title: '我的', url: require('../../assets/common/我的@2x.png'), url_one: require('../../assets/common/我的_active@2x.png')}

]

}

},

  • {{item.title}}

在methods中定义这个事件

methods: {

selectNav (title) {

this.isSelect = title

}

3、这个方法里还可以根据title的值去跳转到相应的路由,这样一个基本的底部导航栏就是实现了。

methods: {

selectNav (title) {

this.isSelect = title

switch (title) {

case '首页': this.$router.push('/index')

break

case '店铺': this.$router.push('/shop')

break

case '创业直播': this.$router.push('/live')

break

case '我的': this.$router.push('/my')

break

}

sessionStorage.setItem('isSelect', this.isSelect)

}

}

但是电脑调试的时候会发现,刷新浏览器后,选中的状态就会消失。(你可能会觉得用户一般不会在手机端刷新页面/或者直接输入路由跳转到相应的页面,如果要追求完美的,请继续往下看)比如,我选中的状态是创业直播:

d3a916a540e0a167a75b3c520a4b5cb9.png

当我点击刷新页面后,就会返回到默认的首页状态,如下。

d88ef897999d28f7a13c8054010b4c39.png

解决办法:

每次点击切换底部导航的时候,把选中的状态存入sessStorage里边。在mounted钩子里把这个状态取出来赋值给这个isSelect变量就可以实现选中状态不消失了。

mounted () {

this.isSelect = sessionStorage.getItem('isSelect')

},

methods: {

selectNav (title) {

this.isSelect = title

sessionStorage.setItem('isSelect', this.isSelect)

}

}

经过测试,新的问题又发现了,比如当前在“创业直播”这个状态上,我在浏览器上直接输入“

在router/index.

routes: [

{

path: '/',

redirect: '/index'

},

{

path: '/index',

name: '首页',

component: index

},

{

path: '/live',

name: '创业直播',

component: live

},

{

path: '/my',

name: '我的',

component: my

},

{

path: '/shop',

name: '店铺',

component: shop

}

]

mounted钩子里边的代码改为:

mounted () {

this.isSelect = this.$route.name

},

methods方法里边的代码修改为

4、手机端一般要求自适应各种大小的手机端屏幕,你可以选择用媒体查询,或者

* rem计算方式:设计图尺寸px / 100 = 实际rem 【例: 100px = 1rem,32px = .32rem】

*/

!function (window) {

/* 设计图文档宽度 */

var docWidth = 750;

var doc = window.document,

docEl = doc.documentElement,

resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';

var recalc = (function refreshRem () {

var clientWidth = docEl.getBoundingClientRect().width;

/* 8.55:小于320px不再缩小,11.2:大于420px不再放大 */

docEl.style.fontSize = Math.max(Math.min(20 * (clientWidth / docWidth), 11.2), 8.55) * 5 + 'px';

return refreshRem;

})();

/* 添加倍屏标识,安卓为1 */

docEl.setAttribute('data-dpr', window.navigator.appVersion.match(/iphone/gi) ? window.devicePixelRatio : 1);

if (/iP(hone|od|ad)/.test(window.navigator.userAgent)) {

/* 添加IOS标识 */

doc.documentElement.classList.add('ios');

/* IOS8以上给

使用方法:

把视觉稿中的px转换成rem;

rem计算方式:设计图尺寸px / 100 = 实际rem 【例: 100px = 1rem,32px = 0.32rem】;

特别注意:是不需要再除以2的!

无论设计图什么尺寸,算法一致。但需修改js 中 docWidth 变量为设计图宽度;默认设计图文档宽度为750px; 一些不使用rem的

附录底部导航栏的代码(样式使用了less预编译):

  • {{item.title}}

export default {

data () {

return {

isSelect: '首页',

nav: [

{title: '首页', url: require('../../assets/common/首页@2x.png'), url_one: require('../../assets/common/首页_active@2x.png')},

{title: '店铺', url: require('../../assets/common/店铺@2x.png'), url_one: require('../../assets/common/店铺_active@2x.png')},

{title: '创业直播', url: require('../../assets/common/直播@2x.png'), url_one: require('../../assets/common/直播_active@2x.png')},

{title: '我的', url: require('../../assets/common/我的@2x.png'), url_one: require('../../assets/common/我的_active@2x.png')}

]

}

},

mounted () {

this.isSelect = this.$route.name

},

methods: {

selectNav (title) {

this.isSelect = this.$route.name

switch (title) {

case '首页': this.$router.push('/index')

break

case '店铺': this.$router.push('/shop')

break

case '创业直播': this.$router.push('/live')

break

case '我的': this.$router.push('/my')

break

}

}

}

}

.common_foot>ul{

position: fixed;

bottom: 0;

z-index: 1000;

height: 0.98rem;

width: 100%;

overflow: hidden;

background-color: white;

li{

float: left;

width: 25%;

height: 100%;

text-align: center;

cursor: pointer;

padding: 0.15rem 0 0.13rem 0;

}

p{font-size: 0.2rem;color: #7f7f7f;}

img{

width: 0.48rem;

height: 0.45rem;

}

.active{

color: #ffd100;

}

}

本文已被整理到了《

关于

更多vue学习教程请阅读专题《vue实战教程》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持前端开发者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值