鸿蒙应用开发,比 React 体验更好

痛点

一直以来,使用 HTML + CSS 来表达 UI 结构,都有一个若隐若现的痛点。痛点来源主要体现在 DOM 结构的语义表现力不足。

例如这样一段代码,我们能够很清晰的知道 DOM 结构是怎么样的,但是其具体的布局结构方式和特性就不知道了。

<div><div>1</div><div>2</div><div>3</div><div>4</div>
</div>

尽管 HTML 也新增了许多语义化标签来弥补这种语义表现力缺失的问题,但是由于大家的应用场景是在是很难和这些语义化标签非常契合的对应上,从而导致了语义化标签的使用并不是很广泛,到目前为止,语义化标签都处于一个很尴尬的境地

<div><header></header><nav></nav><section></section><footer></footer>
</div>

导致语义化标签被广大开发者冷淡的很大一部分原因,是因为 HTML 设计的这几个语义化标签确实是不太匹配日常开发的大多数具体场景。

好在我们在使用 React/Vue/Angular 开发项目时,可以通过自定义组件来增强某一个部分的语义表达

例如在 React 中,我们编写一个分页列表,你一眼就能看出来我的页面结构长什么样

<RefreshScrollView><Filter /><Pagination />
</RefreshScrollView>

这已经是 UI 表述的最佳实践。但是我们也不是只看最外面这一层,当你深入到更底层的逻辑时,最后看到的还是 div,语义表现力不足的事实总是存在的

因此为了解决这个问题,在 antd 等优秀的开源框架中,为了增强组件的语义表现力,会提供 Row Cloumn Flex Grid 等容器组件供开发者使用。

这其实是 UI 表达的最佳实践。但是 antd 等框架对于这种思路的践行并不是非常彻底。他没有非常明确的建议说,我们不要使用 div 了,所以许多开发者就算使用了这种方式,也不是把它当成最佳实践来使用,很多时候只是为了少些两行 css 代码才使用他们。

很多时候也源自于 UI 组件库本身也没有想要去做一个大而全的布局思维重构,从而导致 antd 虽然提出了这个方向和构思,但是普通开发者也不一定能领会到。

HTML + CSS 语义表现力缺失还体现在结构和样式分离。有很大一部分开发者并不喜欢写完结构之后,还要重新去另外的文件给他补充样式。并且这样方式在维护的时候也并不友好,隐性的规则让样式的最终结果变得扑朔迷离。

最明显的一点就是默认的样式继承规则和样式优先级,这东西让许多人在调样式的时候非常难受

所以很多后端来写前端,可能他什么都能搞定,就是搞不定 css 样式,这可太难了,哈哈哈哈。

许多开发者都意识到了这种痛点。因此 css in js 的方案层出不穷。原子 css 又再次重新火了起来。不过在根源上由于 HTML 文档流的设计不够简洁,视觉格式化模型中涉及到的概念太多,因此最终在使用上依然会有不小的理解成本与麻烦。

例如大家在使用原子化 css 的时候,很容易会出现一个元素上套用了太多 class 的情况,反而导致可读性极大的降低

<!--随意搞的一个简易案例来说明这个问题-->
<buttonclass="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600 text-sm text-white font-mono font-light py-2 px-4 border-2 rounded border-blue-200"
>Button
</button>

因此我们需要思考新的方案来解决这种场景,例如使用一个变量名来复用这些样式

const btn = 'blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600 text-sm text-white font-mono font-light py-2 px-4 border-2 rounded border-blue-200'<button class={'btn'}>Button
</button>

这些理念都非常好。但是原子化 CSS 毕竟不是直接编写样式,他的适用场景会受到很大的限制。

并且当我们在思考如何复用原子化 CSS 的时候,其实就表示,开发者确实在期待一套完整的,全新的 UI 布局表述方式。

这就是鸿蒙应用开发中, ArkUI 的布局思路。

在设计上,arkUI 充分吸收了 HTML 等客户端方案发展这么多年的经验教训,在设计上完全摒弃了文档流的概念,转而强调容器的概念。为了应对不同的场景,arkUI 目前已经支持了 26 种容器组件。因为其明确的语义化,学习成本也非常低,例如如下容器组件,我们一看就能知道这是用来干嘛的

Row
Column
Flex
Grid
List
Scroll
Swiper
Tabs
Refresh
...

并且布局方式到底是什么情况,由容器组件说了算,而不是子元素的类型说了算。

// 表示从左到右布局
Row() {Text('hello world')Text('hello world')Text('hello world')
}

// 表示从上到下布局
Column() {Text('hello world')Text('hello world')Text('hello world')
}

除了在语义化上非常重视之外,arkUI 并不支持结构与样式分离,而是把设置样式的行为当成一个 set 方法,支持一种链式调用的方式来做到样式与结构合并的最终结果

Text('width: 10px').fontSize('12fp').color('#333').border({width: '10px',color: Color.Red,style: BorderStyle.Dotted,radius: 15})

这其实是原子化 css 的进化版。如果你觉得原子化 CSS 真香,那么这种方式的好处你也一定能够快速理解到。

而且他比原子化 CSS 学习和记忆成本更低,更灵活,可以说是原子化 CSS 的理想化实现。

ArkUI 在设计上,还引入了一个风险较大的设定:样式后置。

这个最开始是在 Swift UI 中出现,可能许多前端开发都没见过

Column() {Text('hello text').fontSize('12fp').fontColor(Color.Black).fontStyle(FontStyle.Italic)
}
.width(20)
.height(20)
.border({width: 10,color: Color.Blue
})

之所以说他风大,是因为这种书写方式大家都没见过,可能会容易给人的第一感觉就是:什么玩意儿 …

哪怕是在 Flutter 的设计中,也是可前置可后置,然后不管是文档案例,还是大家在开发中,其实也是让样式前置

// 伪代码
Widget build(BuildContext context) {return new Container(width: 20,height: 20,...child: new Text())
}

我刚开始在学习 Swift 使用的时候也会担心这种样式后置的方式会让样式堆在一起比较难受,但是用了一段时间之后发现,真香!

我们来看一下这样一段代码。

Column() {Text(`最新值:${this.counter}`)Column().block()Column().block()Column().block().onClick(() => {this.counter ++})
}
.margin(10)
.border({width: 4})
.width('50%')
.height('400lpx')
.justifyContent(FlexAlign.SpaceEvenly)

.block 是样式的复用。

@Extend(Column) function block() {.width(40).height(40).backgroundColor(Color.Orange).border({width: 2,color: Color.Red})
}

之所以我觉得真香的原因是因为我们在开发过程中,其实子元素的样式重复非常多,因此我们会考虑将子元素的样式封装起来,用一些方式来复用它

这样,当我们将样式后置之后,虽然我们依然对父元素添加了一串样式,但是前面一部分的代码结构就依然非常简洁。

以前在刚开始接触学习 Flutter 的时候,也觉得 Flutter 的 UI 表现形式太糟糕太复杂了,为什么不学着 JSX 那样搞简单一点,并且其他人的这个类似想法还在 github 上有非常激烈的探讨。

直到后来我才理解到,这种注重语义化和容器的 UI 表达方式,可能比 JSX 更好,这才是最佳实践。

除此之外,这种声明式语法的编译速度会比 JSX 更快,性能上会更好

2 总结

鸿蒙应用开发的 ArkUI,和基于 HTML + CSS 的 React 相比,能够更方便的使用语义化,提倡样式与结构合并,并在 UI 设计上,简化了视觉格式化模型,注重容器特性,学习理解成本得到了极大的降低,并且基于 set 的思维方式链式调用样式,大胆的将样式后置,在我个人的主观感受里,这是一种比 React,比 Flutter 更舒适的开发体验

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (OpenHarmony)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门?:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

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

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

相关文章

Redis面试题关于持久化的问题

什么是Redis持久化&#xff1f;Redis有哪几种持久化方式&#xff1f;优缺点是什么&#xff1f; 持久化就是把内存的数据写到磁盘中去&#xff0c;防止服务宕机了内存数据丢失。 Redis 提供了两种持久化方式:RDB&#xff08;默认&#xff09; 和AOF RDB&#xff1a; rdb是Red…

五种多目标优化算法(MOJS、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOJS 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

域名 SSL 证书信息解析 API 数据接口

域名 SSL 证书信息解析 API 数据接口 网络工具&#xff0c;提供域名 SSL 证书信息解析&#xff0c;多信息查询&#xff0c;毫秒级响应。 1. 产品功能 提供域名 SSL 证书信息解析&#xff1b;最完整 SSL 属性信息解析&#xff1b;支持多种元素信息抽取&#xff0c;包括主题的可…

Sample Pairing(ICLR 2018)

paper&#xff1a;Data Augmentation by Pairing Samples for Images Classification 本文的创新点 本文提出了一种新的应用于图像分类的数据增强方法SamplePairing&#xff0c;这种简单的数据增强技术显著提高了所有测试的数据集的分类精度。此外当训练集中的样本数量非常少…

Web前端3D JS框架和库 整理

在WebGL库和SVG/Canvas元素的支持下&#xff0c;JavaScript变得惊人的强大。几乎可以为网络构建任何东西&#xff0c;包括基于浏览器的游戏和本地应用&#xff0c;许多最新的突破性功能都在3D上运行。 为此&#xff0c;「数维图小编」整理了19个交互式3D Javascript库和框架&am…

NestJS入门6:日志中间件

前文参考&#xff1a; NestJS入门1 NestJS入门2&#xff1a;创建模块 NestJS入门3&#xff1a;不同请求方式前后端写法 NestJS入门4&#xff1a;MySQL typeorm 增删改查 NestJS入门5&#xff1a;加入Swagger 1. 安装 nest g middleware logger middleware​ ​ ​ 2. lo…

关于发送邮件时Reply Reply All和Forward的区别

我们发送邮件的时候总是会纠结到底是用回复&#xff0c;还是回复全部&#xff0c;还是转发。 回复- 仅回复发件人。 全部回复- 回复发件人和抄送/密件抄送的联系人。 转发- 将电子邮件的副本发送给其他收件人。 这几种情形分别在什么时候用呢&#xff1f; 回复 比如Alen给你…

阿里云带宽

&#x1f4d1;前言 本文主要是如何将阿里云服务器迁移实现数据转移的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️** &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

golang入门介绍-1

今天开始发布关于go语言入门到实战内容&#xff0c;各位小伙伴准备好。 go介绍 Go语言&#xff08;或 Golang&#xff09;起源于 2007 年&#xff0c;并在 2009 年正式对外发布。是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。 Go 是…

YOLOv5 + Flask + Vue实现基于深度学习算法的垃圾检测系统源码+数据库

✨界面展示 登录 注册 垃圾检测 用户管理 404 Not Found页面 403 拒绝访问页面 黑暗模式 深蓝模式 灰色模式 色弱模式 ✨技术特性 深度学习 YOLOv5&#x1f680;&#xff1a;高效、准确的目标检测算法&#xff0c;实时识别检测图像和视频中的各种对象PyTorch&#xff1a;机器…

【centos】【vsftpd】本地用户登录配置

目录 安装vsftpd和ftp本地用户登录-不限制访问目录本地用户登录-限制访问目录有可能影响连接的问题pam认证selinux策略被动模式防火墙ipv4和ipv6 报错1、 530 Login incorrect2、500 OOPS: vsftpd: refusing to run with writable root inside chroot()3、227 Entering Passive…

Avue实现批量删除等功能(附Demo)

目录 前言1. 公共逻辑2. 单个删除3. 批量删除 前言 由于近期慢慢转全栈&#xff0c;后续会以前后端的形式讲解 对应的Avue相关知识推荐阅读&#xff1a;【vue】avue-crud表单属性配置&#xff08;表格以及列&#xff09;对应后端知识推荐阅读&#xff1a;java框架 零基础从入…

Leetcode刷题笔记题解(C++):83. 删除排序链表中的重复元素

思路&#xff1a;链表相关的问题建议就是画图去解决&#xff0c;虽然理解起来很容易&#xff0c;但就是写代码写不出来有时候&#xff0c;依次去遍历第二节点如果与前一个节点相等则跳过&#xff0c;不相等则遍历第三个节点 /*** Definition for singly-linked list.* struct …

顺序表漫谈

目录 ​编辑 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 1.顺序表的动态存储 2.顺序表初始化 3.顺序表销毁 4.顺序表增容 5.顺序表头插 6.顺序表尾插 7.顺序表头删 8.顺序表尾删 9.顺序表打印 10.顺序表在任意下标位置插入数据 11.顺序表删除任意下标位置的值…

C++11多线程: mutex(互斥元)

文章目录 mutex(互斥元)案例 1案例2 lock_guard()案例2的优化 由C标准提供的保护共享数据的最基本机制是&#xff1a;互斥元 (mutex 全称为: mutual exclusive&#xff09; 在访问共享数据前&#xff0c; 锁定&#xff08; lock&#xff09;与该数据相关的互斥元&#xff0c…

Aspose.Words For JAVA 动态制作多维度表格(涵2024最新无水印包)

全网最全Aspose.Words For JAVA 高级使用教程: CSDNhttps://blog.csdn.net/LiHaoHang6/article/details/133989664?spm1001.2014.3001.5501 运行截图&#xff1a; 所谓多维度表格通常包含多个维度, 每个维度都代表一种数据属性,多维度表格可以用于数据分析&#xff0c;通过不…

【洛谷 P8780】[蓝桥杯 2022 省 B] 刷题统计 题解(贪心算法+模拟+四则运算)

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目&#xff0c;周六和周日每天做 b b b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业

文章目录 强烈推荐前言什么是OpenAI Sora&#xff1f;工作原理&#xff1a;算法原理&#xff1a;应用场景展望与其他视频生成模型相比有哪些优势和不足&#xff1f;优点缺点 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易…

数据仓库概念梳理

数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Support&#xff09;。 数据仓库是分析…