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
相关产品推荐
相关产品推荐

