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: stringisChecked: 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, // 通知IDslotType: 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();})}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go delve调试工具的简单应用

Delve是个啥 Delve is a debugger for the Go programming language. The goal of the project is to provide a simple, full featured debugging tool for Go. Delve should be easy to invoke and easy to use. Chances are if you’re using a debugger, things aren’t go…

BearPi Std 板从入门到放弃 - 先天神魂篇(7)(RT-Thread 定时器-软件定时器)

简介 RT-Thread 软件定时器的简单使用步骤 创建项目 参考 BearPi RT-Thread项目创建 定时器管理接口 定时器时钟节拍 定时器管理相关函数 定时器类型 #define RT_TIMER_FLAG_ONE_SHOT 0x0 //一次性计时器 #define RT_TIMER_FLAG_PERIODIC 0x2 // 周期性定时器 #…

Echarts 热力图与折线图的结合

热力图与折线图结合使用(文末含源码) 这种需求并不多见&#xff0c;遇到后第一时间翻看了Echars官方文档&#xff0c;并没有发现类似的例子。于是自己动手合并了双轴&#xff0c;后发现折线图会被遮盖。经过排查发现了一个关键参数&#xff1a;visualMap的配置。这个配置在热力…

【答案】2023年国赛信息安全管理与评估第三阶段夺旗挑战CTF(网络安全渗透)

【答案】2023年国赛信息安全管理与评估第三阶段夺旗挑战CTF&#xff08;网络安全渗透&#xff09; 全国职业院校技能大赛高职组信息安全管理与评估 &#xff08;赛项&#xff09; 评分标准 第三阶段 夺旗挑战CTF&#xff08;网络安全渗透&#xff09; *竞赛项目赛题* 本文…

Kafka-Kafka基本原理与集群快速搭建(实践)

Kafka单机搭建 下载Kafka Apache Download Mirrors 解压 tar -zxvf kafka_2.12-3.4.0.tgz -C /usr/local/src/software/kafkakafka内部bin目录下有个内置的zookeeper(用于单机) 启动zookeeper&#xff08;在后台启动&#xff09; nohup bin/zookeeper-server-start.sh conf…

微信小程序ec-canvas(echarts)显示地图【以甘肃省为例】

文章目录 一、效果图二、实现1、下载echarts插件2、定制图形&#xff0c;生成 echarts.min.js 文件3、小程序中使用&#xff08;1&#xff09;下载甘肃地图&#xff08;2&#xff09;使用 参考文档《微信小程序使用echarts显示全国地图》《如何在微信小程序开发中使用echarts以…

山峰个数 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 给定一个数组,数组中的每个元素代表该位置的海拔高度。0表示平地,>=1时表示属于某个山峰,山峰的定义为当某个位置的左右海拔均小于自己的海拔时,该位置为山峰。数组起始位置计算时可只满足一边的条件。 …

【node】 地址标准化 解析手机号、姓名、行政区

地址标准化 解析手机号、姓名、行政区 实现效果链接源码 实现效果 将东光县科技园南路444号马晓姐13243214321 解析为 东光县科技园南路444号 13243214321 河北省;沧州市;东光县;东光镇 马晓姐 console.log(address, phone, divisions,name);链接 API概览 源码 https://gi…

node.js+postman+mongodb搭建测试注册接口的实现

准备工作 申请一个免费的MongoDB 到https://www.mlab.com注册申请一个500M的MongoDB数据库。登录后手动在创建Databases下的Collections中手动创建一个数据库node_app。 在个人首页点击Connect获取node.js连接MongoDB数据库的字符串为 1 mongodbsrv://<username>:<…

Elasticsearch的 8.x常用api汇总

ES的查询语法比较复杂,对于初学者需要在不断练习中才会逐渐掌握,本文汇总了ES各种查询语法以及常用api,可以作为新手的实用笔记 首先,安装 Kibana! 下载Elasticsearch,官方下载页面;Elasticsearch 参考,官方文档;<

读书笔记-《数据结构与算法》-摘要6[快速排序]

快速排序 核心&#xff1a;快排是一种采用分治思想的排序算法&#xff0c;大致分为三个步骤。 定基准——首先随机选择一个元素最为基准划分区——所有比基准小的元素置于基准左侧&#xff0c;比基准大的元素置于右侧递归调用——递归地调用此切分过程 快排的实现与『归并排…

STP笔记总结

STP --- 生成树协议 STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;是根据 IEEE802.1D标准建立的&#xff0c;用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路&#xff0c;并有选择地对某些端口进行阻…