本次實戰課題是--自定義組件之分頁功能實例

@toc

一、分頁組件效果展示

::: hljs-center

:::

二、分頁組件設計流程

::: hljs-center

:::

三、自定義組件封裝必備知識點

1,何謂自定義組件

組件是對數據和方法的簡單封裝。個人對組件的通俗理解是:對多帶帶的某個通用功能點或UI顯示模塊的封裝。

2,組件框架搭建步驟

此處以js為例:
第一步:在工程目錄的common下新建一個包名;
第二步:在新建的包名目錄下新建新的空文件(js/hml/css),每個文件具體做啥就不一一介紹了,三個文件的名字一定要一樣,這個名字就是外部調用的名字了,非常重要。
第三步:js文件寫好簡單結構,頁面數據,hml中寫個div,div中加個text或button就可以了
第四步:將自己新建的組件在可展示的頁面中調用并展示。
到這里自定義組件框架已搭建完畢,是不是還比較簡單。后面就可以開始完善自己組件的功能了。

3,組件怎么調用

組件引入:

注意:必須在需要引用的頁面最上面調用,路徑和name一定要寫對,這里的name就是組件的文件的名字。
頁面元素裝載:

<**pagingcomp** class="threecomp">

注意:用法跟text、button一樣,只是標簽名字變成了組件名字。

4,組件怎么定義入參

組件的入參需用props定義:

/* 組件可接收的參數setTotalnum,setPageount    使用時 setTotalnum 寫成 set-totalnum    setPageount 寫成 set-pageount    */    props: [setTotalnum,setPageount],

注意:組件內部props定義的參數和data定義的參數用法一樣,可以直接this.setTotalnum.

5,外部怎么傳入參數

參數傳入實例:

注意: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,外部如何綁定回調事件并獲取參數

注意:@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

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

{{ $t(strings.hello) }} {{ title }}
{{text}}

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);    }}

五、感謝大家閱讀

最后感謝大家的閱讀,為了能在harmonyos的道路上與時俱進,能和大家一同學習,++假如大家有知道的比較實用的Android插件且還未遷移到harmonyos上來的插件,請留言區告知插件名+插件源碼路徑地址++,本人想嘗試插件移植并與大家分享!再次感謝大家。

想了解更多關于鴻蒙的內容,請訪問:

51CTO和華為官方戰略合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#bkwz

::: hljs-center

:::