微信小程序自定義組件 Component - 初始化頁(yè)面

一般情況下大多數(shù)頁(yè)面在加載時(shí)都需要進(jìn)行一些網(wǎng)絡(luò)檢查归薛、基礎(chǔ)配置數(shù)據(jù)的加載,而如果每個(gè)頁(yè)面都寫一遍顯然是特別愚蠢的做法,同樣是一件特別苦惱的事情主籍。
所以习贫,懶人自有懶辦法,提取通用 page init component千元,組合達(dá)到當(dāng)前小程序想要實(shí)現(xiàn)的效果苫昌。

Ta 里面有什么?

  • 頁(yè)面初始化時(shí)的網(wǎng)絡(luò)監(jiān)察
  • 頁(yè)面初始化時(shí)的必要數(shù)據(jù)加載
  • 頁(yè)面初始化時(shí)的 Loading 交互
  • 頁(yè)面初始化失敗時(shí)的提醒

實(shí)現(xiàn)結(jié)果

# 頁(yè)面初始化

# 由于網(wǎng)絡(luò)原因頁(yè)面初始化失敗

實(shí)現(xiàn)

在嘗試實(shí)現(xiàn)前幸海,先將實(shí)現(xiàn)步驟梳理和歸納一下祟身,找到其中的規(guī)律便于在接下來開發(fā)中編碼并且對(duì)于維護(hù)也能順理成章。

  1. 一個(gè) Loading 界面
  2. 一個(gè)能夠接收入?yún)⒌腻e(cuò)誤提醒界面
  3. 實(shí)現(xiàn)網(wǎng)絡(luò)檢查函數(shù)
  4. 核心配置數(shù)據(jù)請(qǐng)求
  5. 回調(diào)通知父級(jí)函數(shù)

達(dá)到以上條件物独,基本上就成功了一半袜硫,初始已具有一定模型。

component 的實(shí)現(xiàn)

init.wxml 基礎(chǔ)結(jié)構(gòu)

<view>
    <view wx:if="{{!loading && !errStatus}}">
        <slot name="page"></slot>
    </view>
    <view class="{{ (loading || errStatus) ? 'show':'' }}">
        <view>
            <!-- Loading -->
            <view wx:if="{{loading}}"><text>Loading</text></view>
            <!-- Error -->
            <view wx:if="{{errStatus}}">
                <view>
                    <view>{{errTitle}}</view>
                    <view>{{errContent}}</view>
                </view>
                <view>
                    <button>再次嘗試</button>
                    <button>回到主頁(yè)</button>
                    <button>聯(lián)系客服</button>
                </view>
            </view>

        </view>
    </view>
</view>

以上的代碼邏輯很簡(jiǎn)單
1.loadingerrStatus 均為 false 時(shí)挡篓,顯示插槽內(nèi)的內(nèi)容婉陷, slot page 插槽,就是實(shí)際 init 完成后需要顯示的內(nèi)容

  1. loadingerrStatus 任意為 true 時(shí)顯示提示官研,提示 Loading 狀態(tài)或異常狀態(tài)
  2. errTitle & errContent 則是異常時(shí)提示的內(nèi)容

init.js

Component({
    options: {
        addGlobalClass: true,
        multipleSlots: true
    },
    properties: {
        resyncUser: {
            type: Boolean,
            value: false
        },
        loopInit: {
            type: Boolean,
            value: false
        },
        autoHide: {
            type: Boolean,
            value: true
        }
    },
    data: {
        loading: true,
        errStatus: false,
        errTitle: '數(shù)據(jù)異常',
        errContent: '可能發(fā)生了未知錯(cuò)誤秽澳,請(qǐng)重試',
    },
    pageLifetimes: {
        show: function() {
            if (!this._showLoop || this.data.loopInit) {
                this.init().then(
                    () => {
                        this._showLoop = true
                    }
                )
            }
        }
    },
    observers: {
        'loading': function (loading) {
            if (loading) {
                this.setData({
                    errStatus: false
                })
            }
        },
        'errStatus': function (errStatus) {
            if (errStatus) {
                this.setData({
                    loading: false
                })
            }
        }
    },
    methods: {
        init: function(){
            return new Promise((resolve, reject) => {
                this.showLoading()
                this.network()
                    .then(
                        () => {
                            return this.user()
                        }
                    )
                    .then(
                        user => {
                            if (this.data.autoHide){
                                this.hide()
                            }
                            this.triggerEvent('callback', {
                                user: user,
                                userJSON: user.toJSON()
                            })
                            resolve()
                        }
                    )
                    .catch(
                        err => {
                            reject()
                        }
                    )
            })
        },
        user: function() {
            return new Promise((resolve, reject) => {
                getApp().user.get(this.data.sync).then(
                    user => {
                        resolve(user)
                    },
                    err => {
                        this.showError('賬戶異常', '同步賬戶時(shí)出現(xiàn)異常,請(qǐng)重新嘗試')
                        reject(err)
                    }
                )
            })
        },
        network: function() {
            return new Promise((resolve, reject) => {
                wx.getNetworkType({
                    success: res => {
                        if (res.networkType != 'none') {
                            resolve(true)
                        } else {
                            this.showError('網(wǎng)絡(luò)異常', '請(qǐng)檢查您的網(wǎng)絡(luò)連接')                            
                            reject(false)
                        }
                    },
                })
            })
        },
        hide: function(){
            this.setData({
                loading: false,
                errStatus: false
            })
        },
        showLoading: function() {
            this.setData({
                loading: true
            })
        },
        showError: function(_title, _content) {
            this.setData({
                errStatus: true,
                errTitle: _title,
                errContent: _content
            })
        }
    }
})

properties中定義組件的對(duì)外屬性阀参,便于父級(jí)頁(yè)面在引用時(shí)進(jìn)行配置肝集,在我自己小程序中,同步用戶數(shù)據(jù)是我的核心配置函數(shù)蛛壳,我需要在所有頁(yè)都同步用戶數(shù)據(jù)且配置不相同杏瞻,所有有此定義,具體細(xì)節(jié)不表了衙荐。

  1. resyncUsertrue捞挥,強(qiáng)制同步;false忧吟,引用變量緩存
  2. loopInit:表示是否需要循環(huán)初始化砌函,在 component 無法監(jiān)聽 父級(jí)的 onLoad 事件,所以父級(jí)每次 onShow 時(shí)都會(huì)被初始化溜族,該參數(shù)則決定是否要將其阻斷讹俊。ture,每次 onShow 都初始化煌抒;false仍劈,僅初始化一次
  3. autoHide 表示初始化完成后是否要自動(dòng)隱藏 init。true寡壮,初始化完成后自動(dòng)隱藏贩疙;false讹弯,初始化后的隱藏決定權(quán)交給父級(jí)

.json 配置組件

"usingComponents": {
    "INIT": "/pages/_copts/init/main"
}

.wxml 中的使用

<INIT id="init"
loopInit="{{false}}" autoHide="{{false}}"
bind:callback="init">
    <view slot="page">
        <!-- 你的代碼  -->       
    </view>
</INIT>

在具體使用該 init 的父級(jí)頁(yè)中配置 json 和引用 init 組件并對(duì)其 loopInit autoHide callback 進(jìn)行配置。
如果想直接使用这溅,也可以不用配置交給默認(rèn)值決定组民。

額外事項(xiàng)

在組件的 init.js 中我們定義多個(gè)方法,可以使用在父級(jí)節(jié)點(diǎn)使用 this.selectComponent 獲取組件示例后調(diào)用

  1. this.selectComponent('#init').hide()
  2. this.selectComponent('#init').showError('title','content')
    這里不太推薦直接訪問和修改組件的屬性悲靴,我們僅提供方法調(diào)用臭胜,交給組件自身去修改屬性避免錯(cuò)亂。

番外

其實(shí)對(duì)于初始化的辦法很多種对竣,我這里是的辦法是根據(jù)自身的小程序特性和需要而確定庇楞,具體的源碼估計(jì)對(duì)看官意義也不甚大,我就不獻(xiàn)丑了否纬。文章的意義更多的還是拋磚引玉與記錄自身在寫代碼過程中的感想體悟吕晌。如果你有想法或打臉請(qǐng)隨時(shí)留言。

以上临燃,
玩的開心睛驳!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膜廊,隨后出現(xiàn)的幾起案子乏沸,更是在濱河造成了極大的恐慌,老刑警劉巖爪瓜,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬跃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡铆铆,警方通過查閱死者的電腦和手機(jī)蝶缀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薄货,“玉大人翁都,你說我怎么就攤上這事×禄” “怎么了柄慰?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)税娜。 經(jīng)常有香客問我坐搔,道長(zhǎng),這世上最難降的妖魔是什么敬矩? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任概行,我火速辦了婚禮,結(jié)果婚禮上谤绳,老公的妹妹穿的比我還像新娘占锯。我一直安慰自己,他們只是感情好缩筛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布消略。 她就那樣靜靜地躺著,像睡著了一般瞎抛。 火紅的嫁衣襯著肌膚如雪艺演。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天桐臊,我揣著相機(jī)與錄音胎撤,去河邊找鬼。 笑死断凶,一個(gè)胖子當(dāng)著我的面吹牛伤提,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播认烁,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肿男,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了却嗡?” 一聲冷哼從身側(cè)響起舶沛,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窗价,沒想到半個(gè)月后如庭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撼港,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年坪它,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片餐胀。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哟楷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出否灾,到底是詐尸還是另有隱情卖擅,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布墨技,位于F島的核電站惩阶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扣汪。R本人自食惡果不足惜断楷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崭别。 院中可真熱鬧冬筒,春花似錦恐锣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至响牛,卻和暖如春玷禽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呀打。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工矢赁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贬丛。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓撩银,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親豺憔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜒蕾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容