第七篇【传奇开心果系列】鸿蒙开发技术点案例示例:ArkUI声明式UI编程思想

传奇开心果博文系列

  • 系列博文目录
    • 鸿蒙开发技术点案例示例系列
  • 博文目录
    • 一、前言
    • 二、ArkUI声明式UI编程思想介绍
    • 三、以官方示例helloworld解读声明式编程
    • 四、以官方示例helloworld解读组件化开发
    • 五、以官方示例helloworld解读组件可定制
    • 六、用示例解读响应式布局
    • 七、以官方helloworld示例代码为例解读组件的动态更新
    • 八、以官方示例helloworld为例解读生态整合

系列博文目录

鸿蒙开发技术点案例示例系列

博文目录

一、前言

在这里插入图片描述ArkUI是一个基于ArkTS的声明式UI组件库,它提供了一系列可复用的UI组件,用于灵活高效美观地构建Web应用程序的用户界面。ArkUI声明式UI编程思想是鸿蒙开发重要编程思想。也是当前官方推荐的鸿蒙开发编程风格。

二、ArkUI声明式UI编程思想介绍

在这里插入图片描述下面是ArkUI声明式UI编程思想主要内容:

  1. 声明式编程:ArkUI采用声明式编程风格,通过组合和配置组件来描述用户界面。开发者只需要声明所需的UI组件及其属性,而无需直接操作DOM或编写大量的JavaScript代码。

  2. 组件化开发:ArkUI以组件为基本单位,将界面拆分为独立的、可复用的组件。每个组件都有自己的状态和属性,并通过事件和数据流进行交互。开发者可以根据需要自由组合和嵌套组件,以构建复杂的用户界面。

  3. 组件可定制:ArkUI的组件提供了丰富的属性和样式选项,使开发者可以根据具体需求对组件进行定制。开发者可以通过属性传递数据和配置,以及通过样式设置来调整组件的外观和行为。

  4. 响应式布局:ArkUI支持响应式布局,可以根据不同的屏幕尺寸和设备类型自动调整布局和样式。开发者可以使用媒体查询断点或响应式断点来定义不同屏幕尺寸下的布局规则。

  5. 动态更新:ArkUI的组件通过状态管理和数据流来实现动态更新。当组件的状态或属性发生变化时,组件会自动重新渲染,以反映最新的数据和配置。

  6. 生态整合:ArkUI与ArkTS框架紧密结合,充分利用ArkTS提供的强类型检查和编译时优化。同时,ArkUI也可以与其他流行的前端工具和框架集成,如Webpack、Babel等。

总之,ArkUI作为一个声明式UI组件库,提供了一种简洁、可复用的方式来构建Web应用程序的用户界面。它的组件化开发、高度可定制、响应式布局等特性使得开发者能够更加便捷地开发出具有良好用户体验的应用程序。

三、以官方示例helloworld解读声明式编程

在这里插入图片描述下面我就以官方示例代码为例说明声明式编程。
1.官方示例代码

//装饰器,指页面入口。
@Entry
//装饰器,指下面开始自定义组件
@Component
//自定义组件
struct Index {
//装饰器,指状态变量,字符串类型,赋值:"Hello World'
@State message: string = "Hello World";

//构造函数,UI声明
build() {
//横向布局组件
Row() {
//嵌套纵向布局组件
Column() {
//文本组件,参数
Text(this.message)
//设置字号
.fontSize(50)
//设置字体粗细
.fontWeight(FontWeight.Bold)
}
//设置页面宽度占比百分比
.width('100%')
}
//设置页面高度占比百分比
.height('100%')
}
}

2.解读声明式编程
以上代码是一个使用ArkTS进行声明式编程的示例,下面逐行解释其含义:

  1. @Entry装饰器:声明该页面为小程序的入口页面。

  2. @Component装饰器:声明下面开始定义一个自定义组件。

  3. struct Index:struct声明自定义了一个名为Index的自定义组件。

  4. @State message: string = "Hello World";:使用@State装饰器声明了一个状态变量message,类型为字符串,并赋初值为"Hello World"。

  5. build():构造函数,用于声明UI结构和布局。

  6. Row():使用Row()函数声明创建一个横向布局的组件。

  7. Column():在Row()中嵌套使用Column()函数声明创建一个纵向布局的组件。

  8. Text(this.message):在Column()中使用Text()函数声明创建一个文本组件,文本内容为message变量的值。

  9. .fontSize(50):使用.fontSize()方法声明设置文本的字号为50。

  10. .fontWeight(FontWeight.Bold):使用.fontWeight()方法声明设置文本的字体粗细为粗体。

  11. .width('100%'):使用.width()方法声明设置组件的宽度占整个页面的百分比为100%。

  12. .height('100%'):使用.height()方法声明设置组件的高度占整个页面的百分比为100%。

以上代码通过装饰器、函数和方法的方式,使用ArkTS进行声明式编程。通过组合和配置不同的组件,以及设置其属性和样式,来构建页面的UI布局。通过声明变量的方式,实现了状态的管理和数据绑定。整个代码结构清晰,易于理解和维护。

四、以官方示例helloworld解读组件化开发

在这里插入图片描述以上示例代码展示了组件化开发的基本思想和实践方式。下面逐行解释其含义并说明组件化开发的相关概念:

  1. @Component装饰器:表示下面开始定义一个自定义组件。

  2. struct Index:定义了一个名为Index的自定义组件。

  3. @State message: string = "Hello World";:使用@State装饰器声明了一个状态变量message,类型为字符串,并赋初值为"Hello World"。这个状态变量可以在组件内部使用,并随着组件的渲染和交互而更新。

  4. build():构造函数,用于声明UI结构和布局。在这里,通过嵌套使用Row()Column()函数创建了一个横向布局组件,并在其中嵌套了一个纵向布局组件。

  5. Text(this.message):在纵向布局组件中使用Text()函数创建了一个文本组件,并将message变量的值作为文本内容。这样,文本组件会根据message的值进行渲染。

  6. .fontSize(50):使用.fontSize()方法设置文本的字号为50。这是对文本组件的样式进行定制的一种方式。

  7. .fontWeight(FontWeight.Bold):使用.fontWeight()方法设置文本的字体粗细为粗体。同样,这是对文本组件的样式进行定制的一种方式。

  8. .width('100%'):使用.width()方法设置组件的宽度占整个页面的百分比为100%。这是对布局组件的样式进行定制的一种方式。

  9. .height('100%'):使用.height()方法设置组件的高度占整个页面的百分比为100%。同样,这是对布局组件的样式进行定制的一种方式。

以上代码展示了组件化开发的核心思想:将页面拆分为独立的、可复用的组件,并通过嵌套和组合这些组件来构建复杂的用户界面。每个组件都有自己的状态和属性,通过声明和操作这些状态和属性,以及定义组件的UI结构和样式,来实现组件的功能和外观。通过组件化开发,可以提高代码的可维护性、重用性和扩展性,使开发过程更加模块化和灵活。

五、以官方示例helloworld解读组件可定制

在这里插入图片描述以上示例代码展示了如何通过设置组件的属性来进行定制。下面以该示例代码为例,说明组件的可定制性:

  1. @State message: string = "Hello World";:通过声明状态变量message,可以在使用该组件时传入不同的文本内容。这样,每次使用该组件时,可以根据需要定制文本内容,使其显示不同的信息。

  2. .fontSize(50):通过设置文本的字号为50,可以定制文本的大小。如果需要调整字号,只需修改该属性的值即可。

  3. .fontWeight(FontWeight.Bold):通过设置文本的字体粗细为粗体,可以定制文本的粗细程度。如果需要调整字体粗细,只需修改该属性的值即可。

  4. .width('100%'):通过设置组件的宽度占整个页面的百分比为100%,可以定制组件的宽度。如果需要调整组件的宽度,只需修改该属性的值即可。

  5. .height('100%'):通过设置组件的高度占整个页面的百分比为100%,可以定制组件的高度。如果需要调整组件的高度,只需修改该属性的值即可。

通过修改这些属性的值,可以实现对组件的定制。例如,可以将message的值修改为其他文本内容,调整字号、字体粗细、宽度和高度的值,以满足不同的需求和设计要求。

此外,还可以通过添加其他属性、样式和事件处理等来进一步定制组件。例如,可以添加背景颜色、边框样式、动画效果等,以及为组件添加点击事件等交互行为。

总之,以上示例代码展示了组件的可定制性。通过修改组件的属性和样式,以及添加相应的事件处理,可以根据具体需求和设计要求来定制组件的外观和行为,实现灵活的组件化开发。

六、用示例解读响应式布局

在这里插入图片描述以下是两个示例代码,分别展示了使用媒体查询和弹性布局来实现响应式布局的方法:

  1. 使用媒体查询:
<style>
    .container {
        width: 100%;
        height: 300px;
        background-color: #f2f2f2;
    }
    
    @media (max-width: 768px) {
        .container {
            height: 200px;
        }
    }
</style>

<div class="container">
    响应式容器
</div>

在上述示例中,.container类表示一个容器元素,设置了宽度为100%、高度为300px,并且有一个背景颜色。通过媒体查询@media,当屏幕宽度小于等于768px时,将容器的高度调整为200px。这样,在较小的屏幕上,容器的高度会相应地进行调整。

  1. 使用弹性布局:
<style>
    .container {
        display: flex;
        flex-direction: row;
    }

    .item {
        flex: 1;
        padding: 10px;
        background-color: #f2f2f2;
    }

    @media (max-width: 768px) {
        .container {
            flex-direction: column;
        }
    }
</style>

<div class="container">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

在上述示例中,.container类表示一个容器元素,使用了弹性布局模型(Flexbox)。通过设置display: flex,容器的子元素会自动在水平方向上排列。子元素的.item类设置了相同的弹性属性flex: 1,使它们平均占据可用空间。

通过媒体查询@media,当屏幕宽度小于等于768px时,将容器的flex-direction属性设置为column,子元素会自动垂直排列,以适应较小的屏幕。

这两个示例展示了使用媒体查询和弹性布局来实现响应式布局的方法。你可以根据具体的需求和设计要求,调整媒体查询的条件和样式规则,或者修改弹性布局的属性,以实现你所需的响应式效果。
3. 使用栅格系统:

<style>
    .container {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        grid-gap: 10px;
    }

    .item {
        padding: 10px;
        background-color: #f2f2f2;
    }

    @media (max-width: 768px) {
        .container {
            grid-template-columns: repeat(2, 1fr);
        }
    }

    @media (max-width: 480px) {
        .container {
            grid-template-columns: 1fr;
        }
    }
</style>

<div class="container">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

在上述示例中,.container类表示一个容器元素,使用了栅格系统来划分列数。通过设置display: grid,容器内的子元素会按照网格布局排列。使用grid-template-columns属性来定义网格的列数和宽度,repeat(3, 1fr)表示重复3次,每个列宽度平均占据可用空间。

通过媒体查询@media,当屏幕宽度小于等于768px时,将网格的列数调整为2列,适应较小的屏幕。当屏幕宽度小于等于480px时,将网格的列数调整为1列,使项目在较小的屏幕上垂直排列。

通过调整栅格的列数和媒体查询的条件,可以实现不同屏幕尺寸下的响应式布局效果。

以上示例代码展示了使用栅格系统来实现响应式布局的方法。你可以根据具体的需求和设计要求,调整栅格的列数、间距以及媒体查询的条件,以实现你所需的响应式效果。
4. 使用CSS的@media规则:

<style>
    .container {
        width: 100%;
        height: 300px;
        background-color: #f2f2f2;
    }

    @media (max-width: 768px) {
        .container {
            height: 200px;
            background-color: #ccc;
        }
    }

    @media (max-width: 480px) {
        .container {
            height: 150px;
            background-color: #aaa;
        }
    }
</style>

<div class="container">
    响应式容器
</div>

在上述示例中,.container类表示一个容器元素,设置了宽度为100%、高度为300px,并且有一个背景颜色。

通过使用CSS的@media规则,根据不同屏幕尺寸应用不同的样式。当屏幕宽度小于等于768px时,使用媒体查询(max-width: 768px),将容器的高度调整为200px,并且修改背景颜色为灰色。当屏幕宽度小于等于480px时,使用媒体查询(max-width: 480px),将容器的高度调整为150px,并且修改背景颜色为浅灰色。

通过使用不同的媒体查询条件和样式规则,可以根据设备的屏幕尺寸来调整容器的高度和背景颜色,以实现响应式布局效果。

以上示例代码展示了使用CSS的@media规则来实现响应式布局的方法。你可以根据具体的需求和设计要求,调整媒体查询的条件和样式规则,以实现你所需的响应式效果。

七、以官方helloworld示例代码为例解读组件的动态更新

在这里插入图片描述以上代码展示了一个名为Index的自定义组件,其中包含了一个状态变量message和一个build()方法用于构建UI。

在这个示例中,组件的状态变量message被初始化为"Hello World"。在build()方法中,使用Row()和Column()组件进行横向和纵向布局,并嵌套了一个Text组件来显示message的内容。

如果想要实现组件动态更新,可以通过修改状态变量message的值来触发重新渲染。例如,可以在外部代码中通过调用setState()方法来更新message的值,然后组件会自动根据新的值重新渲染。

以下是示例代码演示如何更新组件的状态变量:

// 导入需要的模块
import { Entry, Component, State, Text, Row, Column } from 'arkts';

// 装饰器,指页面入口。
@Entry
// 装饰器,指下面开始自定义组件
@Component
// 自定义组件
struct Index {
    // 装饰器,指状态变量,字符串类型,赋值:"Hello World'
    @State message: string = "Hello World";

    // 构造函数,UI声明
    build() {
        // 横向布局组件
        Row() {
            // 嵌套纵向布局组件
            Column() {
                // 文本组件,参数
                Text(this.message)
                    // 设置字号
                    .fontSize(50)
                    // 设置字体粗细
                    .fontWeight(FontWeight.Bold);
            }
            // 设置页面宽度占比百分比
            .width('100%');
        }
        // 设置页面高度占比百分比
        .height('100%');
    }
}

// 创建Index组件实例
const index = new Index();

// 更新组件的状态变量message的值
index.message = "Hello LingWu";

// 调用build()方法重新渲染组件
index.build();

在上述代码中,首先导入了所需的模块,然后创建了Index组件的实例。接着,通过修改index.message的值为"Hello LingWu"来更新组件的状态变量。最后,调用index.build()方法来重新渲染组件,从而实现了组件的动态更新。

通过修改状态变量的值并重新渲染组件,可以实现组件的动态更新,以反映新的数据或状态。这样,当状态发生变化时,组件会根据新的值重新渲染,并展示更新后的内容。

八、以官方示例helloworld为例解读生态整合

在这里插入图片描述ArkUI与ArkTS框架的整合使得开发者能够充分利用ArkTS提供的强类型检查和编译时优化功能。ArkTS与TypeScript语言的整合,提供了一套用于构建用户界面的组件和工具,可以帮助开发者更高效地开发Web应用程序。

在示例代码中,我们可以看到通过使用import语句导入了ArkTS框架的一些核心模块,如EntryComponentStateTextRowColumn等。这些模块提供了创建组件、定义状态变量和构建用户界面的功能。

通过使用装饰器(Decorator),我们可以为组件类添加一些元数据,比如@Entry@Component@Entry装饰器指定了该组件为页面入口,而@Component装饰器指定了下面的代码段开始定义自定义组件。

在组件中,我们可以使用@State装饰器定义状态变量,这些状态变量可以在组件中进行读取和修改。在示例中,我们定义了一个名为message的状态变量,并将其初始化为"Hello World"。

通过build()方法,我们可以声明组件的UI结构。在示例中,我们使用了Row()Column()组件来实现横向和纵向布局,并嵌套了一个Text组件来展示message的内容。

除了ArkTS框架之外,示例还提到了可以与其他流行的前端工具和框架集成整合,如Webpack和Babel。这意味着开发者可以使用这些工具来进行代码打包、转译和优化等操作,以增强项目的开发和部署能力。
在这里插入图片描述

通过整合ArkUI和ArkTS框架,开发者可以充分利用框架提供的强类型检查和编译时优化功能,提高代码的可靠性和性能。同时,与其他前端工具和框架的集成整合也为开发者提供了更大的灵活性和选择性,以满足不同项目的需求和技术栈的偏好。

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

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

相关文章

金蝶云星空--写插件不重启IIS热更新简单配置指南

云星空7.5版本&#xff0c;以简单方式配置并测试了热更新的实现方式可行&#xff0c;操作如下&#xff08;7.5外版本没试过&#xff0c;大家可试下&#xff09;&#xff1a; 1、打开WebSite\App_Data\Common.config&#xff0c;修改appSettings&#xff0c;设置IsEnablePlugIn…

InforSuiteAS中创中间件windows环境部署

版本&#xff1a;InforSuiteAS_StE_V10.0.5.2.1 环境要求&#xff1a;Java环境 DK1.8版本&#xff0c; 内存2GB或以上 &#xff0c; 硬盘空间 10GB或以上&#xff0c; 监视器 图形界面安装需要256色以上&#xff0c;字符界面安装没有色彩要求 &#xff0c;浏览器 Microsoft …

Github 2024-01-27 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-27统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目3Jupyter Notebook项目2非开发语言项目2JavaScript项目1Go项目1Rust项目1Shell项目1 Papers We Lo…

LeetCode.42. 接雨水

题目 题目链接 分析 读完本题以及结合题目给出的图我们可以很直观的看到&#xff0c;这道题目是让我们求形成凹槽的面积。 我们可以针对每一个数字形成凹槽的面积进行计算&#xff0c;然后相加数组每一个数字形成凹槽的面积即可。 那么问题来了&#xff0c;怎么知道一个数…

【GPU】GPU CUDA 编程的基本原理是什么?

【GPU】GPU CUDA 编程的基本原理是什么? 作者&#xff1a;董鑫 想学好 CUDA 编程, 第一步就是要理解 GPU 的硬件结构, 说到底, CUDA 的作用就是最大程度压榨出 NVIDIA GPU 的计算资源. 想要从零理解起来, 还有有些难度. 这里希望能够用最简单的方式把一些最基本的内容讲清楚.…

03 Redis之命令(基本命令+Key命令)

Redis 根据命令所操作对象的不同&#xff0c;可以分为三大类&#xff1a;对 Redis 进行基础性操作的命令&#xff0c;对 Key 的操作命令&#xff0c;对 Value 的操作命令。 3.1 Redis 基本命令 首先通过 redis-cli 命令进入到 Redis 命令行客户端&#xff0c;然后再运行下面的…

【Linux 基础】常用基础指令(上)

文章目录 一、 创建新用户并设置密码二、ls指令ls指令基本概念ls指令的简写操作 三、pwd指令四、cd指令五、touch指令六、rm指令七、mkdir指令八、rmdir 指令 一、 创建新用户并设置密码 ls /home —— 查看存在多少用户 whoami —— 查看当前用户名 adduser 用户名 —— 创建新…

【Uni-App】Vuex在vue3版本中的使用与持久化

Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简而言之就是用来存数据&#xff0c;可以有效减少使用组件传参出现的问题。 基本元素&#xff1a;…

Java变量命名规则

目录 变量完整代码变量的声明变量的赋值变量的使用 变量的内存练习 分析 变量的作用域 变量 变量本质上就是代表一个”可操作的存储空间”&#xff0c;空间位置是确定的&#xff0c;但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”&#xff0c;从而操纵这…

青少年人工智能实验基地解决方案

1. 方案背景 1.1人工智能创新教育解决方案背景 人工智能已成为引领未来的新兴技术&#xff0c;中国将人工智能列为国家重点发展战略&#xff0c;对人工智能的发展做出了总体部署&#xff0c;全面加速人工智能在研发应用和人才培养的步伐。2021年1月教育部官网公布《关于政协十…

无状态应用管理Deployment

无状态应用管理Deployment 1、Deployment介绍 Deployment一般用于部署公司的无状态服务。 格式&#xff1a; apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx …

windows定时任务的查看、取消、启动和创建

一、查看 Windows 自动执行的指令 1.使用任务计划程序&#xff1a;任务计划程序是 Windows 内置的工具&#xff0c;可以用于创建、编辑和管理计划任务。您可以按照以下步骤查看已设置的计划任务&#xff1a; 1.1 按下 Win R 键&#xff0c;然后输入 “taskschd.msc”&#xff…

网络变压器的工作原理

Hqst华强盛导读&#xff1a;网络变压器是一种用于变换电压的电气设备&#xff0c;其工作原理基于电磁感应定律。网络变压器通常由两个或多个线圈和一个共同的铁芯组成。 当网络变压器的输入端施加一个交流电压时&#xff0c;主线圈中的电流会产生一个交变磁场。这个磁场会穿过铁…

1.26学习总结

连通性判断 DFS连通性判断步骤&#xff1a; 1.从图上任意一点u开始遍历&#xff0c;标记u已经走过 2.递归u的所有符合连通条件的邻居点 3.递归结束&#xff0c;找到了的所有与u的连通点&#xff0c;就是一个连通块 4.然后重复这个步骤找到所有的连通块 BFS连通性判断步骤…

SQL查询数据库环境(dm8达梦数据库)

SQL查询数据库环境dm8达梦数据库 环境介绍 环境介绍 某些环境没有图形化界面,可以使用sql语句查询达梦数据库环境情况 SELECT 实例名称 数据库选项,INSTANCE_NAME 数据库选项相关参数值 FROM V$INSTANCE UNION ALL SELECT 授权用户,(SELECT AUTHORIZED_CUSTOMER FROM V$LICE…

Kafka-服务端-PartitionStateMachine

PartitionStateMachine是Controller Leader用于维护分区状态的状态机。分区的状态是通过PartitionState接口定义的&#xff0c;它有四个子类分别代表了分区四种可能的状态&#xff0c;如表所示。 分区各个PartitionState之间的转换如图所示。 下面分析各个状态之间转换时&#…

梯度下降法、模拟训练、拟合二次曲线、最小二乘法、MSELoss、拟合:f(x)=ax^2+bx+c

本文目标&#xff1a; 以这个公式为例&#xff0c;设计一个算法&#xff0c;用梯度下降法来模拟训练过程&#xff0c;最终得出参数a,b,c 原理介绍 目标函数&#xff1a; 损失函数&#xff1a;&#xff0c;就是mse 损失函数展开&#xff1a; 损失函数对a,b,c求导数: 导数就是梯度…

JavaScript高级:闭包

1 概念 一个函数对周围状态的引用&#xff0c;捆绑在一起&#xff0c;内层函数中可以访问到外层函数的作用域。 简单理解&#xff1a;闭包 内层函数 外层函数的变量 先看个简单的代码&#xff1a; function outer() {let a 1function inner() {console.log(a)} } outer(…

tee漏洞学习-翻译-1:从任何上下文中获取 TrustZone 内核中的任意代码执行

原文&#xff1a;http://bits-please.blogspot.com/2015/03/getting-arbitrary-code-execution-in.html 目标是什么&#xff1f; 这将是一系列博客文章&#xff0c;详细介绍我发现的一系列漏洞&#xff0c;这些漏洞将使我们能够将任何用户的权限提升到所有用户的最高权限 - 在…

重磅!讯飞星火V3.5马上发布!AI写作、AI编程、AI绘画等功能全面提升!

讯飞星火大模型相信很多友友已经不陌生了&#xff0c;可以说是国内GPT相关领域的龙头标杆&#xff0c;而对于1月30日即将在讯飞星火发布会发出的V3.5新版本来说&#xff0c;讯飞星火V3.5与之前版本相比&#xff0c;性能提升方面相当明显&#xff0c;在提示语义理解、内容生成、…