本次实战课题是–自定义组件之分页功能实例
目录
一、分页组件效果展示
二、分页组件设计流程
三、自定义组件封装必备知识点
1,何谓自定义组件
组件是对数据和方法的简单封装。个人对组件的通俗理解是:对单独的某个通用功能点或UI显示模块的封装。
2,组件框架搭建步骤
此处以js为例:
第一步:在工程目录的common下新建一个包名;
第二步:在新建的包名目录下新建新的空文件(js\hml\css),每个文件具体做啥就不一一介绍了,三个文件的名字一定要一样,这个名字就是外部调用的名字了,非常重要。
第三步:js文件写好简单结构,页面数据,hml中写个div,div中加个text或button就可以了
第四步:将自己新建的组件在可展示的页面中调用并展示。
到这里自定义组件框架已搭建完毕,是不是还比较简单。后面就可以开始完善自己组件的功能了。
3,组件怎么调用
组件引入:
注意:必须在需要引用的页面最上面调用,路径和name一定要写对,这里的name就是组件的文件的名字。
页面元素装载:
注意:用法跟text、button一样,只是标签名字变成了组件名字。
4,组件怎么定义入参
组件的入参需用props定义:
注意:组件内部props定义的参数和data定义的参数用法一样,可以直接this.setTotalnum.
5,外部怎么传入参数
参数传入实例:
注意:set-totalnum,set-pageount为入参,写法一定要将驼峰法的变量拆开并全小写
6,组件怎么提供回调事件并绑定参数
分发回调事件(js代码):
注意:yourFun是组件提供的回调方法名,{startnum: this.startnum,endnum: this.endnum}是参数,this.$emit()调用一次,就会立马相应一次关联的回调方法
7,外部如何绑定回调事件并获取参数
注意:@your-fun="testFun"就是将外部方法testFun和组件内的yourFun进行关联,千万注意写法@your-fun,@ + 内部方法驼峰拆开全小写用‘-’连接
四、代码展示
pagingcomp.js
import document from '@ohos.document';
export default {
props: ['setTotalnum','setPageount'],
data: {
value: "组件创建",
totalnum:101,
totalpage:0,
startpage:1,
curpage:1,
pagecount:5,
startnum:0,
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();
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});
},
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
pagingcomp.hml
pagingcomp.css
index.hml
index.js
五、感谢大家阅读
最后感谢大家的阅读,为了能在harmonyos的道路上与时俱进,能和大家一同学习,假如大家有知道的比较实用的Android插件且还未迁移到harmonyos上来的插件,请留言区告知插件名+插件源码路径地址,本人想尝试插件移植并与大家分享!再次感谢大家。
感谢拓维老师的分享。
我来了鸿蒙