当前位置:   article > 正文

HarmonyOS_hvigor版本

hvigor版本

1. 开发环境搭建和HelloWorld体验

  1. JavaScript 项目开发依赖 Node.js 环境,下载链接:

    Node.js: Node.js

  2. 鸿蒙系统专用 IDE 开发环境 「 DevEco Studio 」,下载链接:

DevEco Studio: HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者

HelloWorld

PS:在 Views 可以快速设置编辑器主题,以及对应的开发设置。

  • 第一步:启动应用后,提示是否创建启动程序脚本,方便后续模板选择。

  • 第二步:使用华为云 npm 包管理工具。

  • 第三步:创建 or 导入项目。

  • 第四步:选择项目类型及模板。

    为了满足应用在多设备上运行的开发需求,DevEco Studio 2.1 Release 在原有单设备工程模板的基础上,新增了 11 个跨设备工程模板。开发者可根据工程向导,依次挑选模板和设备类型,轻松创建跨设备工程,自动生成示例代码和相关资源。

  • 第五步:创建工程项目。

  • 第六步:查阅并关闭开发简易提示。

  • 第七步:项目自动下载对应的依赖及文件,这一步直接点击运行则会有错误提示。

  • 第八步:在 DevEco Studio 菜单栏,点击Tools > SDK Manager 配置对应的 SDK 版本。

  • 第九步:点击右上角 sign in 登陆华为账号,请输入已实名认证的华为帐号的用户名和密码进行登录,在网页中登陆成功后,完成授权。

  • 第十步:进入到 src/main/js/default/pages/index 页面,打开 view -> Tool Windows -> Previewer 进行预览。

  • 第十一步:进入 Tools -> Devices Manager 看到模拟器管理页面,这一步必须要实名认证的华为账号进行登录后,即可选择对应的设备,然后启动设备。

  • 第十二步:启动设备后,再次点击 绿色运行按钮,即可在仿真设备上运行该项目。

  • 应用开发目录结构及文件使用规则介绍

    1. 文件访问规则

      应用资源可通过绝对路径或相对路径的方式进行访问,本开发框架中绝对路径以 "/" 开头,相对路径以 "./" 或 "../" ,具体访问规则如下:

    • 引用代码文件,需使用相对路径,比如:../common/utils.js。

    • 引用资源文件,推荐使用绝对路径。比如:/common/xxx.png。

    • 公共代码文件和资源文件推荐放在 common 下,通过以上两条规则进行访问。

    • CSS 样式文件中通过 url() 函数创建 数据类型,如:url(/common/xxx.png)。

    • 如果代码文件A和文件B位于同一目录,则代码文件B引用资源文件时可使用相对路径,也可使用绝对路径。

    • 如果代码文件A和文件B位于不同目录,则代码文件B引用资源文件时必须使用绝对路径。因为Webpack打包时,代码文件B的目录会发生变化。

    1. 媒体文件格式
    格式支持版本支持的文件类型
    BMPAPI Version 3+.bmp
    JPEGAPI Version 3+.jpg
    PNGAPI Version 3+.png
    1. app.js 标签中包含了实例名称、页面路由信息。
    标签类型默认值必填描述
    namestringdefault标识JS实例的名字。
    pagesArray-路由信息,详见“pages”。

    name、pages 标签配置需在配置文件中的 js 标签中完成设置。pages 定义每个页面的路由信息,每个页面由页面路径和页面名组成,页面的文件名就是页面名。比如:

    {  ...  "pages": [    "pages/index/index",    "pages/detail/detail"  ]  ...}

    说明

    • 应用首页固定为 "pages/index/index"。
    • 页面文件名不能使用组件名称,比如:text.hml、button.hml 等。
    1. 每个应用可以在 app.js 自定义应用级生命周期的实现逻辑,包括:
    • onCreate:在应用生成时被调用的生命周期函数。
    • onDestory:在应用销毁时被调用的生命周期函数。

基础组件介绍及Chart组件使用

  1. 组件(Component)是构建页面的核心,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。组件之间相互独立,随取随用,也可以在需求相同的地方重复使用。

  2. 鸿蒙 JS API 提供了完善的组件介绍,详细情况我们去查阅一下官方文档: 组件 - 官方介绍

  3. 根据组件的功能,可以分为以下四大类:

组件类型主要组件
基础组件text、image、progress、rating、span、marquee、image-animatordivider、search、menu、chart
容器组件div、list、list-item、stack、swiper、tabs、tab-bar、tab-content、list-item-group、refresh、dialog
媒体组件video
画布组件canvas

(2)chart 组件体验使用

鸿蒙系统组件相较于其他前端组件仓库,给咱们专门封装了一个 chart 组件,图表组件,用于呈现线形图、柱状图、量规图界面。

官方文档地址

使用 chart 组件进行体验,具体执行步骤如下:

  1. 创建 pages.chart 文件夹,包含 chart.hml、chart.js、chart.css 三个文件。
  2. 配置路由,在 config.json 这个文件里面。

  1. 预览页面时,务必要注意打开当前需要预览的页面文件夹下 hml、css、js 任意一个文件。
  2. 切换页面进行预览,不需要重新启动预览器,直接点击右上角刷新按钮即可,出现错误提示。

  1. pages.chart 文件夹下面的 hml、css、js 文件必须命名为 index,否则的话会出现预览错误。

  1. 出现预览错误修改后,刷新无效,必须重新启动预览器才能正常显示,点击右侧收起再展开即可。

  1. 图片路径引用失败不会出现文件查找失败错误提示,建议使用绝对路径进行文件路径编码,官方文档介绍在输出 hap 文件后,真机会因为 webpack 打包解析出现找不到文件的问题,不过模拟器是正常的。

    PS:小窍门,绝对路径输入没有路径自动补全提示,可以使用「相对路径」选择到对应的文件,然后,在去掉前面的相对路径引入。

    当然,如果在同一个文件夹内部,官方文档介绍使用相对路径不会出现 webpack 打包解析找不到文件的问题,所以,在同一个文件夹内部引用,使用相对路径即可。

  2. ES6 Model 数据文件 import 导入只能使用相对路径,不能使用绝对路径,使用绝对路径会报错。

  1. 使用模拟器进行模拟的时候,编辑器工具会自动打包输出 hap 文件,模拟器直接加载运行该文件,模拟器不支持热更新,预览器预览会输出编译后文件,支持热更新,也支持多设备同时预览。

  1. 调整 chart 组件的相关参数,需要注意 xAxis 的 axisTick 参数设置过小,会出现数据丢失情况。

 使用image-animator组件构建多图帧动画

image-animator 图片帧动画播放器,多图帧动画的构建能力一直以来都是基于 Android 安卓系统使用 Java or C#语言进行开发的,而华为鸿蒙系统将「图片帧动画播放器」引入到了 JS 前端开发领域,这无疑是一次巨大的突破,这也代表着华为鸿蒙系统对其图片渲染能力的巨大自信。

「属性、事件、样式、方法」组件四要素,官方文档介绍

(2)image-animator 图片帧动画播放器实现

  1. 创建一个新的 Ablity ,新起一个抽象能力的应用服务,不同的 Ablity 之间可以通过 PA 进行调用。

    Ablity 是应用所具备能力的抽象,也是应用程序的重要组成部分。Ablity 由一个或多个 FA(Feature Ability)或 PA(Particle Ability)组成。其中,FA 有 UI 界面,提供与用户交互的能力;而 PA 无 UI 界面,提供后台运行任务的能力以及统一的数据访问抽象。

  1. 配置 Ability 对应的基础参数

  1. 打开 pages.index.index.hml 启动预览器,对页面进行预览,输出基础 "你好 世界" 页面。

  1. 在阿里图标库内下载 5 张心形图片,5 张图片需要注意对应不同的大小。

iconfont-阿里巴巴矢量图标库

  1. 在 index.hml 文件中导入对应的页面结构代码
  1. <div class="container">
  2. <image-animator class="animator" ref="animator" images="{{frames}}" duration="1s" />
  3. <div class="btn-box">
  4. <input class="btn" type="button" value="start" @click="handleStart" />
  5. <input class="btn" type="button" value="stop" @click="handleStop" />
  6. <input class="btn" type="button" value="pause" @click="handlePause" />
  7. <input class="btn" type="button" value="resume" @click="handleResume" />
  8. </div>
  9. </div>
  1. 导入 css 样式文件
  1. .container {
  2. flex-direction: column;
  3. justify-content: center;
  4. align-items: center;
  5. left: 0px;
  6. top: 0px;
  7. width: 454px;
  8. height: 454px;
  9. }
  10. .animator {
  11. width: 70px;
  12. height: 70px;
  13. }
  14. .btn-box {
  15. width: 264px;
  16. height: 120px;
  17. flex-wrap: wrap;
  18. justify-content: space-around;
  19. align-items: center;
  20. }
  21. .btn {
  22. border-radius: 8px;
  23. width: 120px;
  24. margin-top: 8px;
  25. }
  1. 设置图片文件 data model 并 export 出来 common.datas.imgs.js
  1. export default [
  2. {
  3. src: "../images/heart50.png",
  4. },
  5. {
  6. src: "../images/heart60.png",
  7. },
  8. {
  9. src: "../images/heart70.png",
  10. },
  11. {
  12. src: "../images/heart80.png",
  13. },
  14. {
  15. src: "../images/heart90.png",
  16. },
  17. {
  18. src: "../images/heart100.png"
  19. }
  20. ]
  1. 在 index.js 文件中导入图片模块,并写入相应逻辑,需要注意的是使用 $ref 获取到当前动画的节点对象。然后调用其对应的方法。
  1. import imgs from "../../common/datas/imgs.js"
  2. export default {
  3. data: {
  4. frames:imgs
  5. },
  6. handleStart() {
  7. this.$refs.animator.start();
  8. },
  9. handlePause() {
  10. this.$refs.animator.pause();
  11. },
  12. handleResume() {
  13. this.$refs.animator.resume();
  14. },
  15. handleStop() {
  16. this.$refs.animator.stop();
  17. },
  18. };
  1. 图片无法正常显示,相对路径无法查找到文件位置,是因为 index.js 引入模块后,相对路径发生了变化,修改对应的路径。
  1. export default [
  2. {
  3. src: "/common/images/heart50.png",
  4. },
  5. {
  6. src: "/common/images/heart60.png",
  7. },
  8. {
  9. src: "/common/images/heart70.png",
  10. },
  11. {
  12. src: "/common/images/heart80.png",
  13. },
  14. {
  15. src: "/common/images/heart90.png",
  16. },
  17. {
  18. src: "/common/images/heart100.png"
  19. }
  20. ]
  1. 图片动画并未出现,为什么呢?因为图片的渲染机制是直接更改到对应的大小,所以,我们需要保证心形在图片中占有的位置,使用截图工具截图后,终于出现了心形跳动的结果。

TodoList 应用构建

  1. 页面结构使用 HTML 相同的标签进行嵌套,最外层是 div 容器。
  2. 文本内容放在<text>标签中才能呈现,否则不会呈现文本内容。
  3. 可以直接调用 鸿蒙 JS 封装好的 组件,这里我们使用的是 switch 组件
  1. <div class="container">
  2. <text class="title">待办事项</text>
  3. <div class="item">
  4. <text class="todo">8点产品需求会议</text>
  5. <switch showtext="true" checked="true"
  6. texton="完成" textoff="待办"
  7. class="switch"></switch>
  8. <button class="remove" onclick="remove($idx)">删除</button>
  9. </div>
  10. <div class="item">
  11. <text class="todo">9点开始开发工作</text>
  12. <switch showtext="true" checked="false"
  13. texton="完成" textoff="待办"
  14. class="switch"></switch>
  15. <button class="remove" onclick="remove($idx)">删除</button>
  16. </div>
  17. <div class="item">
  18. <text class="todo">18</text>
  19. <switch showtext="true" checked="false"
  20. texton="完成" textoff="待办"
  21. class="switch"></switch>
  22. <button class="remove" onclick="remove($idx)">删除</button>
  23. </div>
  24. <div class="info">
  25. <text class="info-text">您还有</text>
  26. <text class="info-num">2</text>
  27. <text class="info-text">件事情待办,加油!</text>
  28. </div>
  29. <div class="add-todo">
  30. <input class="plan-input" type="text"></input>
  31. <button class="plan-btn" onclick="addTodo">添加待办</button>
  32. </div>
  33. </div>

(2)页面样式设计注意事项

  1. 页面 CSS 支持 id、class、tag 选择器,建议使用 class 选择器。
  2. 页面样式系统基于 flex 弹性布局进行设置,默认就是 flex 弹性布局,需要注意,弹性布局会自动的拉升和压缩内部元素模块宽度、高度。
  3. 鸿蒙封装的 JS 组件,有一个专门的样式说明,这个和我们传统的 CSS 写法有很大的差异,这个尤其需要注意。

  1. .container {
  2. flex-direction: column;
  3. justify-content: flex-start;
  4. align-items: center;
  5. padding-bottom: 100px;
  6. }
  7. .title {
  8. font-size: 25px;
  9. margin-top: 20px;
  10. margin-bottom: 20px;
  11. color: #000000;
  12. opacity: 0.9;
  13. font-size: 28px;
  14. }
  15. .item{
  16. width: 325px;
  17. padding: 10px 0;
  18. flex-direction: row;
  19. align-items: center;
  20. justify-content: space-around;
  21. border-bottom: 1px solid #eee;
  22. }
  23. .todo{
  24. color: #000;
  25. width: 180px;
  26. font-size: 18px;
  27. }
  28. .switch{
  29. font-size: 12px;
  30. texton-color: green;
  31. textoff-color:red;
  32. text-padding: 5px;
  33. width: 100px;
  34. height: 24px;
  35. allow-scale: false;
  36. }
  37. .remove {
  38. font-size: 12px;
  39. margin-left: 10px;
  40. width: 50px;
  41. height: 22px;
  42. color: #fff;
  43. background-color: red;
  44. }
  45. .info{
  46. width: 100%;
  47. margin-top: 10px;
  48. justify-content: center;
  49. }
  50. .info-text {
  51. font-size: 18px;
  52. color: #AD7A1B;
  53. }
  54. .info-num{
  55. color: orangered;
  56. margin-left: 10px;
  57. margin-right: 10px;
  58. }
  59. .add-todo {
  60. position: fixed;
  61. left: 0;
  62. bottom: 0;
  63. width: 100%;
  64. height: 60px;
  65. flex-direction: row;
  66. justify-content: space-around;
  67. align-items: center;
  68. background-color: #ddd;
  69. }
  70. .plan-input {
  71. width: 240px;
  72. height: 40px;
  73. background-color: #fff;
  74. }
  75. .plan-btn {
  76. width: 90px;
  77. height: 35px;
  78. font-size: 15px;
  79. }

(3)数据渲染与事件绑定

  1. 第三方 JSON 数据导入,注意使用相对路径
  1. export default [
  2. {
  3. info: '给老王打个电话',
  4. status: true
  5. },
  6. {
  7. info: '输出工作计划',
  8. status: false
  9. },
  10. {
  11. info: '和小王对接需求',
  12. status: true
  13. },
  14. {
  15. info: '整理客户资料',
  16. status: false
  17. },
  18. {
  19. info: '和朋友一起聚餐',
  20. status: false
  21. }
  22. ]
  23. import todoList from "../../common/datas/todoList.js"
  1. 数据绑定

    与vue用法类似

    hml {{ 变量名 }}

    js 变量放在 data 中

  1. export default{
  2. data:{
  3. 变量名: value
  4. }
  5. }
  1. 列表渲染(for)

    tid 属性指定数组中每个元素的唯一标识,默认值为 id,用于加速for循环的重渲染。

    写法1(都不指定):<div for="{{array}}" tid='id'></div> ,$idx代表元素索引,$item代表数组元素

    写法2(指定元素名称):<div for="{{value in array}}" tid='id'></div>,$idx 代表元素索引,value 代表数组元素

    写法3(指定索引和元素名称):<div for="{{(index,value) in array}}" tid='id'></div> ,index代表元素索引,value代表数组元素。

  2. 事件绑定

    类似 v-on,在 js 中绑定的函数和 data 同级

    hml:<div onclick="clickfunc"></div> 或 <div @click="clickfunc"></div>

    js: 放在 data 后:

  1. export default{
  2. data:{
  3. },
  4. clickfunc: function(){
  5. ......
  6. }
  7. }
  1. 使用计算属性 computed 和 Vue 中的用法一样,依赖 data 中的数据进行计算,return 返回计算的结果。
  1. import todoList from "../../common/datas/todoList.js"
  2. export default {
  3. data: {
  4. // 待办事件列表
  5. todoList,
  6. inputTodo: "IDE无法调用输入"
  7. },
  8. computed: {
  9. needTodoNum(){
  10. let num = 0;
  11. this.todoList.forEach(item => {
  12. if(!item.status){
  13. num++;
  14. }
  15. });
  16. return num;
  17. }
  18. },
  19. remove(index){
  20. console.log(index)
  21. this.todoList.splice(index,1)
  22. },
  23. addTodo() {
  24. console.log("在这里设置一个新值");
  25. this.todoList.push({
  26. info:'键盘输入',
  27. status: false
  28. })
  29. },
  30. checkStatus(index){
  31. console.log(index);
  32. this.todoList[index].status = !this.todoList[index].status;
  33. }
  34. }

PS:需要注意的是 Prview 预览模拟器在 MAC 上无法接收键盘输入的内容,但是在真机模拟器上是正常的。我们使用一个日期选择器来模拟输入,在鸿蒙 JS 系统上没有 双向数据绑定,需要我们自行实现双向数据绑定。

<picker type="date" onchange="dateChange">{{date}}</picker>
  1. export default {
  2. data: {
  3. date:'请选择日期'
  4. },
  5. dateChange(e){
  6. console.log(JSON.stringify(e))
  7. this.date = e.year + "年" + e.month + "月" + e.day + "日"
  8. }
  9. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/225137
推荐阅读
相关标签
  

闽ICP备14008679号