文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

HarmonyOS自定义组件之分页功能组件封装实例

2024-12-02 16:57

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

一、分页组件效果展示


二、分页组件设计流程


三、自定义组件封装必备知识点

1,何谓自定义组件

组件是对数据和方法的简单封装。个人对组件的通俗理解是:对单独的某个通用功能点或UI显示模块的封装。

2,组件框架搭建步骤

此处以js为例:

在工程目录的common下新建一个包名;

在新建的包名目录下新建新的空文件(js\hml\css),每个文件具体做啥就不一一介绍了,三个文件的名字一定要一样,这个名字就是外部调用的名字了,非常重要。

js文件写好简单结构,页面数据,hml中写个div,div中加个text或button就可以了

将自己新建的组件在可展示的页面中调用并展示。

到这里自定义组件框架已搭建完毕,是不是还比较简单。后面就可以开始完善自己组件的功能了。

3,组件怎么调用

组件引入:

  1. name='**pagingcomp**' src='../../common/component 
  2.     props: ['setTotalnum','setPageount'], 

 注意:组件内部props定义的参数和data定义的参数用法一样,可以直接this.setTotalnum.

5,外部怎么传入参数

参数传入实例:

  1. "threecomp" set-totalnum='121' set-pageount='10'

注意:set-totalnum,set-pageount为入参,写法一定要将驼峰法的变量拆开并全小写

6,组件怎么提供回调事件并绑定参数

分发回调事件(js代码):

  1. this.$emit('yourFun', {startnum: this.startnum,endnum: this.endnum}); 

 注意:yourFun是组件提供的回调方法名,{startnum: this.startnum,endnum: this.endnum}是参数,this.$emit()调用一次,就会立马相应一次关联的回调方法

7,外部如何绑定回调事件并获取参数

  1. "threecomp" @your-fun="testFun"

注意:@your-fun="testFun"就是将外部方法testFun和组件内的yourFun进行关联,千万注意写法@your-fun,@ + 内部方法驼峰拆开全小写用‘-’连接

四、代码展示

pagingcomp.js

  1. import document from '@ohos.document'
  2. export default { 
  3.      
  4.     props: ['setTotalnum','setPageount'], 
  5.     data: { 
  6.         value: "组件创建"
  7.         //记录条数 外部可设置 
  8.         totalnum:101, 
  9.         //总页数,内部值 
  10.         totalpage:0, 
  11.         //开始页码 内部值 
  12.         startpage:1, 
  13.         //当前页码 内部值 
  14.         curpage:1, 
  15.         //每页显示记录的条数 外部可设置 
  16.         pagecount:5, 
  17.         //当前页显示的记录开始ID  传出参数 
  18.         startnum:0, 
  19.         //当前页显示的记录结束ID 传出参数 
  20.         endnum:0, 
  21.         //显示的页码按钮数 
  22.         itemnum:5, 
  23.         //对应页码按钮的状态值 显隐、显示值、样式 
  24.         itemlist:[{ 
  25.             lshow:true
  26.             value:0, 
  27.             bgstyle:"three"
  28.         }, { 
  29.             lshow:true
  30.             value:0, 
  31.             bgstyle:"three"
  32.         },{ 
  33.             lshow:true
  34.             value:0, 
  35.             bgstyle:"three"
  36.         },{ 
  37.             lshow:true
  38.             value:0, 
  39.             bgstyle:"three"
  40.         },{ 
  41.             lshow:true
  42.             value:0, 
  43.             bgstyle:"three"
  44.         }], 
  45.  
  46.     }, 
  47.  
  48.      
  49.     onInit() { 
  50.         console.log("组件创建"
  51.         this.setAttr(); 
  52.     }, 
  53.  
  54.      
  55.     onAttached() { 
  56.         this.value = "组件挂载" 
  57.         console.log("组件挂载"
  58.     }, 
  59.  
  60.      
  61.     onDetached() { 
  62.         this.value = "2222" 
  63.         console.log("2222"
  64.     }, 
  65.  
  66.      
  67.     onPageShow() { 
  68.         this.checkCurPage(); 
  69.         this.checkShow(); 
  70.         this.calcItemNum(); 
  71.  
  72.         // 发布回调事件 事件ID “yourFun” 使用处需写成 "your-fun" 
  73.         this.$emit('yourFun', {startnum: this.startnum,endnum: this.endnum}); 
  74.     }, 
  75.  
  76.      
  77.     setAttr(){ 
  78.         if(typeof(this.setTotalnum) != 'undefined'){ 
  79.             this.totalnum = this.setTotalnum; 
  80.         } 
  81.  
  82.         if(typeof(this.setPageount) != 'undefined'){ 
  83.             this.pagecount = this.setPageount; 
  84.         } 
  85.     }, 
  86.  
  87.      
  88.     checkCurPage(){ 
  89.         this.totalpage = Math.ceil(this.totalnum / this.pagecount); 
  90.         if (this.curpage > this.totalpage) 
  91.         this.curpage = this.totalpage; 
  92.  
  93.         if(this.totalpage <= 0){ 
  94.             this.totalpage = 0; 
  95.             this.curpage = 0; 
  96.         } 
  97.     }, 
  98.  
  99.      
  100.     checkShow(){ 
  101.         for (var index = 0; index < 5; index++) { 
  102.             var isShow = this.startpage + index <= this.totalpage ? true : false
  103.             this.itemlist[index].lshow = isShow; 
  104.             this.itemlist[index].value = this.startpage + index
  105.             if(this.startpage + index == this.curpage) 
  106.             { 
  107.                 this.itemlist[index].bgstyle = "threeChoose"
  108.             } else { 
  109.                 this.itemlist[index].bgstyle = "three"
  110.             } 
  111.         } 
  112.     }, 
  113.  
  114.      
  115.     calcItemNum(){ 
  116.         var nstart = (this.curpage - 1) * this.pagecount; 
  117.         nstart = (nstart < 0) ? 0 : nstart; 
  118.         var nend = this.curpage * this.pagecount; 
  119.         nend = nend > this.totalnum ? this.totalnum : nend; 
  120.         this.startnum = nstart + 1; 
  121.         this.endnum = nend; 
  122.         this.value = "显示ID范围:" + this.startnum + "-" + this.endnum; 
  123.     }, 
  124.  
  125.      
  126.     setStartNum(){ 
  127.         if(this.curpage <= this.startpage || this.curpage >= this.startpage + this.itemnum - 1) 
  128.         { 
  129.             this.startpage = this.curpage - Math.floor(this.itemnum / 2); 
  130.             this.startpage = this.startpage < 1 ? 1 : this.startpage; 
  131.         } 
  132.     }, 
  133.  
  134.      
  135.     pageUp(){ 
  136.         this.curpage -= 1; 
  137.         if(this.curpage < 1){ 
  138.             this.curpage = 1; 
  139.         } 
  140.         this.setStartNum(); 
  141.         this.checkShow(); 
  142.         this.calcItemNum(); 
  143.         this.$emit('yourFun', {startnum: this.startnum,endnum: this.endnum}); 
  144.     }, 
  145.      
  146.     pageDown(){ 
  147.         this.curpage += 1; 
  148.         if(this.curpage > this.totalpage){ 
  149.             this.curpage = this.totalpage; 
  150.         } 
  151.         this.setStartNum(); 
  152.         this.checkShow(); 
  153.         this.calcItemNum(); 
  154.         this.$emit('yourFun', {startnum: this.startnum,endnum: this.endnum}); 
  155.     }, 
  156.      
  157.     homePage(){ 
  158.         this.curpage = 1; 
  159.         this.setStartNum(); 
  160.         this.checkShow(); 
  161.         this.calcItemNum(); 
  162.         this.$emit('yourFun', {startnum: this.startnum,endnum: this.endnum}); 
  163.     }, 
  164.      
  165.     lastPage(){ 
  166.         this.curpage = this.totalpage; 
  167.         this.setStartNum(); 
  168.         this.checkShow(); 
  169.         this.calcItemNum(); 
  170.         this.$emit('yourFun', {startnum: this.startnum,endnum: this.endnum}); 
  171.     }, 
  172.      
  173.     changeYeMa(e){ 
  174.         this.curpage = e; 
  175.         this.setStartNum(); 
  176.         this.checkShow(); 
  177.         this.calcItemNum(); 
  178.         this.$emit('yourFun', {startnum: this.startnum,endnum: this.endnum}); 
  179.     }, 

pagingcomp.hml

  1. "item"
  2.     "test"
  3.         "one" onClick="homePage">首页 
  4.         "two" onClick="pageUp" value="pageUp">上一页 
  5.         for="{{itemlist}}" > 
  6.             "changeYeMa($item.value)" name="page" class="{{ $item.bgstyle}}" if="{{$item.lshow}}">{{$item.value}} 
  7.         
 
  •         "two" onClick="pageDown" value="page_down">下一页 
  •         "one" onClick="lastPage">尾页 
  •     
  •  
  •  
  • pagingcomp.css

    1. .item { 
    2.     flex-direction: column
    3.     justify-content: center; 
    4.     align-items: center; 
    5.     width: 100%; 
    6.     height: 100%; 
    7.  
    8. .test{ 
    9.     flex-direction: row; 
    10.     justify-content: flex-end
    11.     align-items: flex-start; 
    12.     font-size: 20px; 
    13.     width: 100%; 
    14.     height: 100%; 
    15.  
    16. .one{ 
    17.     width:15%; 
    18.     text-color:red; 
    19.     background-color:cornflowerblue 
    20.  
    21. .two{ 
    22.     width:20%; 
    23.     text-color:orange; 
    24.     background-color: cornflowerblue; 
    25.  
    26. .three{ 
    27.     width: 30px; 
    28.     align-content: center; 
    29.     background-color: black; 
    30.     border-color:chartreuse; 
    31.     border: 0.5px; 
    32.  
    33. .threeChoose{ 
    34.     width: 30px; 
    35.     align-content: center; 
    36.     background-color:red; 
    37.     border-color:chartreuse; 

    index.hml

    1. name='pagingcomp' src='../../common/component/pagingcomp.hml'
    2. "container"
    3.     "title"
    4.         {{ $t('strings.hello') }} {{ title }} 
    5.      
    6.     "text-style"
    7.         {{text}} 
    8.      
    9.     "threecomp" @your-fun="testFun" set-totalnum='121' set-pageount='10'
    10.  

     index.js

    1. export default { 
    2.     data: { 
    3.         title: ""
    4.         text:""
    5.     }, 
    6.     onInit() { 
    7.         this.title = this.$t('strings.world'); 
    8.     }, 
    9.  
    10.      
    11.     testFun(e){ 
    12.         this.text = "显示ID范围:" + e.detail.startnum + "-" + e.detail.endnum; 
    13.         console.info(this.text); 
    14.  
    15.     } 

    想了解更多内容,请访问:

    51CTO和华为官方合作共建的鸿蒙技术社区

    https://harmonyos.51cto.com

     

    来源:鸿蒙社区内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯