svg 点击事件_关于vue-router控制底部导航栏点击切换icon的实例

首先先上一下界面:底部导航栏使用vue-router做的

9adbb4b71243dc686e4b3277eaef5e0a.png

需求就是:让导航栏的Icon点击之后切换为一个新的Icon,下面是代码板块

<template>
    <div class="router-link-container">
            <router-link to="/labels" active-class="selected" v-on:click.native="change">
                <svg class="icon" aria-hidden="true" :class="{iconSelected:!isActive}">
                    <use xlink:href="#icon-selected-label"></use>
                </svg>
                <svg class="icon" aria-hidden="true" :class="{iconSelected:isActive}">
                    <use xlink:href="#icon-label"></use>
                </svg>
                <span>标签</span>
            </router-link>

        <router-link to="/money" active-class="selected">
            <div class="tuber">
                <svg class="icon" aria-hidden="true">
                    <use xlink:href="#icon-jiahao"></use>
                </svg>
            </div>
            <span class="tuber-name">记账</span>
        </router-link>

        <router-link to="/statistic" active-class="selected">
            <svg class="icon" aria-hidden="true">
                <use xlink:href="#icon-selected-statistic"></use>
            </svg>
            <span>数据</span>
        </router-link>
    </div>
</template>

<script lang="js">
    export default {
        name: "Nav",
        data() {
            return {
                isActive: false
            }
        },
        methods: {
            change: function () {
                this.isActive = !this.isActive;
                console.log(this.isActive);

            }
        }
    }

</script>

<style scoped lang="scss">
    .iconSelected {
        display: none;
    }
</style>

大家重点看这一块:

<router-link to="/labels" v-on:click.native="change">
    <svg class="icon" aria-hidden="true" :class="{iconSelected:!isActive}">
        <use xlink:href="#icon-selected-label"></use>
    </svg>
    <svg class="icon" aria-hidden="true" :class="{iconSelected:isActive}">
        <use xlink:href="#icon-label"></use>
    </svg>
    <span>标签</span>
</router-link>

<script lang="js">
    export default {
        name: "Nav",
        data() {
            return {
                isActive: false
            }
        },
        methods: {
            change: function () {
                this.isActive = !this.isActive;           
            }
        }
    }

</script>
  1. 结构:router-link 里面包有两个 svg ,svg为iconfont的symbol引用
  2. 在router-link上面挂上v-on监听 函数change
  3. 在两个svg上挂上v-bind 一个动态class
  4. {iconSelected:!isActive} 表示 如果 isActive 是 false 的话,class是iconSelected
  5. {iconSelected:isActive} 表示 如果 isActive 是 true 的话,class是iconSelected
  6. 在data里面声明一个 isAcitve,默认为false
  7. methods里面声明一个函数 change ,如果点击了就会切换 data 里面的 isActive 的值

综上所述,大概流程就是这样子了。

在此期间,碰到一些坑,写下来希望都记住:

1.为什么 v-on:click后面要加 .native?

d7ae4cb2c51731d3790ac941b3436568.png

官方文档说, .native作用是 监听根元素的原生事件

vue-router 的 router-link 会在渲染的时候,变成a标签,如果监听事件挂在 router-link上面,会获取不到,所以需要加上 .native

2.我一开始的思路是用 v-if ,看看能不能实现的 然后想着想着思路断了 看看有没有人帮忙实现一下

8399fa924c844aa6fe501846b508045d.png
写下这个希望对大家有帮助,毕竟搜了一堆博客,没有一个能用的 :)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值