0

0

Svelte 中避免 #each 循环导致相关文章重复显示的正确实现方法

花韻仙語

花韻仙語

发布时间:2026-02-13 14:58:16

|

545人浏览过

|

来源于php中文网

原创

Svelte 中避免 #each 循环导致相关文章重复显示的正确实现方法

本文介绍如何在 Svelte 中正确筛选并去重展示“相关文章”,解决因嵌套 #each 导致同一文章被多次渲染的问题,核心是将标签匹配逻辑前置到 JavaScript 层完成过滤,而非在模板中双重遍历。

本文介绍如何在 svelte 中正确筛选并去重展示“相关文章”,解决因嵌套 `#each` 导致同一文章被多次渲染的问题,核心是将标签匹配逻辑前置到 javascript 层完成过滤,而非在模板中双重遍历。

在构建博客类 Svelte 应用时,常需为当前文章动态展示“相关文章”——即标题不同、已发布、且至少共享一个标签的文章。若直接在模板中使用嵌套 {#each}(如外层遍历所有文章、内层遍历其标签),会导致同一候选文章因匹配多个共同标签而被重复渲染多次。例如:当前文章含 ["svelte", "tutorial"],而某篇候选文章也含这两个标签,则该文章会在

    中出现两次,严重破坏 UI 逻辑与用户体验。

    根本原因在于:原始写法将筛选条件(是否相关)错误地放在了模板渲染阶段,且未做去重控制。正确的解法是——将筛选与去重完全交由 JS 逻辑处理,模板仅负责干净、线性的渲染

    以下是优化后的推荐实现:

    <script>
      import { getMarkdownPosts } from '$lib/utils/getPosts';
      import { onMount } from 'svelte';
    
      let relatedPosts = [];
    
      export let currentPostTitle, currentPostTags;
    
      onMount(async () => {
        const allPosts = await getMarkdownPosts();
    
        // ✅ 单次过滤:排除自身 + 未发布 + 无标签交集
        relatedPosts = allPosts.filter(post => {
          const { title, tags, published } = post.meta;
          return (
            title !== currentPostTitle && 
            published === true && 
            currentPostTags.some(tag => tags.includes(tag))
          );
        });
      });
    </script>
    
    {#if relatedPosts.length > 0}
      <h3>Related posts</h3>
      <ul>
        {#each relatedPosts as { slug, meta: { title } }}
          <li><a href="/blog/{slug}"><h4>{title}</h4></a></li>
        {/each}
      </ul>
    {:else}
      <p>No related posts found.</p><div class="aritcle_card flexRow">
    							<div class="artcardd flexRow">
    								<a class="aritcle_card_img" href="/ai/1763" title="Khroma"><img
    										src="https://img.php.cn/upload/ai_manual/000/969/633/68b6ceddca9b1981.png" alt="Khroma"></a>
    								<div class="aritcle_card_info flexColumn">
    									<a href="/ai/1763" title="Khroma">Khroma</a>
    									<p>AI调色盘生成工具</p>
    								</div>
    								<a href="/ai/1763" title="Khroma" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
    							</div>
    						</div>
    {/if}

    关键改进点说明

    • 逻辑前置:filterRelatedPosts() 被整合进 onMount,确保异步数据加载完成后立即执行一次精准过滤,返回唯一、无重复的 relatedPosts 数组;
    • 语义清晰的筛选条件:使用 currentPostTags.some(tag => tags.includes(tag)) 判断「至少一个标签匹配」,避免内层循环;
    • 模板极简渲染:{#each relatedPosts} 仅作单层遍历,天然杜绝重复;
    • 健壮性增强:显式检查 published === true(而非仅 if (published)),避免 falsy 值误判;增加空状态提示,提升用户体验。

    ⚠️ 注意事项

    • 若 currentPostTags 或 post.meta.tags 可能为 null/undefined,应在 filter 中添加防御性检查(如 Array.isArray(currentPostTags) && Array.isArray(tags));
    • 标签匹配默认区分大小写。如需忽略大小写,可改用 currentPostTags.some(tag => tags.map(t => t.toLowerCase()).includes(tag.toLowerCase()));
    • 对于大型文章库(>100 篇),可进一步加入按匹配标签数或发布时间排序(如 .sort((a, b) => b.meta.tags.filter(t => currentPostTags.includes(t)).length - a.meta.tags.filter(...).length)),提升相关性。

    此方案兼顾性能、可读性与可维护性,符合 Svelte “逻辑在脚本中,视图只负责呈现”的设计哲学,是生产环境推荐的标准实践。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

244

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

705

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

807

2023.08.22

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

399

2023.09.04

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

939

2023.09.19

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

64

2025.11.17

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

10

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号