您现在的位置是:亿华云 > 数据库
HarmonyOS自定义组件之分页功能组件封装实例
亿华云2025-10-03 02:56:55【数据库】0人已围观
简介想了解更多内容,请访问:和华为官方合作共建的鸿蒙技术社区https://harmonyos.51cto.com一、分页组件效果展示二、分页组件设计流程三、自定义组件封装必备知识点1,何谓自定义组件组件
想了解更多内容,自组件之分装实请访问:
和华为官方合作共建的定义鸿蒙技术社区
https://harmonyos.51cto.com
一、分页组件效果展示

二、页功分页组件设计流程

三、自组件之分装实自定义组件封装必备知识点
1,定义何谓自定义组件
组件是页功对数据和方法的简单封装。个人对组件的自组件之分装实通俗理解是:对单独的某个通用功能点或UI显示模块的封装。
2,定义组件框架搭建步骤
此处以js为例:
第一步:在工程目录的页功common下新建一个包名;
第二步:在新建的包名目录下新建新的空文件(js\hml\css),每个文件具体做啥就不一一介绍了,自组件之分装实三个文件的定义名字一定要一样,这个名字就是页功外部调用的名字了,非常重要。自组件之分装实
第三步:js文件写好简单结构,定义页面数据,页功hml中写个div,div中加个text或button就可以了
第四步:将自己新建的组件在可展示的页面中调用并展示。网站模板
到这里自定义组件框架已搭建完毕,是不是还比较简单。后面就可以开始完善自己组件的功能了。
3,组件怎么调用
组件引入:
<element name=**pagingcomp** src=../../common/component/**pagingcomp.hml**></element> 1. 1. 1.注意:必须在需要引用的页面最上面调用,路径和name一定要写对,这里的name就是组件的文件的名字。
页面元素装载:
<**pagingcomp** class="threecomp"></**pagingcomp**>注意:用法跟text、button一样,只是标签名字变成了组件名字。
4,组件怎么定义入参
组件的入参需用props定义:
/* 组件可接收的参数setTotalnum,setPageount 使用时 setTotalnum 写成 set-totalnum setPageount 写成 set-pageount */ props: [setTotalnum,setPageount],注意:组件内部props定义的参数和data定义的参数用法一样,可以直接this.setTotalnum.
5,外部怎么传入参数
参数传入实例:
<pagingcomp class="threecomp" set-totalnum=121 set-pageount=10></pagingcomp>注意:set-totalnum,set-pageount为入参,写法一定要将驼峰法的香港云服务器变量拆开并全小写
6,组件怎么提供回调事件并绑定参数
分发回调事件(js代码):
this.$emit(yourFun, { startnum: this.startnum,endnum: this.endnum});注意:yourFun是组件提供的回调方法名,{ startnum: this.startnum,endnum: this.endnum}是参数,this.$emit()调用一次,就会立马相应一次关联的回调方法
7,外部如何绑定回调事件并获取参数
<pagingcomp class="threecomp" @your-fun="testFun"></pagingcomp>注意:@your-fun="testFun"就是将外部方法testFun和组件内的yourFun进行关联,千万注意写法@your-fun,@ + 内部方法驼峰拆开全小写用‘-’连接
四、代码展示
pagingcomp.js
import document from @ohos.document; export default { /* 组件可接收的参数setTotalnum,setPageount 使用时 setTotalnum 写成 set-totalnum setPageount 写成 set-pageount */ props: [setTotalnum,setPageount], data: { value: "组件创建", //记录条数 外部可设置 totalnum:101, //总页数,内部值 totalpage:0, //开始页码 内部值 startpage:1, //当前页码 内部值 curpage:1, //每页显示记录的条数 外部可设置 pagecount:5, //当前页显示的记录开始ID 传出参数 startnum:0, //当前页显示的记录结束ID 传出参数 endnum:0, //显示的页码按钮数 itemnum:5, //对应页码按钮的状态值 显隐、显示值、样式 itemlist:[{ lshow:true, value:0, bgstyle:"three", }, { lshow:true, value:0, bgstyle:"three", },{ lshow:true, value:0, bgstyle:"three", },{ lshow:true, value:0, bgstyle:"three", },{ lshow:true, value:0, bgstyle:"three", }], }, /* 组件初始化 */ onInit() { console.log("组件创建") this.setAttr(); }, /* 组件挂载时主动调用 */ onAttached() { this.value = "组件挂载" console.log("组件挂载") }, /* 组件摘除 */ onDetached() { this.value = "2222" console.log("2222") }, /* 页面显示时自动调用 */ onPageShow() { this.checkCurPage(); this.checkShow(); this.calcItemNum(); // 发布回调事件 事件ID “yourFun” 使用处需写成 "your-fun" this.$emit(yourFun, { startnum: this.startnum,endnum: this.endnum}); }, /* 处理传入参数 */ setAttr(){ if(typeof(this.setTotalnum) != undefined){ this.totalnum = this.setTotalnum; } if(typeof(this.setPageount) != undefined){ this.pagecount = this.setPageount; } }, /* 检查当前页码的合法性 */ checkCurPage(){ this.totalpage = Math.ceil(this.totalnum / this.pagecount); if (this.curpage > this.totalpage) this.curpage = this.totalpage; if(this.totalpage <= 0){ this.totalpage = 0; this.curpage = 0; } }, /* 检查上一页和下一页中间的按钮显示情况 */ checkShow(){ for (var index = 0; index < 5; index++) { var isShow = this.startpage + index <= this.totalpage ? true : false; this.itemlist[index].lshow = isShow; this.itemlist[index].value = this.startpage + index; if(this.startpage + index == this.curpage) { this.itemlist[index].bgstyle = "threeChoose"; } else { this.itemlist[index].bgstyle = "three"; } } }, /* 计算选中页的起始序号 */ calcItemNum(){ var nstart = (this.curpage - 1) * this.pagecount; nstart = (nstart < 0) ? 0 : nstart; var nend = this.curpage * this.pagecount; nend = nend > this.totalnum ? this.totalnum : nend; this.startnum = nstart + 1; this.endnum = nend; this.value = "显示ID范围:" + this.startnum + "-" + this.endnum; }, /* 重设上一页和下一页中间的开始页码 */ setStartNum(){ if(this.curpage <= this.startpage || this.curpage >= this.startpage + this.itemnum - 1) { this.startpage = this.curpage - Math.floor(this.itemnum / 2); this.startpage = this.startpage < 1 ? 1 : this.startpage; } }, /* 上一页按钮事件 */ pageUp(){ this.curpage -= 1; if(this.curpage < 1){ this.curpage = 1; } this.setStartNum(); this.checkShow(); this.calcItemNum(); this.$emit(yourFun, { startnum: this.startnum,endnum: this.endnum}); }, /* 下一页按钮事件 */ pageDown(){ this.curpage += 1; if(this.curpage > this.totalpage){ this.curpage = this.totalpage; } this.setStartNum(); this.checkShow(); this.calcItemNum(); this.$emit(yourFun, { startnum: this.startnum,endnum: this.endnum}); }, /* 首页按钮事件 */ homePage(){ this.curpage = 1; this.setStartNum(); this.checkShow(); this.calcItemNum(); this.$emit(yourFun, { startnum: this.startnum,endnum: this.endnum}); }, /* 尾页按钮事件 */ lastPage(){ this.curpage = this.totalpage; this.setStartNum(); this.checkShow(); this.calcItemNum(); this.$emit(yourFun, { startnum: this.startnum,endnum: this.endnum}); }, /* 上一页和下一页中间的按钮事件 */ changeYeMa(e){ this.curpage = e; this.setStartNum(); this.checkShow(); this.calcItemNum(); this.$emit(yourFun, { startnum: this.startnum,endnum: this.endnum}); },pagingcomp.hml
<div class="item"> <div class="test"> <button class="one" onClick="homePage">首页</button> <button class="two" onClick="pageUp" value="pageUp">上一页</button> <div for="{ { itemlist}}" > <button onClick="changeYeMa($item.value)" name="page" class="{ { $item.bgstyle}}" if="{ { $item.lshow}}">{ { $item.value}}</button> </div> <button class="two" onClick="pageDown" value="page_down">下一页</button> <button class="one" onClick="lastPage">尾页</button> </div> </div>pagingcomp.css
.item { flex-direction: column; justify-content: center; align-items: center; width: 100%; height: 100%; } .test{ flex-direction: row; justify-content: flex-end; align-items: flex-start; font-size: 20px; width: 100%; height: 100%; } .one{ width:15%; text-color:red; background-color:cornflowerblue } .two{ width:20%; text-color:orange; background-color: cornflowerblue; } .three{ width: 30px; align-content: center; background-color: black; border-color:chartreuse; border: 0.5px; } .threeChoose{ width: 30px; align-content: center; background-color:red; border-color:chartreuse; }index.hml
<element name=pagingcomp src=../../common/component/pagingcomp.hml></element> <div class="container"> <text class="title"> { { $t(strings.hello) }} { { title }} </text> <div class="text-style"> <text >{ { text}}</text> </div> <pagingcomp class="threecomp" @your-fun="testFun" set-totalnum=121 set-pageount=10></pagingcomp> </div>index.js
export default { data: { title: "", text:"", }, onInit() { this.title = this.$t(strings.world); }, /* 自定义回调事件 */ testFun(e){ this.text = "显示ID范围:" + e.detail.startnum + "-" + e.detail.endnum; console.info(this.text); } }想了解更多内容,请访问:
和华为官方合作共建的云服务器提供商鸿蒙技术社区
https://harmonyos.51cto.com
很赞哦!(55)
上一篇: 如何防止数据中心漏水
下一篇: 企业数据中心:自建还是外包?