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

React中.slideDown()加载更多功能异常,注释Shuffle代码后运行正常

问题根因

  • Shuffle库会内部接管所有列表元素的可见性、定位重排逻辑,你在加载更多逻辑中直接用jQuery的show()、slideDown()手动修改DOM显示状态,和Shuffle的内部状态不同步,Shuffle触发重绘时就会覆盖你手动修改的显示状态,导致已展示的元素消失。
  • 你的Shuffle初始化逻辑中会删除原有.explore-item、.explore-items类,虽然加载更多用的是.item类选择器,但Shuffle初始化时会重新计算所有元素的显示状态,会直接覆盖加载更多脚本提前设置的12个元素显示的状态。

解决方案

不要手动用jQuery操作Shuffle管理的元素的可见性,所有显示控制逻辑全部通过Shuffle官方提供的filter API实现,调整后的代码如下:

1. 调整Shuffle初始化代码

/*----------------------------------------------
6. Shuffle
----------------------------------------------*/
(function ($) {
    'use strict';
    // 存储Shuffle实例与相关状态,多区域可扩展
    window.shuffleInstances = [];

    $('.explore-area').each(function(index) {
        const $area = $(this);
        const $itemsContainer = $area.find('.explore-items');
        const $filterBtns = $area.find('.explore-btn');
        
        // 初始化Shuffle实例
        const shuffleInstance = new window.Shuffle($itemsContainer[0], {
            itemSelector: '.explore-item',
            buffer: 1
        });

        // 存储实例状态:实例本身、初始可见数12、当前筛选类别
        window.shuffleInstances.push({
            instance: shuffleInstance,
            visibleCount: 12,
            currentFilter: 'all'
        });

        // 初始化首次加载,显示前12个全部分类元素
        const currentInst = window.shuffleInstances[index];
        currentInst.instance.filter((element, shuffle) => {
            const matchedItems = Array.from(shuffle.items);
            const itemIndex = matchedItems.findIndex(item => item.element === element);
            return itemIndex < currentInst.visibleCount;
        });

        // 筛选按钮切换逻辑
        $filterBtns.on('change', function (e) {
            const input = e.currentTarget;
            if (input.checked) {
                currentInst.currentFilter = input.value;
                // 切换分类时重置可见数量为12
                currentInst.visibleCount = 12;
                // 按当前分类和可见数量过滤
                currentInst.instance.filter((element, shuffle) => {
                    const groups = element.dataset.groups.split(',');
                    const isMatchGroup = input.value === 'all' || groups.includes(input.value);
                    if (!isMatchGroup) return false;
                    // 统计当前分类下所有符合条件的元素,仅展示前visibleCount个
                    const matchedItems = Array.from(shuffle.items).filter(item => {
                        const itemGroups = item.element.dataset.groups.split(',');
                        return input.value === 'all' || itemGroups.includes(input.value);
                    });
                    const itemIndex = matchedItems.findIndex(item => item.element === element);
                    return itemIndex < currentInst.visibleCount;
                });
                // 切换分类后恢复加载更多按钮显示
                $('#load-btn').fadeIn('slow');
            }
        })
    });
}(jQuery)); 

2. 调整加载更多逻辑代码

/*----------------------------------------------
5. Load More
----------------------------------------------*/
(function ($) {
    'use strict';
    $("#load-btn").on('click', function (e) {
        e.preventDefault();
        // 单区域场景直接取第一个实例,多区域可根据实际场景调整选择逻辑
        const currentInst = window.shuffleInstances[0];
        // 每次加载新增4个可见元素
        currentInst.visibleCount += 4;
        // 按当前筛选条件和最新可见数量重新过滤
        currentInst.instance.filter((element, shuffle) => {
            const groups = element.dataset.groups.split(',');
            const isMatchGroup = currentInst.currentFilter === 'all' || groups.includes(currentInst.currentFilter);
            if (!isMatchGroup) return false;
            const matchedItems = Array.from(shuffle.items).filter(item => {
                const itemGroups = item.element.dataset.groups.split(',');
                return currentInst.currentFilter === 'all' || itemGroups.includes(currentInst.currentFilter);
            });
            const itemIndex = matchedItems.findIndex(item => item.element === element);
            return itemIndex < currentInst.visibleCount;
        });
        // 无更多内容时隐藏加载按钮
        const matchedItems = Array.from(currentInst.instance.items).filter(item => {
            const g = item.element.dataset.groups.split(',');
            return currentInst.currentFilter === 'all' || g.includes(currentInst.currentFilter);
        });
        if (currentInst.visibleCount >= matchedItems.length) {
            $("#load-btn").fadeOut('slow');
        }
    });
}(jQuery));

注意事项

  • 删除你原有Shuffle逻辑中移除.explore-item、.explore-items、.explore-btn原生类的代码,该操作无实际意义且易导致选择器失效。
  • 所有对Shuffle列表元素的可见性修改都需要通过filter方法实现,禁止直接用jQuery修改元素的display属性,避免与Shuffle内部状态冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:30:01