讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

JavaScript教程:从API获取并正确渲染动态新闻列表

老丽君_6200

老丽君_6200

发布时间:2025-11-24 10:38:02

|

242人浏览过

|

来源于php中文网

原创

javascript教程:从api获取并正确渲染动态新闻列表

本教程旨在解决从API获取数据并将其动态渲染到HTML页面时常见的逻辑错误。我们将深入探讨如何使用JavaScript的`fetch` API获取外部数据,并重点讲解如何利用数组的`map()`方法结合`join('')`高效且正确地将多个数据项转换为HTML结构,最终更新DOM,避免常见的迭代覆盖问题,确保所有预期内容都能被完整展示。

在现代Web开发中,从外部API获取数据并将其动态呈现在用户界面上是常见的需求。然而,在处理返回的数据列表时,开发者有时会遇到只显示最后一项内容的问题。本教程将详细分析这一问题,并提供一个健壮的解决方案。

动态内容渲染的挑战

当我们从API获取到一组数据(例如新闻列表)时,通常需要遍历这组数据,为每一项生成对应的HTML结构,然后将这些结构插入到页面的特定位置。一个常见的误区是在遍历过程中错误地更新一个字符串变量,导致最终只有最后一项数据被渲染。

考虑以下场景:我们有一个新闻API,返回一个包含多条新闻标题的数组。我们希望将这些标题显示在一个div容器内。

立即学习“Java免费学习笔记(深入)”;

<div class="box" id="insert-news">
    <div class="title">Marketplace </div>
    <h2>Live News</h2>
    <p><span class='highlight'>News Article</span></p>
    <!-- 这里将动态插入新闻标题 -->
</div>

常见错误分析:迭代赋值的陷阱

在尝试将API返回的多条新闻标题渲染到HTML时,一个常见的错误模式是使用循环(或map方法但错误地使用其返回值)来构建HTML字符串,并在每次迭代中覆盖前一个结果。

以下是一个可能导致只显示最后一条新闻标题的错误代码示例:

function getData(){
    fetch('https://api.coinstats.app/public/v1/news?skip=0&limit=10').then(response => {
        return response.json();
    }).then(data => {
        console.log(data.news[2].title); // 调试用途
        let newsTitle =''; // 初始化一个空字符串
        data.news.map((values)=>{
            // 每次迭代都会完全覆盖 newsTitle 的内容
            newsTitle = `<div class="title">Marketplace </div>
        <h2>Live News</h2>
        <p><span class='highlight'>News Article</span></p>
        <p>${values.title}</p>
    </div>`;
        });
        // 最终只有最后一次迭代赋给 newsTitle 的值会被设置到 DOM 中
        document.getElementById('insert-news').innerHTML = newsTitle;
    });
}

getData();

问题解析: 在这段代码中,data.news.map((values)=>{ ... })虽然使用了map方法,但其回调函数内部并没有返回任何值,并且newsTitle = ...这一行在每次循环中都将newsTitle变量重新赋值为一个全新的HTML字符串。这意味着,当map方法完成所有迭代后,newsTitle中存储的将是最后一条新闻的HTML结构。因此,当document.getElementById('insert-news').innerHTML = newsTitle;执行时,只有最后一条新闻会被渲染到页面上。

正确实践:利用 map 和 join 高效渲染列表

要正确地将API返回的所有新闻标题渲染到页面上,我们需要利用map方法生成一个HTML字符串数组,然后使用join('')方法将这些字符串连接成一个单一的、完整的HTML字符串。

以下是修正后的代码示例:

DeepBI DHTML 页面生成器
DeepBI DHTML 页面生成器

生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur

下载
function getData() {
  fetch("https://api.coinstats.app/public/v1/news?skip=0&limit=10")
    .then((response) => {
      // 确保响应成功,并解析JSON数据
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
      }
      return response.json();
    })
    .then((data) => {
      // 检查数据结构,确保 news 数组存在
      if (data && data.news && Array.isArray(data.news)) {
        // 使用 map 遍历 news 数组,为每一项生成一个 HTML 字符串
        // map 方法会返回一个由这些 HTML 字符串组成的新数组
        const newsHtmlArray = data.news.map(
          (values) =>
            `<div class="news-item">
                <div class="title">Marketplace </div>
                <h2>Live News</h2>
                <p><span class='highlight'>News Article</span></p>
                <p>${values.title}</p>
            </div>` // 注意这里将每个新闻项包裹在一个新的 div 中,以便区分
        );

        // 使用 join('') 将 HTML 字符串数组连接成一个单一的字符串
        // 然后将其赋值给 innerHTML
        document.getElementById("insert-news").innerHTML = newsHtmlArray.join("");
      } else {
        console.error("API返回的数据结构不符合预期或没有新闻数据。");
        document.getElementById("insert-news").innerHTML = "<p>未能加载新闻。</p>";
      }
    })
    .catch((error) => {
      console.error("获取数据时发生错误:", error);
      document.getElementById("insert-news").innerHTML = `<p>加载新闻失败: ${error.message}</p>`;
    });
}

// 调用函数以获取并显示数据
getData();

代码解析与最佳实践:

  1. fetch API: fetch是一个现代的浏览器API,用于发出网络请求。它返回一个Promise,允许我们使用.then()链式调用来处理异步操作的结果。
  2. Promise 链:
    • 第一个.then(response => response.json()):处理网络响应。response.json()也是一个Promise,它将响应体解析为JSON格式。
    • 第二个.then(data => { ... }):当JSON数据解析成功后,这个回调函数会被调用,并接收到解析后的数据对象。
  3. Array.prototype.map(): 这是解决问题的关键。map()方法会遍历数组的每一个元素,对每个元素执行一个回调函数,并将回调函数的返回值组成一个新的数组。
    • 在我们的例子中,回调函数(values) => \...` 为每个values`(即每条新闻对象)生成一个包含其标题的HTML字符串。
    • map方法执行完毕后,newsHtmlArray将是一个由多个HTML字符串组成的数组,例如 ["

      新闻1

      ", "

      新闻2

      ", ...]。
  4. Array.prototype.join(''): 这是一个数组方法,用于将数组的所有元素连接成一个字符串。join('')中的空字符串''表示元素之间不使用任何分隔符。
    • newsHtmlArray.join("")会将["

      新闻1

      ", "

      新闻2

      ", ...]转换为一个连续的字符串"

      新闻1

      新闻2

      ..."。
  5. innerHTML: 将最终生成的完整HTML字符串赋值给目标DOM元素的innerHTML属性。这将一次性地更新DOM,插入所有新闻标题。
  6. 错误处理 (if (!response.ok) 和 .catch()): 在实际应用中,务必添加错误处理机制。
    • if (!response.ok) 检查HTTP响应状态码,如果不是2xx系列(成功),则抛出错误。
    • .catch(error => { ... }) 捕获在fetch操作或Promise链中发生的任何错误,例如网络问题或JSON解析失败,并提供用户友好的反馈。
  7. 数据结构验证: 在处理API返回的数据之前,最好检查其结构是否符合预期,以防止因API响应格式变化而导致的代码崩溃。

总结

正确地从API获取数据并动态渲染列表内容是Web开发中的一项基本技能。通过理解Array.prototype.map()和Array.prototype.join('')的工作原理,我们可以避免常见的迭代赋值错误,高效且准确地生成并更新DOM。始终记住添加适当的错误处理和数据验证,以构建更健壮和用户友好的应用程序。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2315

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3802

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1256

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4399

2025.09.10

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1069

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3460

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1918

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3144

2023.09.04

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

80

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn