【HarmonyOS开发】ArkTs实现侧栏联动

news2024/12/23 0:26:07

图片

侧栏联动功能模块:    

    1、切换左侧导航,右侧滚动到对应的内容。    

    2、滚动右侧的内容,左侧会切换对应的导航。

1、涉及知识点

List(列表组件)、ListItemGroup(列表item分组)

2、效果预览

图片

3、实现思路

    整体UI处理:左右两侧均为List组件,一层树状数据,左侧取顶层数据,右侧取一层数据,并使用ListItemGroup对List进行分组处理。

    1、左侧点击:通过Scroll组件的 scrollToIndex 方法滚动到对应的位置;

    2、右侧滚动左侧跟随:通过 onScrollIndex  监听滚动的Index位置;

// onScrollIndex监听和左侧点击scrollIndexChangeAction(index: number, isClassify: boolean) {  if (this.currentIndex !== index) {    // 改变状态.    this.currentIndex = index;    if (isClassify) {      //滚动      this.scroller.scrollToIndex(index);    } else {      // 判断左侧滚动还是右侧滚动      this.sidebarScroller.scrollToIndex(index);    }  }}

4、组件封装和调用

    4.1 组件封装

​​

@Component
export struct SidebarItem {
  @Prop isSelected: boolean = false;
  classifyName?: string;
  onClickAction = () => {}

  build() {
    Text(this.classifyName)
      .fontSize(14)
      .fontColor(this.isSelected ? '#182431' : '#99182431')
      .fontFamily(this.isSelected ? 'HarmonyHeiTi-Medium' : 'HarmonyHeiTi')
      .fontWeight(this.isSelected ? 500 : 400)
      .textAlign(TextAlign.Center)
      .backgroundColor(this.isSelected ? '#F1F3F5' : '')
      .width('100%')
      .height(56)
      .onClick(this.onClickAction)
  }
}

@Component
export default struct SidebarLinkage {
  @BuilderParam CourseItem: (item) => void;
  @Prop dataList: Array<any> = [];
  @Prop requestSuccess: boolean = false;

  @State currentIndex: number = 0; // selected classify index.
  private sidebarScroller: Scroller = new Scroller();
  private scroller: Scroller = new Scroller();

  @Builder blcokHeader(classifyName: string) {
    Row() {
      Text(classifyName)
        .fontSize(18)
        .fontColor('#182431')
        .fontFamily('HarmonyHeiTi-Medium')
        .fontWeight(500)
    }
    .padding({ left: 8 })
    .height(56)
    .width('100%')
    .backgroundColor('#F1F3F5')
  }

  scrollIndexChangeAction(index: number, isClassify: boolean) {
    if (this.currentIndex !== index) {
      // change the classify status.
      this.currentIndex = index;
      if (isClassify) {
        // scroll the course scroll.
        this.scroller.scrollToIndex(index);
      } else {
        // scroll the classify scroll.
        this.sidebarScroller.scrollToIndex(index);
      }
    }
  }

  build() {
    Row() {
      if (this.requestSuccess) {
        List({ scroller: this.sidebarScroller }) {
          ForEach(this.dataList, (item: any, index?: number) => {
            ListItem() {
              SidebarItem({
                classifyName: item.classifyName,
                isSelected: this.currentIndex === index,
                onClickAction: () => {
                  if (index !== undefined) {
                    this.scrollIndexChangeAction(index, true);
                  }
                }
              })
            }
          }, (item: any) => item.classifyName + this.currentIndex)
        }
        .height('100%')
        .width(100)
        .backgroundColor('#0D182431')
        .scrollBar(BarState.Off)

        List({ scroller: this.scroller }) {
          ForEach(this.dataList, (item: any) => {
            ListItemGroup({
              header: this.blcokHeader(item.classifyName),
              space: 12
            }) {
              ForEach(item.courseList, (courseItem: any) => {
                ListItem() {
                  this.CourseItem({ itemStr: JSON.stringify(courseItem) })
                }
              }, (courseItem: any) => `${courseItem.courseId}`)
            }
          }, (item: any) => `${item.classifyId}`)
        }
        .padding({ left: 8, right: 12 })
        .sticky(StickyStyle.Header)
        .layoutWeight(1)
        .edgeEffect(EdgeEffect.None)
        .onScrollIndex((start: number) => this.scrollIndexChangeAction(start, false))
      } else {
        Text('loading...')
          .fontFamily('HarmonyHeiTi-Medium')
          .textAlign(TextAlign.Center)
          .fontSize(18)
          .height('100%')
          .width('100%')
      }
    }
    .backgroundColor('#F1F3F5')
  }
}

    4.2 组件调用

import SidebarLinkage from '../../../../../SidebarLinkage/src/main/ets/components/SidebarLinkage/SidebarLinkage'

@Entry
@Component
struct IndexPage {
  @State requestSuccess: boolean = false; // is loading data.
  @State classifyList: Array<any> = [];

  aboutToAppear() {
    // loading data.
    setTimeout(() => {
      this.classifyList = [
        { "classifyId": 1, "classifyName": "音乐",
          "courseList": [{
            "classifyId": 0,
            "courseId": 1,
            "courseName": "YouTube1",
            "imageUrl": $r('app.media.youtube'),
            "price": 0
          },{
            "classifyId": 1,
            "courseId": 2,
            "courseName": "YouTube2",
            "imageUrl": $r('app.media.youtube'),
            "price": 12
          },{
            "classifyId": 1,
            "courseId": 3,
            "courseName": "YouTube3",
            "imageUrl": $r('app.media.youtube'),
            "price": 22
          },{
            "classifyId": 1,
            "courseId": 4,
            "courseName": "YouTube4",
            "imageUrl": $r('app.media.youtube'),
            "price": 43
          },{
            "classifyId": 1,
            "courseId": 5,
            "courseName": "YouTube5",
            "imageUrl": $r('app.media.youtube'),
            "price": 430
          },{
            "classifyId": 1,
            "courseId": 6,
            "courseName": "YouTube6",
            "imageUrl": $r('app.media.youtube'),
            "price": 120
          }]
        },
        { "classifyId": 2, "classifyName": "游戏",
          "courseList": [{
            "classifyId": 2,
            "courseId": 1,
            "courseName": "Twitter1",
            "imageUrl": $r('app.media.twitter'),
            "price": 797970
          },{
            "classifyId": 2,
            "courseId": 2,
            "courseName": "Twitter2",
            "imageUrl": $r('app.media.twitter'),
            "price": 98790
          },{
            "classifyId": 2,
            "courseId": 3,
            "courseName": "Twitter3",
            "imageUrl": $r('app.media.twitter'),
            "price": 7337
          },{
            "classifyId": 2,
            "courseId": 4,
            "courseName": "Twitter4",
            "imageUrl": $r('app.media.twitter'),
            "price": 33330
          },{
            "classifyId": 2,
            "courseId": 5,
            "courseName": "Twitter5",
            "imageUrl": $r('app.media.twitter'),
            "price": 7770
          },{
            "classifyId": 2,
            "courseId": 6,
            "courseName": "Twitter6",
            "imageUrl": $r('app.media.twitter'),
            "price": 30
          }]
        },
        { "classifyId": 3, "classifyName": "旅游",
          "courseList": [{
            "classifyId": 3,
            "courseId": 1,
            "courseName": "whatsapp1",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 6330
          },{
            "classifyId": 3,
            "courseId": 2,
            "courseName": "whatsapp2",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 730
          },{
            "classifyId": 3,
            "courseId": 3,
            "courseName": "whatsapp3",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 330
          },{
            "classifyId": 3,
            "courseId": 4,
            "courseName": "whatsapp4",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 730
          },{
            "classifyId": 3,
            "courseId": 5,
            "courseName": "whatsapp5",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 0
          },{
            "classifyId": 3,
            "courseId": 6,
            "courseName": "whatsapp6",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 0
          },{
            "classifyId": 3,
            "courseId": 7,
            "courseName": "whatsapp7",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 70
          },{
            "classifyId": 3,
            "courseId": 8,
            "courseName": "whatsapp8",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 60
          },{
            "classifyId": 3,
            "courseId": 9,
            "courseName": "whatsapp9",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 40
          },{
            "classifyId": 3,
            "courseId": 10,
            "courseName": "whatsapp10",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 20
          },{
            "classifyId": 3,
            "courseId": 11,
            "courseName": "whatsapp11",
            "imageUrl": $r('app.media.whatsapp'),
            "price": 0
          }]
        }
      ];
      this.requestSuccess = true;
    }, 2000);
  }

  @Builder CourseItemBuilder(item: any) {
    Row() {
      Image(JSON.parse(item.itemStr) !== undefined ? JSON.parse(item.itemStr)?.imageUrl : '')
        .height('100%')
        .aspectRatio(1)
      Column() {
        Text(JSON.parse(item.itemStr)?.courseName)
          .fontSize(14)
          .fontColor('#182431')
          .fontFamily('HarmonyHeiTi-Medium')
          .maxLines(2)
          .textOverflow({ overflow: TextOverflow.Clip })
          .lineHeight(20)
          .width('100%')
        Text('$ 999.99')
          .fontSize(16)
          .fontColor(Color.Pink)
          .fontFamily('HarmonyHeiTi-Medium')
        Text(JSON.parse(item.itemStr)?.price === 0 ? '免费' : `$${JSON.parse(item.itemStr)?.price}`)
          .fontSize(18)
          .fontColor('#FA2A2D')
          .fontFamily('HarmonyHeiTi-Medium')
      }
      .padding(12)
      .layoutWeight(1)
      .alignItems(HorizontalAlign.Start)
      .justifyContent(FlexAlign.SpaceBetween)
      .height('100%')
    }
    .clip(true)
    .borderRadius(18)
    .backgroundColor($r('app.color.start_window_background'))
    .width('100%')
    .height(96)
  }

  build() {
    Column() {
      SidebarLinkage({
        dataList: this.classifyList,
        requestSuccess: this.requestSuccess,
        CourseItem: this.CourseItemBuilder
      })
    }
  }
}

图片

源码:https://gitee.com/bingtengaoyu/harmonyos-advanced-componen/tree/master/SidebarLinkage 

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

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

相关文章

AI数字人短视频矩阵怎么做?

AI数字人是什么&#xff1a;你可以通过我们的系统克隆出多个AI形象&#xff0c;每个数字人都有独特的个性和风格。无论是批量制作短视频&#xff0c;还是直播7*24小时都可以。数字人就是用AI技术根据你的真人形象克隆出一个数字人&#xff0c;跟真人的相似度可以达到100&#x…

【FAQ】运动健康服务云侧数据常见问题及解答

目录 Q1&#xff1a;v2接口相比于v1接口传参及返回的数据格式有变化吗&#xff1f;是否可以直接将v1接口改成v2接口&#xff1f; Q2&#xff1a;如何获取采集健康数据的穿戴设备信息&#xff1f; Q3&#xff1a;如何处理非华为手机产生的步数调用采样明细接口查询不到数据&a…

STM32-I2C通讯-AHT20温湿度检测

非常感谢&#xff0c;提供的视频学习 https://www.bilibili.com/video/BV1QN411D7ak/?spm_id_from333.788&vd_source8ca4826038edd44bb618801808a5e076 该文章注意&#xff1a;串口显示中文会乱码&#xff0c;必须选用支持ASCII的串口助手&#xff0c;才能正常显示中文。…

软考真的只准计算机专业报考吗?其实你也可以!

因为软考的全称为计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;很多人误以为软考只允许计算机专业的人报考&#xff0c;实际上并非如此~ 首先&#xff0c;让我们一起来看一下软考的报考条件 软考报考条件 软考的报考条件相对宽松&#xff0c;有…

自动化测试知识总结(含资料)

一、自动化测试 自动化测试的定义&#xff1a;使用一种自动化测试工具来验证各种软件测试的需求&#xff0c;它包括测试活动的管理与实施、测试脚本的开发与执行。 自动化测试只是测试工作的一部分&#xff0c;是对手工测试的一种补充; 自动化测试绝不能代替手工测试;多数情况…

【Mybatis】日常知识点随笔(持续更新)

目录 【K】Mybatis使用Select注解书写简单sql 【K】MySQL 数据类型与 Java 类型的对应关系 【K】Mybatis相同代码复用 1. 定义公共 SQL 片段 2. 引用公共 SQL 片段 3. 使用参数 4. 复用和组合 5. 注意事项 【K】mysql如何实现插入一条数据后立刻获取该数据自增长id进行…

软件测试面试:测试基础题

软件测试的流程是什么&#xff1f;&#xff08;测试流程&#xff09; &#xff08;1&#xff09;需求调查&#xff1a;全面了解系统概况、应用领域、软件开发周期、软件开发环境、开发组织、时间安排、功能需求、性能需求、质量需求及测试要求等。根据系统概况进行项目所需的人…

flowable-startEvent[开始事件]相关配置[表单、执行监听器]

flowable各个事件、网关、任务的使用详解 既然网上没有合适的教程&#xff0c;那就力求达到先会用&#xff0c;再理解。 当然各个事件有一些功能是重复的&#xff0c;比如事件和任务都有执行监听器&#xff0c;这个等说到任务的时候就会提一下&#xff0c;然后带过。 今天只看“…

FFmpeg 简单文档

一、播放器框架 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如mp4、flv、mkv等。媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一段声音数据、…

MySQL调优参考文档-MSB

1.操作与落地 1.1.数据库基础知识 1.1.1.范式化设计 1.1.1.1.什么是范式 范式来自英文Normal Form&#xff0c;简称NF。 实际上你可以把它粗略地理解为 一张数据表的表结构所符合的某种设计标准的级别 。就像家里装修买建材&#xff0c;最环保的是E0级&#xff0c;其次是E…

详细教程 - 进阶版 鸿蒙harmonyOS应用 第十二节——鸿蒙操作系统中的动画效果封装:Java和TypeScript版

简介 动画效果是开发鸿蒙应用时的一个重要功能。在这篇文章中&#xff0c;我们将详细探讨如何在鸿蒙系统中使用Java和TypeScript实现动画效果的封装&#xff0c;并提供一些代码示例。 Java版动画效果的实现 在鸿蒙操作系统中&#xff0c;我们可以使用ohos.agp.animation.Anima…

Python往事:ElementTree的单引号之谜

最近在针对某款设备的界面xml进行更新过程中&#xff0c;被告知回稿的字串放在了一个excel文件中&#xff0c;而我要上传到服务器的界面用语是用xml文件封装的。再经过详细求证了翻译组提供excel文件的原因后&#xff0c;我决定用python来完成界面用语xml的更新&#xff0c;但是…

5年开酸奶店的经历,告诉小白如何做市场调查

在开酸奶店之前&#xff0c;市场调查是必不可少的一步。 作为一个有 5 年开店经验的酸奶店老板&#xff0c;我将分享一些关于如何进行市场调查的实用建议。 1、确定目标市场 在开始市场调查之前&#xff0c;你需要先明确你的目标市场。你的酸奶店将面向哪些人群&#xff1f;…

如何通过ssh管道传输文件到ubuntu

如何在window系统中&#xff0c;通过ssh将指定的文件传输到ubuntu中呢&#xff1f; 比较常用的有以下种方式&#xff1a; 共享文件夹借助工具&#xff0c; FileZillaMobaxtermWinSCPXshell XFTP samba互传PuTTY pscp 今天主要分享一个使用python脚本搭建的一个&#xff0c;…

2023.12.17 关于 Redis 的特性和应用场景

目录 引言 Redis 特性 内存中存储数据 可编程性 可扩展性 持久化 支持集群 高可用性 Redis 优势 Redis 用作数据库 Redis 相较于 MySQL 优势 Redis 相较于 MySQL 劣势 Redis 用作缓存 典型场景 Redis 存储 session 信息 Redis 用作消息队列 初心 消息队列的…

谷歌手机安装证书到根目录

1、前提你已经root&#xff0c;安装好面具 2&#xff0c;下载movecert模块&#xff0c;自动帮你把证书从用户证书移动成系统证书 视频教程&#xff0c;手机为谷歌手机 https://www.bilibili.com/video/BV1pG4y1A7Cj?p11&vd_source9c0a32b00d6d59fecae05b4133f22f06 软件下…

众和策略:短线交易看什么?短线交易看什么指标?

短线交易看什么&#xff1f; 1、k线 当k线出现黄昏十字星、黑乌鸦、乌云盖顶等卖出形状图时&#xff0c;是一种卖出信号&#xff0c;当k线出现早晨十字星、红三兵、等买入形状图时&#xff0c;是一种买入信号。 2、均线 当均线出现死叉、空头摆放时是一种卖出信号&#xff…

商城免 费搭建之java鸿鹄云商 java电子商务商城 Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

SpringIOC之ScopeMetadata

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

《服务器之间的图片传输 2023-12-19》模拟一台服务器(client)给另外一台服务(server)传输图片

Server public class PictureTestServer {public static void main(String[] args) {try (ServerSocket serverSocket new ServerSocket(0)) {System.out.println("服务器已启动&#xff0c;监听端口: " serverSocket.getLocalPort());Socket socket serverSocke…