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

Vue.js作品筛选图片画廊点击分类跳转底部问题求助

Vue.js分类点击页面跳到底部的解决办法

问题根源

你使用的<a href="#"></a>标签会触发浏览器默认锚点跳转行为,href="#"会强制页面滚动到顶部(部分场景下可能表现为跳到底部),这是导致页面跳转的直接原因;同时当前代码未实现分类筛选的核心逻辑。

解决步骤

1. 阻止a标签默认跳转行为

修改模板中的分类链接,添加@click.prevent指令阻止默认跳转,同时绑定筛选方法:

<div class="filters">
    <a href="#" data-filter=".new" class="active" @click.prevent="setFilter('new')">New</a>
    <a v-for="cat in portfolioCategories" :key="cat.id" 
       href="#" :data-filter="'.'+cat.details" 
       @click.prevent="setFilter(cat.details)">
        {{ cat.name }}
    </a>
    <router-link to="/">Web</router-link>
</div>

2. 实现分类筛选逻辑

在脚本中添加筛选状态和方法,用计算属性过滤要展示的内容:

<script>
import axios from "../../axios";

export default {
    data() {
        return {
            portfolioCategories: [],
            portfolios: [],
            newportfolios: [],
            activeFilter: 'new' // 默认选中New分类
        };
    },
    created() {
        this.getPortfolioCategory();
        this.getPortfolio();
        this.getNewPortfolio();
    },
    methods: {
        async getPortfolioCategory() {
            try {
                const res = await axios.get("/portfolio/category");
                this.portfolioCategories = res.data.portfoliocategory;
            } catch (err) {
                console.log("获取分类数据失败");
            }
        },
        async getPortfolio() {
            try {
                const res = await axios.get("/portfolio");
                this.portfolios = res.data.portfolios;
            } catch (err) {
                console.log("获取作品集数据失败");
            }
        },
        async getNewPortfolio() {
            try {
                const res = await axios.get("/new/portfolio");
                this.newportfolios = res.data.newportfolios;
            } catch (err) {
                console.log("获取新品作品集数据失败");
            }
        },
        setFilter(filter) {
            this.activeFilter = filter;
            // 可选:通过动态class切换选中状态,替代手动操作DOM
        }
    },
    computed: {
        displayItems() {
            if (this.activeFilter === 'new') {
                // 按需调整:显示新品+所有作品集,或仅显示新品
                return [...this.newportfolios, ...this.portfolios];
            }
            // 筛选对应分类的作品集
            return this.portfolios.filter(item => item.portfolio_categoryname.details === this.activeFilter);
        }
    }
};
</script>

3. 更新模板展示部分

用计算属性displayItems替代原来的两个独立v-for:

<div class="portfolio-container">
    <div v-for="item in displayItems" :key="item.id" 
         :class="[item.portfolio_categoryname?.details || 'new', 'col-md-6 col-lg-4']">
        <div class="portfolio-item">
            <img :src="item.cover_image" class="img-fluid" :alt="item.title">
            <div class="content-holder">
                <a class="img-popup" :href="item.cover_image"></a>
                <div class="text-holder">
                    <h6 class="title">{{ item.title }}</h6>
                    <p class="subtitle">{{ item.short_des }}</p>
                </div>
            </div>
        </div>
    </div>
</div>

替代方案:替换a标签为非跳转元素

如果不想使用a标签,直接换成span并添加样式,完全避免默认跳转:

<div class="filters">
    <span :class="['filter-btn', activeFilter === 'new' ? 'active' : '']" @click="setFilter('new')">New</span>
    <span v-for="cat in portfolioCategories" :key="cat.id" 
          :class="['filter-btn', activeFilter === cat.details ? 'active' : '']" 
          @click="setFilter(cat.details)">
        {{ cat.name }}
    </span>
    <router-link to="/">Web</router-link>
</div>

给.filter-btn添加与原a标签一致的CSS样式,保证视觉效果统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:44:56