HarmonyOS 应用开发 —— ArkTS 可复用代码块梳理

目录

  • ArkTS 复用代码块
  • 弹窗提醒
  • 网络请求
  • 消息通知
  • 如何给任意组件添加 multiState?
  • 如何给 ListItem 添加删除按钮,

ArkTS 复用代码块

记录一下自己这几天学习成果,我发官方文档很全,都是有时候查找起来不是很容易,因此总结该文章

PS: 此文章将保持持续更新

系统 API 版本

img

弹窗提醒

系统内置弹窗


@Entry
@Component
struct DialogPage {

  // ...
  build() {
    Row() {
      Column() {
        Button("AlertDialog 警告弹窗")
          .onClick(() => {
            AlertDialog.show({
              message: "Hello",
              primaryButton: {
                value: "取消",
                action: () => {
                  console.log("你点击了取消按钮");
                }
              },
              secondaryButton: {
                value: "确认",
                action: () => {
                  console.log("你点击了确认按钮")
                }
              },
              // 控制显示位置,默认居中
              alignment: DialogAlignment.Bottom,
              // 相对偏移量
              offset: {
                dx: 0,
                dy: 0
              //   dy -20,使弹窗距离屏幕底部 20vp
              }
            })
          })

        Button("日期选择 弹窗")
          .onClick(() => {
            DatePickerDialog.show({
              start: new Date("1900-1-1"),
              end: new Date(),
              selected: new Date("2021-7-1"),
              lunar: false, // 默认公历。 true 表示农历
              onAccept: (value: DatePickerResult) => {
                let year = value.year;
                let month = value.month + 1;
                let day = value.day;
                console.log(`你选择了 ${year}${month}${day}日`);
              }
            })
          })

  // ....
  }
}

警告弹窗

img

日期弹窗

img

自定义弹窗: (开发者可以自行定制弹窗样式,极大的丰富了弹窗的类型)

我们需要先编写自定义弹窗的样式

// 自定义 dialog
import CommonConstants from '../container/common/constants/CommonConstants';
import HobbyBean from './HobbyBean'

// 上面引入的内容
class HobbyBean {
  label: string
  isChecked: boolean
}

@CustomDialog
export default struct CustomDialogWidget {
  @State hobbyBeans: HobbyBean[] = [];
  @Link hobbies: string;
  private controller: CustomDialogController;

  aboutToAppear() {
    // let Context = getContext(this);
    // let manager = Context.resourceManager;
    // manager.getStringArrayValue($r("app.strarray.hobbies_data"), (err, hoobyResult) => {
    //   hoobyResult.forEach((hobbyItem: string) => {
    //     let hobbyBean = new HobbyBean();
    //     hobbyBean.label = hobbyBean.label;
    //     hobbyBean.isChecked = false;
    //     this.hobbyBeans.push(hobbyBean);
    //   })
    // });
    this.hobbyBeans = [{
      label: "唱",
      isChecked: false
    }, {
      label: "跳",
      isChecked: false,
    }, {
      label: "rap",
      isChecked: false
    }]
    console.log(JSON.stringify(this.hobbyBeans))
  }

  setHobbiesValue(hobbyBeans: HobbyBean[]) {
    let hobbiesText: string = '';
    hobbiesText = hobbyBeans.filter((icCheckItem: HobbyBean) => icCheckItem.isChecked)
      .map((checkedItem: HobbyBean) => {
        return checkedItem.label;
      }).join(',');
    this.hobbies = hobbiesText;
  }

  // 创建弹窗组件
  build() {
    Column() {
      Text($r("app.string.text_title_hobbies"))
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
      List() {
        ForEach(this.hobbyBeans, (itemHobby: HobbyBean, HobbyBean) => {
          ListItem() {
            Row() {
              Text(itemHobby.label)
                .fontSize(24)
                .fontWeight(FontWeight.Medium)
                .fontStyle(FontStyle.Italic)
              Toggle({ type: ToggleType.Checkbox, isOn: false })
                .onChange((isCheck: boolean) => {
                  itemHobby.isChecked = isCheck;
                })
            }
          }
        }, (itemHobby: HobbyBean) => itemHobby.label)
      }
      Row() {
        Button($r("app.string.cancel_button"))
          .onClick(() => {
            this.controller.close();
          })

        Button("确认")
          .onClick(() => {
            this.setHobbiesValue(this.hobbyBeans);
            this.controller.close();
          })
      }.width(CommonConstants.BUTTON_WIDTH)
      .justifyContent(FlexAlign.Center)

    }
  }

}

// 使用自定义弹窗

   // 定义 builder,实例化一个自定义弹窗
  customDialogController: CustomDialogController = new CustomDialogController({
    builder: CustomDialogWidget({
      hobbies: $hobbies
    }),
    alignment: DialogAlignment.Bottom,
    customStyle: true,
    offset: {dx: 0, dy: -20}
  });

// 使用自定义弹窗
  build() {
    Row() {
        Button("CustomDialog")
          .onClick(() => {
            this.customDialogController.open();
          })
       }
    }

自定义弹窗效果

img

网络请求

网络请求封装,返回 JSON 固定格式数据

import http from '@ohos.net.http';

class ResponseResult {
  /**
   * Code returned by the network request: success, fail.
   */
  code: string;

  /**
   * Message returned by the network request.
   */
  msg: string | Resource;

  /**
   * Data returned by the network request.
   */
  data: string | Object | ArrayBuffer;

  constructor() {
    this.code = '';
    this.msg = '';
    this.data = '';
  }
}

export function httpRequestGet(url: string): Promise<ResponseResult> {
  let httpRequest = http.createHttp();
  let responseResult = httpRequest.request(url, {
    method: http.RequestMethod.GET,
    readTimeout: Const.HTTP_READ_TIMEOUT,
    header: {
      'Content-Type': ContentType.JSON
    },
    connectTimeout: Const.HTTP_READ_TIMEOUT,
    extraData: {}
  });
  let serverData: ResponseResult = new ResponseResult();
  // Processes the data and returns.
  return responseResult.then((value: http.HttpResponse) => {
    if (value.responseCode === Const.HTTP_CODE_200) {
      // Obtains the returned data.
      let result = `${value.result}`;
      let resultJson: ResponseResult = JSON.parse(result);
      if (resultJson.code === Const.SERVER_CODE_SUCCESS) {
        serverData.data = resultJson.data;
      }
      serverData.code = resultJson.code;
      serverData.msg = resultJson.msg;
    } else {
      serverData.msg = `${$r('app.string.http_error_message')}&${value.responseCode}`;
    }
    return serverData;
  }).catch(() => {
    serverData.msg = $r('app.string.http_error_message');
    return serverData;
  })
}

消息通知

官方文档

import notification from '@ohos.notificationManager';

  publishNotification() {
    let notificationRequest: notification.NotificationRequest = { // 描述通知的请求
      id: 1, // 通知ID
      slotType: notification.SlotType.SERVICE_INFORMATION,
      content: { // 通知内容
        contentType: notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知
        normal: { // 基本类型通知内容
          title: '通知内容标题',
          text: '通知内容详情',
          additionalText: '通知附加内容', // 通知附加内容,是对通知内容的补充。
        }
      }
    }
    notification.publish(notificationRequest).then(() => { // 发布通知
      console.info('publish success');
    }).catch((err) => {
      console.error(`publish failed, dcode:${err.code}, message:${err.message}`);
    });
  }

如何给任意组件添加 multiState?

详情见多态样式

当我们给 button 设置 startEffect 为 true 时,button 此时有一个点击效果,但是我们有一个 Row 容器,但是需要如何实现相同的效果?

  1. 绑定点击事件
  2. 设置 stateStyles
struct XX {
  @Styles list() {
    .backgroundColor($r("app.color.default_btn_normal_background"))
    .opacity(1)
  }

  @Styles pressedList() {
    .backgroundColor($r("app.color.default_btn_pressed_background"))
    .opacity(0.8)
  }

build() {

  // ....
            Row() {


            }
            .onClick(() => {
                console.log(`item is => ${item.type}`)
              })
              // 两种写法等价
              // .gesture(
              //   TapGesture()
              //     .onAction(() => {
              //       if (item.type === "FAMILY") {
              //
              //       } else if (item.type === "VERSION_UPADTED") {
              //
              //       }
              //       console.log("click the item " + `${item.type}`)
              //     }))
              .stateStyles({
                normal: this.list,    // 这里很容易写错,不要加括号,不然会报错,不是标准语法!
                pressed: this.pressedList
              })
  // ....

      }
}

如何给 ListItem 添加删除按钮,

效果预览

img

实现思路

ListItem 有一个 swipeAction 的选项, 我们可以通过 传入一个 button 组件实现对应的效果


      List({ space: 10 }) {
        ForEach(this.tasks, (item: Task, index: number) => {
            ListItem() {
              // ListItem 的内容需要自行填充
              // ...
            }
            .swipeAction({ end: this.DeleteButton(index)})

        }, (item: Task) => JSON.stringify(item))
      }

  @Builder DeleteButton(index: number) {
    Button({ stateEffect: true }) {
      Image($r("app.media.delete"))
        .fillColor(0xffffff)
        .width(20)
    }
    .width(40)
    .height(40)
    .type(ButtonType.Circle)
    .backgroundColor(Color.Red)
    .margin(5)
    .onClick(() => {
      this.tasks.splice(index, 1);
      this.handleTaskChange();
    })
  }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang学习之路一开山篇

Golang学习之路一开山篇 初识 Golang 我第一次接触 Golang 是在2016年, 当时在深圳工作, 项目需要用Golang, 当时在犹豫要不要学还是走, 毕竟Java开发搞了很多年了, 说放弃还是有难度的, 其实也不是放弃Java, 说不定其他项目还是要使用Java. 在领导的再三劝说下, 开启了Golan…

vue中哪些数组的方法可以做到响应式

Vue2 中为什么直接通过数组的索引修改元素是不会触发视图更新 vue2 为什么不直接监听数组 Vue2 对于数组提供了一些变异方法 重写数组方法源码分析 定义拦截器将拦截器挂载到数组上面收集依赖 扩展&#xff1a;理解Vue2如何解决数组和对象的响应式问题 对复杂对象的处理 复杂对…

2023,真人漫改走上IP高地

你能接受自己的纸片人老公/老婆变成了真人吗&#xff1f; 无论大家能不能接受&#xff0c;真人漫改都已经成为了影视行业的新趋势&#xff0c;而阅文集团收购腾讯动漫的举措&#xff0c;无疑是为漫改剧添了一把火。 在阅文宣布以6亿人民币的价格收购腾讯动漫旗下的相关业务以…

scipy.signal.hilbert和scipy.fftpack.hilbert的区别

提示&#xff1a;分析scipy.signal.hilbert和scipy.fftpack.hilbert在应用的区别 一、代码 import matplotlib import matplotlib.pyplot as plt import numpy as np from pyhht import EMD from scipy.signal import hilbert import tftb.processing from scipy import signa…

【Linux】Redis 数据库安装教程(Ubuntu 22.04)

前言 Redis是一个开源的内存数据库&#xff0c;它可以用作键值存储、缓存和消息代理。它支持各种数据结构&#xff0c;包括字符串、哈希、列表、集合、有序集合等。Redis通常被用于构建高性能、可扩展的应用程序&#xff0c;特别是那些需要快速访问数据和实时数据处理的应用场…

Windows 11上边两个空格导致我多熬了1个多小时

将图中的文件路径复制&#xff0c;然后到文件管理器里边去搜索。 发现找不到&#xff0c;可是明明就在这里啊。 我百思不得其解&#xff0c;还以为是IDEA出了问题&#xff0c;我只能是重新启动项目&#xff0c;结果还是告诉我找不到文件。 要是同一个目录下已经有一个名为a…

Gateway No servers available for service

springCloud集成网关测试报错找不到服务&#xff0c;如下 造成这种错误可能是下面两种原因 1、nacos注册的服务不在一个命名空间内&#xff0c;导致找不到服务503 spring cloud:nacos:discovery:server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848file-extensio…

如何测试和挑选 2024 年最佳 Mac 数据恢复软件

数据是无价的。有些具有货币价值&#xff0c;例如您的银行帐户详细信息或官方文件。其他的则具有情感价值且不可替代&#xff0c;例如家庭照片。所有这些都存储在您的硬盘中&#xff0c;任何事情都可能出错。它可能会遇到技术错误&#xff0c;例如恶意软件攻击或驱动器故障&…

WeChatMsg: 导出微信聊天记录 | 开源日报 No.108

Mozilla-Ocho/llamafile Stars: 3.5k License: NOASSERTION llamafile 是一个开源项目&#xff0c;旨在通过将 lama.cpp 与 Cosmopolitan Libc 结合成一个框架&#xff0c;将 LLM (Large Language Models) 的复杂性折叠到单个文件可执行程序中&#xff0c;并使其能够在大多数…

Axure动态面板的应用与ERP系统登录界面、主页左侧菜单栏、公告栏的绘制

目录 一、动态面板 1.1 简介 1.2 使用动态面板的原因 二、动态面板之轮播图实现案例 2.1 完成步骤 2.2 最终效果 三、动态面版之多方式登录案例 四、动态面板之后台主界面左侧菜单栏 五、ERP登录界面 六、ERP主界面菜单栏 七、ERP公告栏 八、登录页面跳转公告栏 一…

数据结构 | Log-Structured Merge Tree (LSM Tree)

今天介绍LSM Tree这个数据结构&#xff0c;严格意义上来说&#xff0c;他并不像他的名字一样是一棵树型的数据结构&#xff0c;而更多是一种设计思想。 LSM Tree最先在1996年被提出&#xff0c;后来被广泛运用于现代NoSQL&#xff08;非关系型数据库&#xff09;系统中&#xf…

25 redis 中 cluster 集群的工作模式

前言 我们这里首先来看 redis 这边实现比较复杂的 cluster集群模式 整个 cluster集群 中会包含多对 MasterSlave 的组合, 然后这多对 MasterSlave 来分解 16384 个 slot 然后 客户端这边 set, get 的时候, 先根据 key 计算对应存储的 slot, 然后 服务器这边响应 MOVED 目标…

Python自动化测试如何自动生成测试用例?

汽车软件开发自动化测试攻略 随着软件开发在造车行业中占有越来越重要的地位&#xff0c;敏捷开发的思想在造车领域中也逐渐地被重视起来&#xff0c;随之而来的是整车厂对自动化测试需求越来越强烈。本文结合北汇在自动化测试方面的丰富经验&#xff0c;简单介绍一下实施自动…

VR虚拟仿真技术应用到外事警察岗位技能培训的场景及优势

VR治安民警常态化工作实战教学演练是一种利用VR虚拟现实制作和web3d开发技术进行治安民警培训和实战演练的新型教学模式。相较于传统的培训方式&#xff0c;VR治安民警常态化工作实战教学演练具有以下优点&#xff1a; VR实战是一种完全虚拟的实战训练方式&#xff0c;他可以根…

娱乐新拐点:TikTok如何改变我们的日常生活?

在数字时代的浪潮中&#xff0c;社交媒体平台不断涌现&#xff0c;其中TikTok以其独特的短视频内容在全球范围内掀起了一场娱乐革命。本文将深入探讨TikTok如何改变我们的日常生活&#xff0c;从社交互动、文化传播到个人创意表达&#xff0c;逐步改写了娱乐的新篇章。 短视频潮…

k8s节点not ready

开发小伙伴反应&#xff0c;发布应用失败。检查后发现有个虚拟机挂掉了 启动后先重启服务&#xff1a;&#xff08;一般是自启动&#xff0c;自动拉起pod服务&#xff09; service docker restart docker ps |grep kube-apiserver|grep -v pause|awk ‘{print $1}’|xargs -i …

三、Spring IoC 容器和核心概念

本章概要 组件和组件管理概念 什么是组件&#xff1f;我们的期待Spring充当组件管理角色&#xff08;IoC&#xff09;组件交给Spring管理优势 Spring IoC 容器和容器实现 普通和复杂容器SpringIoC 容器介绍SpringIoC 容器具体接口和实现类SpringIoC 容器管理配置方式 Spring I…

Android APP 常见概念与 adb 命令

adb 的概念 adb 即 Android Debug Bridge 。在窗口输入 adb 即可显示帮助文档。adb 实际上就是在后台开启一个 server&#xff0c;会接收 adb 的命令然后帮助管理&#xff0c;控制&#xff0c;查看设备的状态、信息等&#xff0c;是开发、测试 Android 相关程序的最常用手段。…

CVE-2023-50164 Apache Struts2漏洞复现

CVE-2023-50164 简介&#xff1a; 从本质上讲&#xff0c;该漏洞允许攻击者利用 Apache Struts 文件上传系统中的缺陷。它允许他们操纵文件上传参数并执行路径遍历。这种利用可能会导致在服务器上执行任意代码&#xff0c;从而导致各种后果&#xff0c;例如未经授权的数据访问…

微信小程序---使用npm包安装Vant组件库

在小程序项目中&#xff0c;安装Vant 组件库主要分为如下3步: 注意&#xff1a;如果你的文件中不存在pakage.json&#xff0c;请初始化一下包管理器 npm init -y 1.通过 npm 安装(建议指定版本为1.3.3&#xff09; 通过npm npm i vant/weapp1.3.3 -S --production 通过y…