【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

news2024/11/15 11:02:42

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

  • 一、环境说明
  • 二、调用后台接口及List组件渲染
  • 三、总结

一、环境说明

  1. DevEco Studio 版本:
    在这里插入图片描述

  2. API版本:以12为主
    在这里插入图片描述

二、调用后台接口及List组件渲染

  1. 后台接口及返回数据分析
    在这里插入图片描述
    JSON数据格式如下:

    {
        "code": 0,
        "data": {
            "total": 6,
            "pageSize": 10,
            "totalPage": 1,
            "currPage": 1,
            "list": [
                {
                    "id": 31,
                    "biaoti": "标题1",
                    "neirong": "内容1",
                    "shipin": "",
                    "fabushijian": "2024-08-05 11:59:42",
                    "faburen": "发布人1",
                    "fengmian": "http://localhost:8080/springboot49j18/upload/xinwen_fengmian1.jpg",
                    "thumbsupnum": 1,
                    "crazilynum": 1,
                    "clicktime": "2024-08-05 12:00:04",
                    "clicknum": 4,
                    "addtime": "2024-08-05 11:59:29"
                },
                {
                    "id": 32,
                    "biaoti": "标题2",
                    "neirong": "内容2",
                    "shipin": "",
                    "fabushijian": "2024-08-05 11:59:42",
                    "faburen": "发布人2",
                    "fengmian": "http://localhost:8080/springboot49j18/upload/xinwen_fengmian2.jpg",
                    "thumbsupnum": 2,
                    "crazilynum": 2,
                    "clicktime": "2024-08-05 12:00:04",
                    "clicknum": 5,
                    "addtime": "2024-08-05 11:59:29"
                },
                {
                    "id": 33,
                    "biaoti": "标题3",
                    "neirong": "内容3",
                    "shipin": "",
                    "fabushijian": "2024-08-05 11:59:42",
                    "faburen": "发布人3",
                    "fengmian": "http://localhost:8080/springboot49j18/upload/xinwen_fengmian3.jpg",
                    "thumbsupnum": 3,
                    "crazilynum": 3,
                    "clicktime": "2024-08-05 12:00:04",
                    "clicknum": 3,
                    "addtime": "2024-08-05 11:59:29"
                },
                {
                    "id": 34,
                    "biaoti": "标题4",
                    "neirong": "内容4",
                    "shipin": "",
                    "fabushijian": "2024-08-05 11:59:42",
                    "faburen": "发布人4",
                    "fengmian": "http://localhost:8080/springboot49j18/upload/xinwen_fengmian4.jpg",
                    "thumbsupnum": 4,
                    "crazilynum": 4,
                    "clicktime": "2024-08-05 12:01:05",
                    "clicknum": 7,
                    "addtime": "2024-08-05 11:59:29"
                },
                {
                    "id": 35,
                    "biaoti": "标题5",
                    "neirong": "内容5",
                    "shipin": "",
                    "fabushijian": "2024-08-05 11:59:42",
                    "faburen": "发布人5",
                    "fengmian": "http://localhost:8080/springboot49j18/upload/xinwen_fengmian5.jpg",
                    "thumbsupnum": 5,
                    "crazilynum": 5,
                    "clicktime": "2024-08-05 12:00:04",
                    "clicknum": 5,
                    "addtime": "2024-08-05 11:59:29"
                },
                {
                    "id": 36,
                    "biaoti": "标题6",
                    "neirong": "<p>66232</p>",
                    "shipin": "",
                    "fabushijian": "2024-08-05 11:59:42",
                    "faburen": "发布人6",
                    "fengmian": "http://localhost:8080/springboot49j18/upload/xinwen_fengmian6.jpg",
                    "thumbsupnum": 6,
                    "crazilynum": 6,
                    "clicktime": "2024-08-05 12:00:50",
                    "clicknum": 12,
                    "addtime": "2024-08-05 11:59:29"
                }
            ]
        }
    }
    
  2. 新建后台数据相关的实体类
    新建common目录并在其下新建bean目录,然后在bean目录下新建NewsDataItem.ets类,用于封装整个后台JSON数据的最内层数据

    /**
     * 用于定义具体的数据项
     * {
     "id": 31,
     "biaoti": "标题1",
     "neirong": "内容1",
     "shipin": "",
     "fabushijian": "2024-08-05 11:59:42",
     "faburen": "发布人1",
     "fengmian": "http://localhost:8080/springboot49j18/upload/xinwen_fengmian1.jpg",
     "thumbsupnum": 1,
     "crazilynum": 1,
     "clicktime": "2024-08-05 12:00:04",
     "clicknum": 4,
     "addtime": "2024-08-05 11:59:29"
     }
     */
    
    export default class NewsDataItem {
      public id: number
      public biaoti: string
      public neirong: string
      public shipin: string
      public fabushijian: string
      public faburen: string
      public fengmian: string
      // API12的语法,如果构造函数中该属性作为形式参数且是可选参数时,要保持类型一致
      public thumbsupnum: number
      public crazilynum: number
      public clicktime: string
      public clicknum: number
      public addtime: string
    
      /**
       * 构造函数
       * @param id
       * @param biaoti
       * @param neirong
       * @param shipin
       * @param fabushijian
       * @param faburen
       * @param fengmian
       * @param thumbsupnum
       * @param crazilynum
       * @param clicktime
       * @param clicknum
       * @param addtime
       */
      constructor(id: number, biaoti: string, neirong: string, shipin: string, fabushijian: string,
        faburen: string, fengmian: string, thumbsupnum: number, crazilynum: number, clicktime: string,
        clicknum: number, addtime: string) {
        this.id = id
        this.biaoti = biaoti
        this.neirong = neirong
        this.shipin = shipin
        this.fabushijian = fabushijian
        this.faburen = faburen
        this.fengmian = fengmian
        this.thumbsupnum = thumbsupnum
        this.crazilynum = crazilynum
        this.clicktime = clicktime
        this.clicknum = clicknum
        this.addtime = addtime
      }
    }
    

    然后在bean目录下新建NewsData.ets类,用于封装整个后台JSON数据的中间层数据

    /**
     * 定义用于接收后台返回的json中间层数据
     * "data": {
         "total": 6,
         "pageSize": 10,
         "totalPage": 1,
         "currPage": 1,
         "list": []
     */
    import NewsDataItem from './NewsDataItem'
    
    export default class NewsData{
      public  total: number
      public  pageSize: number
      public  totalPage: number
      public  currPage: number
      public  list: Array<NewsDataItem>
    
      constructor(total: number, pageSize: number, totalPage: number, currPage: number, list: Array<NewsDataItem>) {
        this.total = total
        this.pageSize = pageSize
        this.totalPage = totalPage
        this.currPage = currPage
        this.list = list
      }
    }
    

    然后在bean目录下新建NewsResultData.ets类,用于封装整个后台JSON数据的最外层数据

    /**
     * 定义用于接收后台返回的json最外层数据
     * {
     *    code: 0,
     *    data: {}
     * }
     */
    import NewsData from './NewsData';
    
    export default class NewsResultData extends Object{
      public code: number;
      public data: NewsData;
    
      constructor(code: number,data: NewsData) {
        super();
        this.code = code;
        this.data = data;
      }
    }
    
  3. 新建ListComponentPage.ets页面,实现aboutToAppear()函数,然后在该函数中调用后台接口,最后用List组件渲染后台数据,具体代码如下:

    import NewsDataItem from '../common/bean/NewsDataItem'
    import { http } from '@kit.NetworkKit';
    import NewsResultData from '../common/bean/NewsResultData';
    import NewsData from '../common/bean/NewsData';
    
    @Preview
    @Entry
    @Component
    struct ListComponentPage {
      private httpReq = http.createHttp()
      @State listData: Array<NewsDataItem> = []
    
      aboutToAppear(): void {
        // 调用接口
        this.httpReq.request('http://localhost:8080/springboot/xinwen/list').then((resp) => {
          //console.info("---调用后台接口返回---", JSON.stringify(resp))
          if (resp !== undefined && resp !== null) {
            if (resp.responseCode == 200) {
              //console.info("---resp.result---", resp.result)
              let newsResult: NewsResultData = JSON.parse(resp.result.toString())
              //console.info("---newsData---", newsResult.code)
              if (newsResult !== undefined && resp !== null) {
                let newsData: NewsData = newsResult.data
                this.listData = newsData.list
              }
            }
          }
        }).catch((reason: object) => {
          console.info("---接口错误信息---", JSON.stringify(reason))
        })
      }
    
      build() {
        Column() {
          List({ space: 10 }) {
            ForEach(this.listData, (item: NewsDataItem) => {
              ListItem() {
                Text(`${item.biaoti}`)
                  .width('100%')
                  .height(100)
                  .fontSize(20)
                  .fontColor(Color.White)
                  .textAlign(TextAlign.Center)
                  .borderRadius(10)
                  .backgroundColor(0x007DFF)
              }
            })
          }
          // 分割线
          .divider({
            strokeWidth: 5,
            color: Color.Red,
            startMargin: 10,
            endMargin: 10
          })
          // 设置成水平方向
          // .listDirection(Axis.Horizontal)
          // 滑动事件
          .onScrollIndex((firstIndex: number, lastIndex: number) => {
            console.info('滑动起始位置索引值' + firstIndex)
            console.info('滑动结束位置索引值' + lastIndex)
          })
          .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
            console.info('滑动偏移量' + scrollOffset)
            console.info('当前滑动状态' + scrollState)
          })
          .onReachStart(() => {
            console.info('列表起始位置到达')
          })
          .onReachEnd(() => {
            console.info('列表末尾位置到达')
          })
          .onScrollStop(() => {
            console.info('列表滑动停止')
          })
        }
        .padding(12)
        .height('100%')
        .backgroundColor(0xF1F3F5)
    
      }
    }
    
  4. 重新编译,运行效果如下:
    在这里插入图片描述

三、总结

有如下关键几点:

  1. 调用后台接口,需要引入http模块或者其他诸如Ajax、axios等网络请求模块;
  2. 如果是需要在页面被创建的时候调用后台接口,则需要在aboutToAppear()中进行调用,如需要在页面显示时需要调用后台接口加载数据,则可以在onPageShow()函数中进行调用。根据实际业务结合组件的生命周期进行合适的调用;
  3. 如使用JSON.parse报错Structural typing is not supported (arkts-no-structural-typing),其原因是引入import { JSON } from '@kit.ArkTS';模块中的JSON,需要将其删除掉,使用内置的JSON对象(不需要显示引用);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024最新技术!使用Golang Beego开发的社区老人健康管理系统,Vue前端交互流畅,大数据分析助力健康趋势预测

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

用PG Back Web轻松进行PostgreSQL备份

什么是 PG Back Web &#xff1f; PG Back Web &#x1f418; 使用用户友好的 Web 界面轻松进行 PostgreSQL 备份&#xff01;&#x1f310;&#x1f4be;。PG Back Web 不仅仅是另一个备份工具。借助 PG Back Web&#xff0c;用户可以通过受 PGP 加密保护的直观 Web 界面轻松安…

JAVA—网络通信

本文是学习网络通信入门和简单了解UDP协议和TCP协议&#xff0c;学习和了解CS架构和简单了解BS架构和HTTP协议&#xff08;部分图片来自黑马程序员&#xff09; 目录 1.网络通信三要素 &#xff08;1&#xff09;IP地址 &#xff08;2&#xff09;端口号 &#xff08;3&am…

RHCE必过技巧,无需本人参加也可拿证?

RHCE(无需本人参加&#xff0c;给信息给款即可拿证) ​培训&#xff0b;认证 ​月初一期 ​月尾一期

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶…

生命科学、食品科学信息类综合全文数据库

一、Nature系列资源 《Nature》杂志1869年创刊于英国&#xff0c;是最早的国际性科技期刊&#xff0c;其办刊宗旨是“将科学发现的重要结果介绍给公众&#xff0c;让公众尽早知道全世界自然知识的每一分支中取得的所有进展”。它报道和评论全球科技领域里最重要的突破&#xf…

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明&#xff08;等四问全部更新完再写&#xff09;5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成&#xff…

python_使用tkinter建立一个页面的模板

python_使用tkinter建立一个页面的模板 效果如图&#xff0c; 代码如下 """ python设计一下tkinter的布局在最上面排列5个按钮&#xff0c;然后一排4个水平分布的按钮,下面分左右两个图像显示&#xff0c;默认为白色背景为了实现您所描述的Tkinter布局&…

计组 2.Linux上程序的编写与调试

1. 我们之间使用vim创建.c文件&#xff0c;在里面编写完成后按住esc后冒号加wq保存退出 再使用gcc编译.c文件即可 vim test.c gcc test.c2. 这道题对比上一道题多出了编译过程&#xff0c;我们只需要按要求编译即可 gcc -E hello.c -o hello.i # 预处理阶段 gcc -S hello.i…

【超详细】windows Docker安装

关于 Docker 可以把应用以及其依赖都打包到一个容器中&#xff0c;而这个容器的性能开销极低。 Docker 并非是一个通用的容器工具&#xff0c;它依赖于已存在并运行的 Linux 内核环境。Docker Desktop 是 Docker 在 Windows 10 和 macOS 操作系统上的官方安装方式&#xff0c…

opencv实战项目二十一:MediaPipe人体姿态检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、MediaPipe是什么&#xff1f;二、MediaPipe使用&#xff1a;三、算法流程&#xff1a;四、效果&#xff1a; 前言 在智能科技不断渗透我们日常生活的今天&…

redis分布式锁和lua脚本

业务场景&#xff1a;多个线程对共同资源的访问&#xff1a;库存超卖/用户重复下单的原因 解决方法一&#xff1a;利用jvm内置锁&#xff0c;将非原子性操作变成原子性操作 Synchronized锁的是对象&#xff0c;对象必须是单例的。锁的是this,代表当前所在的类&#xff0c;这个…

“电轿三巨头”集齐,新车能否后浪拍前浪?

文/王俣祺 导语&#xff1a;纵观全年&#xff0c;要说哪款电车最火&#xff0c;那必然得是小米SU7。小米SU7在今年上半年上市以来&#xff0c;基本垄断了整个国产20万级电轿市场&#xff0c;甚至具备了和称霸电轿市场已久的特斯拉Model 3掰掰手腕的实力。那么&#xff0c;如今的…

Stream插件相关的用法

文章目录 1. 概念介绍2. 使用方法2.1 StreamController2.2 StreamBuilder 3. 示例代码 我们在上一章回中介绍了管理Stream事件流相关的内容&#xff0c;本章回中将介绍如何使用Stream事件流输入输出数据 。闲话休提&#xff0c;言归正传&#xff0c;让我们一起Talk Flutter吧。…

FPGA搭建XDMA中断模式的PCIE通信架构,简单读写测试,提供7套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案 3、PCIE基础知识4、工程详细设计方案工程设计原理框图XDMA配置及使用XDMA中断模块数据缓存架构用户逻辑Windows版本XDMA驱动安装Linux版本XDMA驱动安装测试应用程序工程源码架构PCIE上板调试注意事项 5、vivado工…

2024年了,软件测试已经饱和了?

这个年头找工作跟找对象一样难&#xff0c;咳咳&#xff0c;工作对象都木有&#xff0c;双重打击5555。 关于今年的就业市场&#xff0c;很多人表示特别惨淡&#xff0c;以往简历一投就有大批企业来联系&#xff0c;今年自己投递一大堆简历出去&#xff0c;可能全部都是已读不…

黑神话悟空现在有哪些结局?黑神话悟空攻略来啦!

结局 1:天命人戴上金箍&#xff0c;继承了大圣意志&#xff0c;成为了新大圣。 最终 Boss:孙悟空&#xff1a;玩家需经历两场遭遇战&#xff0c;‌每场都分为两个阶段。‌ 首战&#xff0c;‌玩家需独自对抗石猴;‌而在第二阶段&#xff0c;‌则要面对两位掌握不同元素力量的…

Nacos注册中心与OpenFeign远程调用

文章目录 一、注册中心原理二、Nacos注册中心三、服务注册四、服务发现五、OpenFeign 一、注册中心原理 在微服务当中必须有两个角色 服务提供者&#xff1a;提供接口供其它微服务访问 服务消费者&#xff1a;调用其它微服务提供的接口 在大型微服务项目中&#xff0c;服务提供…

3600+银行财务数据大全(1954-2022年)

3600银行财务数据&#xff0c;包括农村商业银行、村镇银行、外资银行、民营银行、股份制商业银行、城市商业银行、大型商业银行、农村合作银行、其他商业银行等。共计120个指标&#xff0c;银行基本信息、业务发展、财务指标、信贷资产、员工、负债等数据 一、数据介绍 数据名…

ChatTCP:一款离线TCP数据包分析macOS APP,致力于让分析TCP数据包像看聊天记录一样简单

ChatTCP是一款离线TCP数据包分析macOS APP&#xff0c;致力于让分析TCP数据包像看聊天记录一样简单&#xff01;已为UI交互方式申请专利&#xff0c;独家聊天会话方式分析TCP数据包&#xff0c;给你不一样的TCP数据包分析体验! ChatTCP是Easy TCP Analysis的离线版本&#xff…