You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js:如何为点击的元素单独设置激活样式功能?

问题

点击导航栏的<li>元素时,所有<li>都会被添加上底部边框,需求是仅被点击的<li>显示底部边框,实现独立的激活状态。

原代码

<!-- navbar -->
<nav class="nav navbar-expand-lg main-nav d-flex">
    <h1 class="text-center fs-2">دفتر ترجمه رسمی پروند</h1>
    <ul class="my-auto mx-auto main-ul">
        <li>
            <router-link class="link" to="/">
                خانه
            </router-link>
        </li>
        <li @click="activeMe" :class="[isActive ? 'list-border' : '']">
            <router-link class="link" to="/tranlsation-services">
                خدمات ترجمه
            </router-link>
        </li>
        <li @click="activeMe" :class="[isActive ? 'list-border' : '']">
            <router-link class="link" to="/translation-tariffs">
                تعرفه ترجمه
            </router-link>
        </li>
    </ul>
</nav>

<script>
export default {
    data() {
        return {
            mobileNav: false,
            isActive: false,
        }
    },
    methods: {
         activeMe() {
            if (!this.isActive) {
                this.isActive = !this.isActive
            }
        },
        handleView() {
            this.mobileNav = true;
        },
        handleView2() {
            this.mobileNav = false;
        },
    },
    created() {
        window.addEventListener("resize", this.handleView);
        window.addEventListener("resize", this.handleView2);
    },
}
</script>

<style>
.list-border {
    border-bottom: 4px solid white !important;
}
</style>

问题原因

所有<li>都绑定了同一个全局变量isActive,点击任意一个<li>都会切换这个变量的状态,导致所有绑定该变量的<li>同时触发样式变化。

解决方案

方法1:手动管理激活状态

通过记录当前激活的路由路径,实现单个<li>的独立激活:

<!-- navbar -->
<nav class="nav navbar-expand-lg main-nav d-flex">
    <h1 class="text-center fs-2">دفتر ترجمه رسمی پروند</h1>
    <ul class="my-auto mx-auto main-ul">
        <li :class="[activePath === '/' ? 'list-border' : '']">
            <router-link class="link" to="/" @click="activeMe('/')">
                خانه
            </router-link>
        </li>
        <li :class="[activePath === '/tranlsation-services' ? 'list-border' : '']">
            <router-link class="link" to="/tranlsation-services" @click="activeMe('/tranlsation-services')">
                خدمات ترجمه
            </router-link>
        </li>
        <li :class="[activePath === '/translation-tariffs' ? 'list-border' : '']">
            <router-link class="link" to="/translation-tariffs" @click="activeMe('/translation-tariffs')">
                تعرفه ترجمه
            </router-link>
        </li>
    </ul>
</nav>

<script>
export default {
    data() {
        return {
            mobileNav: false,
            activePath: '', // 记录当前激活的路由路径
        }
    },
    methods: {
         activeMe(path) {
            this.activePath = path;
        },
        handleView() {
            this.mobileNav = true;
        },
        handleView2() {
            this.mobileNav = false;
        },
    },
    created() {
        window.addEventListener("resize", this.handleView);
        window.addEventListener("resize", this.handleView2);
        // 初始化激活状态为当前路由
        this.activePath = this.$route.path;
    },
    watch: {
        // 监听路由变化,自动更新激活状态
        '$route.path'(newPath) {
            this.activePath = newPath;
        }
    }
}
</script>

<style>
.list-border {
    border-bottom: 4px solid white !important;
}
</style>

方法2:利用router-link内置激活类(更优雅)

router-link自带路由匹配激活机制,无需手动写点击事件,直接通过active-class绑定样式:

<!-- navbar -->
<nav class="nav navbar-expand-lg main-nav d-flex">
    <h1 class="text-center fs-2">دفتر ترجمه رسمی پروند</h1>
    <ul class="my-auto mx-auto main-ul">
        <li>
            <router-link class="link" to="/" active-class="list-border">
                خانه
            </router-link>
        </li>
        <li>
            <router-link class="link" to="/tranlsation-services" active-class="list-border">
                خدمات ترجمه
            </router-link>
        </li>
        <li>
            <router-link class="link" to="/translation-tariffs" active-class="list-border">
                تعرفه ترجمه
            </router-link>
        </li>
    </ul>
</nav>

<script>
export default {
    data() {
        return {
            mobileNav: false,
        }
    },
    methods: {
        handleView() {
            this.mobileNav = true;
        },
        handleView2() {
            this.mobileNav = false;
        },
    },
    created() {
        window.addEventListener("resize", this.handleView);
        window.addEventListener("resize", this.handleView2);
    },
}
</script>

<style>
.list-border {
    border-bottom: 4px solid white !important;
}
</style>

说明:active-class会在当前路由与router-link的to属性匹配时,自动给元素添加指定类,完全贴合Vue Router的设计逻辑,无需额外维护状态。


内容的提问来源于stack exchange,提问作者Peyman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:05:21