当前位置: 首页 > news >正文

OpenHarmony JS Demo开发讲解

项目结构

打开entry→src→main→js,工程的开发目录如图所示

其中,

  • i18n文件夹:用于存放配置不同语言场景的资源,比如应用文本词条,图片路径等资源。en-US.json文件定义了在英文模式下页面显示的变量内容,zh-CN.json文件定义了中文模式下的页面内容。
  • pages文件夹用于存放多个页面,每个页面由hml、css和js文件组成。
    • index.hml文件:定义了index页面的布局,index页面中用到的组件,以及这些组件的层级关系。
    • index.css文件:定义了index页面的样式。
    • index.js文件:定义了index页面的业务逻辑,比如数据绑定、事件处理等。
  • app.js文件:进行全局的逻辑文件和应用生命周期管理。
  • resources文件夹:用于存放开发资源文件的目录。包括图片、音视频等资源文件。
  • config.json文件:应用配置文件。用于声明应用的Ability信息,及应用所需的权限等信息。

JS FA

可将该FA一共分成三个部分:图片区、标题区、描述区。根据此分区,根节点的子节点应按列排列。 图片区和描述区分别使用 swiper组件和text组件实现。标题区由两个部分组成,以行来排列,其中第一部分由两个text组件组成,分别为商品名称和商品标语,以列排列。第二部分由image组件和text组件组成,分别为代表收藏功能的星号和代表收藏次数的数字,以行排列,如图所示。

首先构建FA基础布局。其中,实现图片区域通常用image组件来实现,由于需要左右滑动图片,因此在image外层加入swiper滑动容器,swiper容器提供了切换子组件显示的能力。 标题区和描述区采用了最常用的基础组件text,text组件用于展示文本,文本内容需要写在标签内容区。要将页面的基本元素组装在一起,需要使用容器组件,如上述swiper容器。在页面布局中常用到三种容器组件,分别是div、list和tabs。在页面结构相对简单时,可以直接用div作为容器,因为div作为单纯的布局容器,使用起来更为方便,可以支持多种子组件。 在index.hml文件中,实现基础布局,具体代码如下所示:

<div class="container"><swiper class="swiper-style"><image src="/common/Phone_00.jpg" class="image-mode"></image><image src="/common/Phone_01.jpg" class="image-mode"></image><image src="/common/Phone_02.jpg" class="image-mode"></image><image src="/common/Phone_03.jpg" class="image-mode"></image></swiper><div class="title-section"><div class="phone-title"><text class="phone-name">HUAWEI</text><text class="phone-definition">Thinking Possibilities</text></div><div class="favorite-image"><image src="{{unFavoriteImage}}" class="image-size"οnclick="favorite"></image></div><div class="favorite-count"><text>{{number}}</text></div></div><div class="description-first-paragraph"><text class="description">{{descriptionFirstParagraph}}</text></div><div class="description-second-paragraph"><text class="description">{{descriptionSecondParagraph}}</text></div>
</div>

在index.hml中,为每个组件和容器都定义了一个class=“***”的样式,需要在css文件中依次对样式进行构建。如本例,在index.css文件中,需要设定的样式主要有:flex-direction用于设置子组件容器的排列方式,paddind用于设置内边距,font-size用于设置字体大小,以及swiper组件的一些私有属性,如indicator-color用于设置导航点指示器的填充颜色,indicator-selected-color用于设置导航点指示器选中的颜色,indicator-size用于设置导航点指示器的直径大小等。具体代码如下所示:

.container {flex-direction: column;
}
.swiper-style {height: 700px;indicator-color: #4682b4;indicator-selected-color: #ffffff;indicator-size: 20px;
}
.title-section {flex-direction: row;height: 150px;
}
.phone-title {align-items:flex-start;flex-direction: column;padding-left: 60px;padding-right: 160px;padding-top: 50px;
}
.phone-name {font-size: 50px;color: #000000;
}
.phone-definition {font-size: 30px;color: #7A787D;
}
.favorite-image {padding-left: 70px;padding-top: 50px;
}
.favorite-count {padding-top: 60px;padding-left: 10px;
}
.image-size {object-fit: contain;height: 60px;width: 60px;
}
.description-first-paragraph {padding-left: 60px;padding-top: 50px;padding-right: 60px;
}
.description-second-paragraph {padding-left: 60px;padding-top: 30px;padding-right: 60px;
}
.description {color: #7A787D;
}
.image-mode {object-fit: contain;
}

在index.js用于构建页面逻辑,对图片资源进行赋值,并通过添加交互实现收藏功能。收藏按钮通过一个div组件关联click事件实现。click事件作为一个函数定义在index.js文件中,可以更改isFavorite的状态,从而更新显示的image组件和text组件。index.js中代码如下所示:

export default {data: {unFavoriteImage: "/common/unfavorite.png",isFavorite: false,number: 20,descriptionFirstParagraph:"The breakthrough of visual boundaries, the exploration of photography and videography, the liberation of power and speed, and the innovation of interaction are now ready to be discovered. Embrace the future with new possibilities.",descriptionSecondParagraph: "Lighting up infinite possibilities. The quad camera of HUAWEI is embraced by the halo ring. It is a perfect fusion of reflection and refraction. Still Mate, but a new icon.",},favorite() {var tempTotal;if (!this.isFavorite) {this.unFavoriteImage = "/common/favorite.png";tempTotal = this.number + 1;} else {this.unFavoriteImage = "/common/unfavorite.png";tempTotal = this.number -1;}this.number = tempTotal;this.isFavorite = !this.isFavorite;}
}

常用组件

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

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

基础组件-Button

Button是实现用户交互最常用的组件,可用于触发JS中的函数。可以使用JS提供的各种按钮(包括胶囊按钮、圆形按钮、文本按钮、弧形按钮、下载按钮)来实现许多有趣的功能。

<!-- index.hml定义多种按钮 -->
<div class="div-button"><button class="button" type="capsule" value="胶囊按钮"></button><button class="button circle" type="circle" icon="common/logo.png"></button><button class="button text" type="text">文本按钮</button><button class="button download" type="download" id="download-btn"onClick="setProgress">{{downloadText}}</button><button class="button" type="capsule" waiting="true">载入中...</button><button class="button" type="arc">弧形按钮</button>
</div>

上述下载按钮的onClick属性绑定到了js文件中的setProgress函数中,js文件的代码如下所示

export default {data: {progress: 5,downloadText: "下载"},setProgress(e) {this.progress += 10;    //每次点击增加10%的进度this.downloadText = this.progress + "%";if (this.progress >= 100) {this.downloadText = "完成";   //到达100%时显示完成}}
}

实现效果如下:

List组件

List组件常用于呈现多行连续同类的数据。List列表组件包含两类子组件,分别是list-item列表项和list-item-group列表项组。这里详细讲解一下list-item-group列表项组。 list-item-group是一个具有折叠效果list列表,配合list-item使用,以list-item-group中的第一个list-item作为分类标准,以下都折叠进分类中,点击具有折叠和扩展的效果。代码如下所示:

<!-- index.hml -->
<div class="container"><list><list-item-group><list-item class="item_style"><text class="big_size">水果</text></list-item><list-item><text class="font_size">苹果</text></list-item><list-item><text class="font_size">香蕉</text></list-item></list-item-group><list-item-group><list-item class="item_style"><text class="big_size">饮料</text></list-item><list-item><text class="font_size">可乐</text></list-item><list-item><text class="font_size">咖啡</text></list-item></list-item-group><list-item-group><list-item class="item_style"><text class="big_size">零食</text></list-item><list-item><text class="font_size">薯片</text></list-item><list-item><text class="font_size">锅巴</text></list-item></list-item-group></list>
</div>
.item_style {background-color: pink;
}
.big_size {font-size: 50px;
}

运行上述代码,结果如图所示,实现了一个具有折叠效果的列表

自定义组件

自定义组件是用户根据业务需求,将已有的组件组合起来,封装成新的组件,并作为新组件可以在工程中被多次调用,从而提高代码的可读性和可扩展性。自定义组件通过element引入到宿主页面,使用方法的示例代码如下所示

<element name="comp" src="../comp.hml"></element>
<div><comp prop1='xxxx' @child1="bindParentVmMethod"></comp>
</div>
  • name属性指定自定义组件名称(非必填,若不填组件名称则为hml文件名)。src属性指自定义组件hml文件路径,为了准确定位到该组件位置,src属性内容必须要填写,需要注意的是,src路径中"../"代表上一级目录索引。
  • prop属性用于组件之间的通信,可以通过方式传递给组件;名称必须用小写。
  • 事件绑定:自定义组件中绑定子组件事件使用(on或@)child1语法,子组件中通过this.$emit('child1', { params: '传递参数' })触发事件并进行传值,父组件执行bindParentVmMe- thod方法并接收子组件传递的参数。 下面创建一个自定义组件,并在父组件中引入自定义组件的事件响应。首先在page文件夹中新建自定义组件目录comp,同时创建自定义组件的基础htm、css和js文件,代码如下所示
<div class="item"><text class="title_style">{{title}}</text><text class="text-style" οnclick="childClicked">点击这里查看隐藏文本</text><text class="text-style" if="{{showword}}">hello world</text>
</div>
.item {width: 700px;flex-direction: column;height: 300px;align-items: center;margin-top: 100px;
}
.text-style {font-weight: 500;font-family: Courier;font-size: 40px;
}
export default {props: {title: {default: 'title'},},data: {showword: false,},childClicked () {this.$emit('eventType1', {text: "收到子组件参数"});this.showword = !this.showword;},
}

上述代码新创建了一个comp自定义组件,组件中设置了一个具有点击属性的文本内容,该点击效果会将自定义组件的数据传递给父组件,并将show值从初始化的false转为true,即显示hello world文本。 在父组件中通过element引入自定义组件,代码如下所示

<element name="comp" src="../comp/comp.hml"></element>
<div class="container"><text>父组件:{{text}}</text><comp title="自定义组件" @event-type1="textClicked"></comp>
</div>
.container {background-color: #f8f8ff;flex: 1;flex-direction: column;align-content: center;
}
export default {data: {text: "开始"},textClicked (clicked) {this.text = clicked.detail.text;},
}

本示例中父组件通过添加自定义属性向子组件传递了名为title的参数,自定义子组件在props中接收,自定义组件可以通过props声明属性,父组件通过设置的属性向子组件传递参数,注意在命名prop时需要使用camelCase即驼峰式命名法,在外部父组件传递参数时需要使用kebab-case即用短横线分割命名,例如在上面示例代码中属性eventType1在父组件引用时需要转换为event-type1。子组件也通过事件绑定向上传递了参数text,父组件接收时通过clicked.detail获取数据。

父子组件之间的数据传输是单向的,一般的只能从父组件传递给子组件,而子组件如果需要向上传递必须绑定事件,通过事件的$emit来传输。子组件获取来自父组件数据后,子组件不能直接修改父组件传递下来的值,可以通过将props传入的值用data接收后作为默认值,然后在对data的值进行修改。 如果需要观察组件中属性的变化,可以通过$watch方法增加属性变化回调。

相关文章:

OpenHarmony JS Demo开发讲解

项目结构 打开entry→src→main→js&#xff0c;工程的开发目录如图所示 其中&#xff0c; i18n文件夹&#xff1a;用于存放配置不同语言场景的资源&#xff0c;比如应用文本词条&#xff0c;图片路径等资源。en-US.json文件定义了在英文模式下页面显示的变量内容&#xff0c…...

CentOS系统安装Intel E810 25G网卡驱动

因特尔网卡驱动给的都是二进制包&#xff0c;需要编译环境。 首先去Intel下载最新的驱动 E810驱动下载&#xff1a;https://www.intel.com/content/www/us/en/download/19630/intel-network-adapter-driver-for-e810-series-devices-under-linux.html?wapkwe810 里面有三个驱…...

Java经典的String面试题

Java经典的Spring面试题 String是基本数据类型吗&#xff1f; String你是基本数据类型String是可变的话&#xff1f; String是final类型的&#xff0c;不可变怎么比较两个字符串的值一样&#xff0c;怎么比较两个字符串是否同一对象&#xff1f; 比较字符串的值是否相同用equa…...

c# 结构体与类区别

在 C# 中&#xff0c;结构体&#xff08;struct&#xff09;和类&#xff08;class&#xff09;都是用户自定义类型&#xff0c;它们具有一些共同的特性&#xff0c;比如可以定义字段、属性、方法等。但它们也有一些区别。 下面是一些结构体和类的区别&#xff1a; 定义方式不…...

使用 patch 命令打补丁

之前的这篇文章 git 导出差异 diff 文件 写了导出 diff 、patch 文件。 拿到 patch 文件&#xff0c;用 patch 命令可以快速的把修改内容合入&#xff0c;合入后在 git 上是已修改的状态&#xff0c;如需提交还要 add 、commit 。 patch 语法 patch --help 可以看到 Usage:…...

C++——类和对象[上]

目录 1.初识面向对象 2.类的引入 3.类的定义 4.成员变量的命名规则 5.类的实例化 6.类对象模型 7.this指针 1.初识面向对象 C语言是一门面向过程的语言&#xff0c;它关注的是完成任务所需要的过程&#xff1b;C是一门面向对象的语言&#xff0c;将一个任务分为多个对…...

MySQL日志

目录 一 关于mysql的设计和运行逻辑 二 MySQL的三类日志 三 对于日志的利用 插入查询 1 备份 2 删除重复数据 一 关于mysql的设计和运行逻辑 mysql在启动的时候非常占空间&#xff0c;需要申请很大的空间&#xff0c;但是有时候内存并没有那么多&#xff0c;所以OS会把my…...

TinyURL 的加密与解密、猜数字游戏、 Fizz Buzz、相对名次----2023/4/28

TinyURL 的加密与解密----2023/4/28 TinyURL 是一种 URL 简化服务&#xff0c; 比如&#xff1a;当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时&#xff0c;它将返回一个简化的URL http://tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。 加…...

Spring boot结合SkyWalking-Trace工具类实现日志打印请求链路traceid

背景&#xff1a; 随着业务的复杂化、解耦化&#xff0c;运维人员和开发人员需要对请求链路跟踪来快速发现和定位问题&#xff0c;基于应用已经集成了SkyWalking的前提下&#xff0c;如何通过获取SkyWalking生成的统一traceId并加入打印日志中&#xff0c;方便开发人员能够根据…...

精通ES=ElasticSearch

Elasticsearch 是一个分布式、高扩展、高实时的搜索与 数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平 伸缩性&#xff0c;能使数据在 生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤&#xff0c;首先用…...

RabbitMQ-扇形交换机(Fanout )

扇形交换机&#xff1a;Fanout Exchange扇形交换机是最基本的交换机类型&#xff0c;它所能做的事情非常简单———广播消息。扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要“思考”&#xff0c;所以扇形交换机处理消息的速度也是所有的交换机类…...

Python 学习曲线 从 Python 新手到 Pro

Python 学习曲线 从 Python新手到 Pro 使用代码片段介绍&#xff1a; Python 是世界上最通用和使用最广泛的编程语言之一&#xff0c;以其简单性、可读性和多功能性而闻名。 在本文中&#xff0c;我们将探讨一系列示例场景&#xff0c;其中代码由具有三个不同专业知识水平的程序…...

薪资18K需要什么水平?来看看98年测试工程师的面试全过程…

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而到今天都没有收到一份offer&#xff01;从年后就开始准备简历&#xff0c;年…...

基于趋动云的 Stable Diffusion Webui 环境搭建

Stable Diffusion Webui 环境搭建&#xff0c;首先新建一个项目&#xff1a; 然后&#xff0c;选择镜像。注意点公开的&#xff0c;已近做好的这个镜像&#xff0c;superx创建&#xff0c;集成了miniconda3的镜像。 然后选择添加数据源&#xff0c;一样&#xff0c;还是点公开&…...

备忘录设计模式解读

目录 问题引进 游戏角色状态恢复问题 传统方案解决游戏角色恢复 传统的方式的问题分析 备忘录模式基本介绍 基本介绍 备忘录模式的原理类图 对原理类图的说明 游戏角色恢复状态实例 应用实例要求 思路分析和图解(类图) 代码实战 备忘录模式的注意事项和细节 问题引…...

股票期货模拟交易有用吗?股票期货模拟交易心得

股票期货市场为了满足新用户的需求&#xff0c;有专门的股票期货模拟交易平台&#xff0c;大家可以在这个平台上进行股票期货的模拟交易&#xff0c;这样可以通过不断总结&#xff0c;丰富我们的知识。下面整理的股票期货模拟交易实验心得&#xff0c;从股票期货模拟交易与实盘…...

2023年五月份图形化三级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…...

【华为OD机试真题】字母组合(javapython)100%通过率 详细代码注释

字母组合 知识点回溯 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 每个数字对应多个字母,对应关系如下: 0: a,b,c 1: d,e,f 2: g,hi 3: j,k,l 4: m,n,o 5: p,q,r 6: s,t 7:u,v 8: w,x 9: y,z 输入一串数字后,通过数字和字母的对应关系可以得到多个字母字符串 (要…...

精彩!openEuler 社区年度顶级会议发生了啥?

2023年4月20-21日&#xff0c;万涓汇流&#xff0c;奔涌向前&#xff0c;openEuler Developer Day2023(以下简称“ODD2023”)在上海以线上线下的方式圆满举办。 本次大会由开放原子开源基金会指导&#xff0c;中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办&#…...

Confidential Containers发布0.5.0版本,龙蜥将基于八大特性构建开箱即用的机密容器解决方案

文/段勇帅 01 前言 机密容器&#xff08;Confidential Containers&#xff0c;简称CoCo&#xff09;是 Cloud Native Computing Foundation&#xff08;CNCF&#xff09;Sandbox 项目。目前机密容器项目的核心参与者包括阿里云、AMD、ARM、IBM、Intel、Microsoft、Red Hat、R…...

独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …...

使用 Luckysheet 可实现 Web 的 Excel

一、写在前面 工作中会遇到excel的导入和导出&#xff0c;换个角度看&#xff0c;假如有个 web 版本的excel &#xff0c;且能上传现有的&#xff0c;修改编辑后再下载也是个不错的方案。 Luckysheet 是实现 web版Excel的一个优秀的框架。 Luckysheet &#xff0c;一款纯前端类…...

时间序列预测(一)基于Prophet的销售额预测

时间序列预测&#xff08;一&#xff09;基于Prophet的销售额预测 小O&#xff1a;小H&#xff0c;有没有什么方法能快速的预测下未来的销售额啊 小H&#xff1a;Facebook曾经开源了一款时间序列预测算法fbprophet&#xff0c;简单又快速&#xff5e; 传统的时间序列算法很多&a…...

【电科复试第一名】23上交819考研经验分享

笔者来自通信考研小马哥23上交819全程班学员 819&#xff0c;上岸经验贴&#xff0c;知无不言 初试第十一&#xff0c;复试第一&#xff0c;总分第七(与第六同分) 考研经历:本科就读与湖南某末985&#xff0c;大学时间没好好学习&#xff0c;天天打王者&#xff0c;玩steam上…...

每日学术速递4.24

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Collaborative Diffusion for Multi-Modal Face Generation and Editing(CVPR 2023) 标题&#xff1a;多模态人脸生成和编辑的协同扩散 作者&#xff1a;Ziqi Huang, Kelvin C.K. …...

怎么把mkv文件转成mp4格式,3招立马处理

怎么把mkv文件转成mp4格式的方法你知道吗&#xff1f;我想很多朋友会遇到这样的情况&#xff0c;下载视频后发现无法打开。原来我们下载的视频格式是mkv&#xff0c;也许这个格式大家不是很熟悉的。那么今天就来认识一下&#xff0c;mkv是Matroska的一种媒体文件&#xff0c;mk…...

SEO机制算是让我玩明白了

获取当前时间时间戳&#xff0c;返回遵循ISO 8601扩展格式的日期 new Date(Date.now()).toISOString() 使用moment库转换回来 this.moment(new Date(Date.now()).toISOString()).format("YYYY-MM-DD") js去掉富文本中html标签和图片 filterHtmlTag(val) {if(!val){…...

JDBC连接数据库详细教程指南

目录 一、JDBC介绍 二、JDBC环境的搭建 三、JDBC的开发步骤 1、加载JDBC驱动程序 2、建立数据库连接 3、创建Statement对象 4、执行SQL语句 5、处理结果集 6、关闭连接 7、示例程序 8、注意 一、JDBC介绍...

换个花样玩C++(2)柔性数组怎么玩

如果你涉足网络传输方向的开发,我想你对这段类似的代码应该不会很陌生,先看代码: int check_msg(svr_proto_t* pkg, uint32_t bodylen, fdsession_t* fdsess) {struct report_msg {uint32_t gameid;uint32_t userid;uint32_t recvid;uint32_t onlineid;uint32_t …...

【前端】一个好看的前端页面

序言 突发奇想&#xff0c;看到这个特效还不错&#xff0c;就加工了一下&#xff0c;如果也能帮到你&#xff0c;很开心 先上效果图 部分代码讲解 前端生成uuid function getUUID(len, radix) {var chars 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.s…...