鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码)

这篇具有很好参考价值的文章主要介绍了鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文介绍一个基于鸿蒙ArkTS开发的App,是一个包含轮播图、文章列表和 Web 页面等功能的多页面应用。

本文主要内容包括:

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码),鸿蒙应用开发,网络

一、效果图

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码),鸿蒙应用开发,网络
首页
鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码),鸿蒙应用开发,网络
详情页

  

二、内容简介

1.底部Tab栏和两个页面

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码),鸿蒙应用开发,网络

        App底部是一个TabBar,点击TabBar可以切换上面的页面。共包含两个页面,一个是“首页” ,另一个是“空白页”。

2.顶部Banner

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码),鸿蒙应用开发,网络

        App顶部是一个Banner,也叫轮播图,点击轮播图可以跳转到对应的详情页面。

3.List组件

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码),鸿蒙应用开发,网络

        轮播图下方是一个List组件,点击其中某一项可以跳转详情页面。

4.WebView

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码),鸿蒙应用开发,网络

使用系统组件@ohos.web.webview 显示网页。同时,此详情页面顶部有一个标题栏,用于显示返回键和标题。

三、实现说明

1.主界面

首先实现主界面,包含一个TabBar和上面的两个页面,以下是主界面代码:

import Constants from '../Constants/Constants'
import Home from './Home';
import EmptyPage from './EmptyPage';
@Entry
@Component
struct Index {
  @State currentTabIndex: number = 0;
  tabsController: TabsController;
  aboutToAppear(){
    this.tabsController = new TabsController();
  }
  @Builder TabBuilder(title: string, index: number, icon: Resource) {
    Column() {
      Image(icon)
        .width($r('app.float.mainPage_baseTab_size'))
        .height($r('app.float.mainPage_baseTab_size'))
        .fillColor(this.getTabBarColor(index))
      Text(title)
        .margin({ top: $r('app.float.mainPage_baseTab_top') })
        .fontSize($r('app.float.main_tab_fontSize'))
        .fontColor(this.getTabBarColor(index))
    }
    .justifyContent(FlexAlign.Center)
    .height($r('app.float.mainPage_barHeight'))
    .width(Constants.FULL_PARENT)
    .onClick(() => {
      this.currentTabIndex = index;
      this.tabsController.changeIndex(this.currentTabIndex)
    })
  }

  // 获取选项卡栏颜色
  getTabBarColor(index: number){
    if(index == this.currentTabIndex){
      return Color.Blue;
    }else{
      return Color.Gray;
    }
  }

  build() {
    Tabs({
      barPosition: BarPosition.End,
      controller: this.tabsController
    }) {
      // 首页
      TabContent() {
        Home()
      }
      .padding({ left: $r('app.float.mainPage_padding'), right: $r('app.float.mainPage_padding') })
      .backgroundColor($r('app.color.mainPage_backgroundColor'))
      .tabBar(this.TabBuilder(Constants.HOME_TITLE, Constants.HOME_TAB_INDEX
        , $r('app.media.ic_bottom_home')))

      // 项目
      TabContent() {
        EmptyPage()
      }
      .padding({ left: $r('app.float.mainPage_padding'), right: $r('app.float.mainPage_padding') })
      .backgroundColor($r('app.color.mainPage_backgroundColor'))
      .tabBar(this.TabBuilder(Constants.EMPTY_TITLE, Constants.EMPTY_TAB_INDEX
        , $r('app.media.ic_bottom_empty')))
    }
    .width(Constants.FULL_PARENT)
    .backgroundColor(Color.White)
    .barHeight($r('app.float.mainPage_barHeight'))
    .barMode(BarMode.Fixed)
    .onChange((index: number) => {
      this.currentTabIndex = index;
    })
  }
}
2.首页

本文主要实现的就是首页,用竖向列包含了Banner组件和ArticleList组件,代码如下:

@Component
export default struct Home {
  build() {
    Column() {
      Banner();
      ArticleList();
    }
  }
}

其中Banner组件代码如下,代码中有具体实现的解释:

// 标记为组件
@Component
  // 导出名为 Banner 的结构体
export default struct Banner {
  // Swiper 控制器
  swiperController: SwiperController = new SwiperController();
  // 轮播图数据
  @State bannerData: HomeBannerItemBean[] = [];

  // 生命周期钩子,在即将显示时调用
  aboutToAppear() {
    // 获取轮播图数据
    this.getData();
  }

  // 异步获取轮播图数据
  async getData(){
    await HomeViewModel.getHomeBanner(Constants.GET_HOME_BANNER).then((data: HomeBannerItemBean[]) => {
      // 将获取到的数据赋值给轮播图数据
      this.bannerData = data;
    }).catch((err: string | Resource) => {
      // 如果发生错误,显示提示消息
      promptAction.showToast({
        message: err,
        duration: Constants.ANIMATION_DURATION
      });
    });
  }

  // 构建界面
  build() {
    // 垂直排列的列
    Column() {
      // 如果有轮播图数据且数据长度大于 0
      if(this.bannerData && this.bannerData.length > 0){
        // 使用 Swiper 组件创建轮播图
        Swiper(this.swiperController) {
          // 遍历轮播图数据
          ForEach(this.bannerData, (banner: HomeBannerItemBean) => {
            // 显示图片,并设置圆角和点击事件
            Image(banner.imagePath).borderRadius($r('app.float.home_swiper_borderRadius')).onClick(() => {
              // 点击事件:跳转到 Web 页面,并传递标题和链接参数
              router.pushUrl({
                url: 'pages/WebPage',
                params: {
                  title: banner.title,
                  src: banner.url
                }
              }, router.RouterMode.Single)
            })
          }, (img: Resource) => JSON.stringify(img.id))
        }
        // 设置轮播图的外边距、自动播放、宽度和高度
        .margin({top: $r('app.float.home_swiper_margin')})
        .autoPlay(true)
        .width(Constants.FULL_PARENT)
        .height(200)
      }
    }
  }
}

那么在Banner组件下方的ArticleList组件,代码如下:

// 标记为组件
@Component
// 导出名为 ArticleList 的结构体
export default struct ArticleList {
  // 是否还有更多数据
  hasMore: boolean = true;
  // 当前页码
  currentPage: number = 0;
  // 每页数据量
  pageSize: number = 30;
  // 文章数据数组
  @State articleData: ArticleItemData[] = [];
  // 需绑定列表或宫格组件的滚动控制器
  private scroller: Scroller = new Scroller();

  // 生命周期钩子,在即将显示时调用
  aboutToAppear() {
    // 获取文章列表数据,参数为 true 表示重置数据
    this.getArticleList(true);
  }

  // @Builder 修饰的私有方法,用于创建列表视图
  @Builder
  private getListView() {
    // 使用 List 组件创建列表
    List({ space: 10, scroller: this.scroller }) {
      // 遍历文章数据
      ForEach(this.articleData, (item: ArticleItemData) => {
        // 使用 ListItem 创建列表项
        ListItem() {
          // 使用 Flex 创建布局
          Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween, }) {
            // 作者和发布时间
            Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween, }) {
              Text(item.author)
                .fontSize(13)
              Text(Util.dateTime(item.publishTime))
                .fontSize(13)
            }.margin({ top: 10, left: 30, right: 30 })

            // 文章标题
            Text(item.title)
              .width('100%')
              .fontSize(20)
              .textAlign(TextAlign.Center)
              .fontWeight(FontWeight.Bold)
              .maxLines(1)
              .textOverflow({ overflow: TextOverflow.Ellipsis })
              .margin({ left: 10, right: 10 })

            // 文章分类
            Text(item.chapterName)
              .fontSize(13)
              .textAlign(TextAlign.Start)
              .width('100%')
              .margin({ left: 30, bottom: 10 })
          }.borderRadius($r('app.float.home_list_borderRadius'))
          .backgroundColor(Color.White)
        }.onClick(() => {
          // 点击列表项跳转到 Web 页面,传递标题和链接参数
          router.pushUrl({
            url: 'pages/WebPage',
            params: {
              title: item.title,
              src: item.link
            }
          }, router.RouterMode.Single)
        })
      })
    }
    // 设置列表的圆角
    .borderRadius($r('app.float.home_list_borderRadius'))
    // .divider({ strokeWidth: 1, color: 0x222222 })
    // 设置列表的边缘效果为无效果
    .edgeEffect(EdgeEffect.None)
    // 设置列表宽度和高度为100%
    .width('100%')
    .height('100%')
  }

  // 异步获取文章列表数据
  async getArticleList(reset: boolean) {
    await HomeViewModel.getHomeArticleList(this.currentPage, this.pageSize, Constants.GET_HOME_ARTICLE_LIST)
      .then((data: ArticleDataBean) => {
        // 判断是否还有更多数据
        if (data.curPage < data.pageCount) {
          this.currentPage++;
          this.hasMore = true;
        } else {
          this.hasMore = false;
        }
        // 根据参数判断是否重置数据
        if (reset) {
          this.articleData = data.datas;
        } else {
          this.articleData = this.articleData.concat(data.datas);
        }
      }).catch((err: string | Resource) => {
        // 显示错误提示
        promptAction.showToast({ message: err });
      })
  }

  // 构建界面
  build() {
    // 使用 Column 组件创建垂直布局
    Column() {
      // 使用 PullToRefresh 组件实现下拉刷新和上拉加载
      PullToRefresh({
        customRefresh: null,
        customLoad: null,
        data: $articleData, // 数据源数组
        scroller: this.scroller, // 控制器,负责关闭下拉和上拉
        customList: () => {
          // 调用 getListView 方法创建列表视图
          this.getListView();
        },
        onRefresh: () => {
          return new Promise<string>((resolve, reject) => {
            // 下拉刷新成功后解析数据,重新获取文章列表数据
            resolve('下拉刷新成功')
            this.getArticleList(true);
          });
        },
        onLoadMore: () => {
          // 上拉加载成功后解析数据,继续获取更多文章列表数据
          return new Promise<string>((resolve, reject) => {
            resolve('上拉加载成功')
            this.getArticleList(false);
          });
        }
      })
    }.backgroundColor("#efefef") // 设置背景颜色
  }
}

这个文章列表组件,使用了 PullToRefresh 组件和 List 组件展示通过网络获取的文章列表数据,并且点击其中每一项都可以跳转详情页面,使用到的系统方法是router.pushUrl。

3.网络请求

其中网络请求代码如下:

/**
 * 发起 HTTP GET 请求的函数
 * @param url 请求的 URL 地址
 * @param extraData 额外的请求数据,可选参数
 * @returns 返回 Promise 对象,包含 ResponseResult 数据
 */
export function httpRequestGet(url: string, extraData?: Record<string, any>): Promise<ResponseResult> {
  // 创建 HTTP 请求实例
  let httpRequest = http.createHttp();
  
  // 发起 HTTP GET 请求
  let responseResult = httpRequest.request(url, {
    method: http.RequestMethod.GET,
    readTimeout: Constants.HTTP_READ_TIMEOUT,
    header: {
      'Content-Type': ContentType.JSON
    },
    connectTimeout: Constants.HTTP_READ_TIMEOUT,
    extraData: extraData || {}  // 使用 extraData 参数,如果不存在则传递一个空对象
  });

  // 创建用于存储响应数据的对象
  let serverData: ResponseResult = new ResponseResult();

  // 处理返回的数据并返回结果
  return responseResult.then((value: http.HttpResponse) => {
    // 检查 HTTP 响应码是否为成功状态(200)
    if (value.responseCode === Constants.HTTP_CODE_200) {
      // 解析返回的数据
      let result = `${value.result}`;
      let resultJson: ResponseResult = JSON.parse(result);
      
      // 检查服务器返回的错误码是否为成功状态
      if (resultJson.errorCode === Constants.SERVER_CODE_SUCCESS) {
        // 将返回的数据赋值给 serverData 对象
        serverData.data = resultJson.data;
      }
      // 将服务器返回的错误码和错误消息赋值给 serverData 对象
      serverData.errorCode = resultJson.errorCode;
      serverData.errorMsg = resultJson.errorMsg;
    } else {
      // 设置错误消息,包含 HTTP 错误码
      serverData.errorMsg = `${$r('app.string.http_error_message')}&${value.responseCode}`;
    }
    // 返回处理后的 serverData 对象
    return serverData;
  }).catch((err) => {
    // 捕获异常,打印错误信息,并设置错误消息
    console.log("error:" + JSON.stringify(err));
    serverData.errorMsg = $r('app.string.http_error_message');
    // 返回处理后的 serverData 对象
    return serverData;
  });
}
4.详情页面

详情页面是通过webview来展示网页实现的,代码如下:

// 标记为入口
@Entry
// 标记为组件
@Component
// Web 页面结构体
struct WebPage {
  // 从路由获取参数中的 'src',并存储到状态中
  @State src: string = router.getParams()?.['src'];
  // 从路由获取参数中的 'title',并存储到状态中
  @State title: string = router.getParams()?.['title'];

  // Web 页面控制器
  controller: web_webview.WebviewController = new web_webview.WebviewController();

  // 构建界面
  build() {
    // 使用 Column 组件创建垂直布局
    Column() {
      // 页面标题组件
      PageTitle({ titleName: this.title })

      // 分隔线
      Divider()
        .strokeWidth('1px')
        .color($r('sys.color.ohos_id_color_list_separator'))

      // Web 组件,加载指定的网址,并使用控制器进行交互
      Web({
        src: this.src, controller: this.controller
      }).javaScriptAccess(true)
    }
  }
}

// 页面标题组件结构体
@Component
struct PageTitle {
  // 标题名称
  private titleName: string

  // 构建界面
  build() {
    // 使用 Row 组件创建水平布局
    Row() {
      // 返回按钮图标
      Image($r('app.media.back'))
        .width(20)
        .height(20)
        .onClick(() => {
          // 点击返回按钮,触发路由返回操作
          router.back()
        })

      // 标题文本
      Text(this.titleName)
        .fontSize(Constants.PAGE_TITLE_TEXT_SIZE)
        .width(Constants.PAGE_TITLE_TEXT_WIDTH)
        .maxLines(Constants.PAGE_TITLE_TEXT_MAX_LINES)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .margin({ left: 20 })
    }
    // 设置整体内边距
    .padding(12)
    // 设置整体宽度为100%
    .width('100%')
  }
}

四、源码地址

WanAndroid: 基于鸿蒙ArkTS语言实现的WanAndroid App

如果觉得本文不错的话,帮忙点个赞吧~感谢~文章来源地址https://www.toymoban.com/news/detail-789545.html

到了这里,关于鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序开发---下拉刷新

    目录 一、下拉刷新的定义 二、下拉刷新的启用 三、配置下拉刷新的样式 四、监听页面的下拉刷新事件 五、停止下拉刷新的效果 下拉刷新是移动端的专有名词,指的是通过手指在屏幕上的下拉滑动操作,让页面重新加载数据 启用下拉刷新有两种方式 (1)全局开启。 在ap

    2024年02月09日
    浏览(36)
  • mescroll 在uni-app 运行的下拉刷新和上拉加载的组件

    官网传送门: https://www.mescroll.com/uni.html 最近使用到了mescroll 但是一直都是整个页面的滚动, 最近需求有需要局部滚动, 收藏了一个博主的文章觉得写的还挺好, 传送门: https://blog.csdn.net/Minions_Fatman/article/details/134754926?spm=1001.2014.3001.5506 使用总结 如果使用到的是mescroll-body 在给它

    2024年02月22日
    浏览(65)
  • 【HarmonyOS开发】ArkUI实现下拉刷新/上拉加载

     列表下拉刷新、上拉加载更多,不管在web时代还是鸿蒙应用都是一个非常常用的功能,基于ArkUI中TS扩展的声明式开发范式实现一个下拉刷新,上拉加载。 如果数据量过大,可以使用LazyForEach代替ForEach 高阶组件-上拉加载,下拉刷新 https://gitee.com/bingtengaoyu/harmonyos-advanced-com

    2024年01月20日
    浏览(41)
  • flutter开发实战-下拉刷新与上拉加载更多实现

    flutter开发实战-下拉刷新与上拉加载更多实现 在开发中经常遇到列表需要下拉刷新与上拉加载更多,这里使用EasyRefresh,版本是3.3.2+1 EasyRefresh可以在Flutter应用程序上轻松实现下拉刷新和上拉加载。它几乎支持所有Flutter Scrollable小部件。它的功能与安卓的SmartRefreshLayout非常相似

    2024年02月07日
    浏览(44)
  • 【Android开发基础】说说模块设计(下拉刷新、图片查看、布局设计)

    描述:设计一个简单说说功能模块 需求: 1、能够下拉刷新,更新数据 2、一条说说里允许包含多张图片,图片能够放大查看 难度:初级 知识点: 1、Swiperefreshlayout 2、适配器Adapter 3、对话框Dialog 4、文字图标Icon 1、下拉刷新 思路        使用官方提供的解决方案SwipeRefre

    2024年02月08日
    浏览(42)
  • iOS开发-下拉刷新动画依次渐隐渐显Indicator指示器效果

    iOS开发-下拉刷新动画依次渐隐渐显Indicator指示器效果 之前开发中实现下拉刷新动画三个球依次渐隐渐显指示器效果。 CABasicAnimation类的使用方式就是基本的关键帧动画。 所谓关键帧动画,就是将Layer的属性作为KeyPath来注册,指定动画的起始帧和结束帧,然后自动计算和实现

    2024年02月15日
    浏览(38)
  • 【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)

    Select组件:提供下拉选择菜单,可以让用户在多个选项之间选择。 Slider组件:滑动条组件,通常用于快速调节设置值,如音量调节、亮度调节等应用场景。 提供下拉选择菜单,可以让用户在多个选项之间选择。 说明 该组件从API Version 8开始支持。后续版本如有新增内容,则

    2024年02月07日
    浏览(67)
  • uniapp开发使用插件z-paging实现页面下拉刷新、上拉加载,分页加载

    在uniapp官网有一个比较好用的插件z-paging,可以实现多条数据滚动显示或者自定义下拉刷新,分页显示......在开发消息页面或者app开发需要大量的页面刷新,页面内容过长,减轻服务器的负担就可以使用此插件,进入app智慧加载部分内容,等到再次需要之后的内容就再次加载

    2024年02月11日
    浏览(54)
  • 【鸿蒙系统学习笔记】网络请求

    资料来自官网:文档中心 网络管理模块主要提供以下功能: HTTP数据请求:通过HTTP发起一个数据请求。 WebSocket连接:使用WebSocket建立服务器与客户端的双向连接。 Socket连接:通过Socket进行数据传输。 日常开发中HTTP请求使用会比较多,主要对HTTP请求进行总结记录 场景:应用

    2024年02月22日
    浏览(43)
  • 鸿蒙HarmonyOS-HTTP网络数据请求

    应用可以通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 亲爱的读者: 首先,我要感谢您抽出宝贵的时间阅读这篇文章。我深知,您的每一分每一秒都是宝贵的。为此,我在创作这篇文章时付出了巨大的努力,力求为您提供最具价

    2024年01月16日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包