日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)百度小程序教程:自定義組件擴(kuò)展
  • 自定義組件擴(kuò)展
    • 擴(kuò)展后的效果
    • 使用擴(kuò)展
    • 真實(shí)案例

    自定義組件擴(kuò)展

    為了更好定制自定義組件的功能,可以使用自定義組件擴(kuò)展機(jī)制。

    創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),先為伊州等服務(wù)建站,伊州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為伊州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

    從小程序基礎(chǔ)庫(kù)版本 2.0.5 開(kāi)始支持。

    擴(kuò)展后的效果

    為了更好的理解擴(kuò)展后的效果,在此舉例說(shuō)明:

    代碼示例

    在開(kāi)發(fā)者工具中打開(kāi)

    在開(kāi)發(fā)者工具中打開(kāi)

    在 WEB IDE 中打開(kāi)

     
     
     
    1. // behavior.js
    2. module.exports = Behavior({
    3. definitionFilter(defFields) {
    4. defFields.data.from = 'behavior'
    5. }
    6. })
    7. // component.js
    8. Component({
    9. data: {
    10. from: 'component'
    11. },
    12. behaviors: [require('./behavior.js')],
    13. ready() {
    14. // 此處會(huì)發(fā)現(xiàn)輸出 behavior 而不是 component
    15. console.log(this.data.from)
    16. }
    17. });

    通過(guò)例子可以發(fā)現(xiàn),自定義組件的擴(kuò)展其實(shí)就是提供了修改自定義組件定義段的能力。

    使用擴(kuò)展

    Behavior() 構(gòu)造器提供了新的定義段 definitionFilter,用于支持自定義組件擴(kuò)展。 definitionFilter 是一個(gè)函數(shù),在被調(diào)用時(shí)會(huì)注入兩個(gè)參數(shù):

    • 第一個(gè)參數(shù)是使用該 behavior 的 component/behavior 的定義對(duì)象;
    • 第二個(gè)參數(shù)是該 behavior 所使用的 behavior 的 definitionFilter 函數(shù)列表。

    代碼示例

    在開(kāi)發(fā)者工具中打開(kāi)

    在開(kāi)發(fā)者工具中打開(kāi)

    在 WEB IDE 中打開(kāi)

     
     
     
    1. // behavior3.js
    2. module.exports = Behavior({
    3. definitionFilter(defFields, definitionFilterArr) {}
    4. });
    5. // behavior2.js
    6. module.exports = Behavior({
    7. behaviors: [require('./behavior3.js')],
    8. definitionFilter(defFields, definitionFilterArr) {
    9. // definitionFilterArr[0](defFields)
    10. }
    11. });
    12. // behavior1.js
    13. module.exports = Behavior({
    14. behaviors: [require('./behavior2.js')],
    15. definitionFilter(defFields, definitionFilterArr) {}
    16. });
    17. // component.js
    18. Component({
    19. behaviors: [require('./behavior1.js')]
    20. });

    說(shuō)明

    上述代碼中聲明了 1 個(gè)自定義組件和 3 個(gè) behavior,每個(gè) behavior 都使用了 definitionFilter 定義段。按照聲明的順序會(huì)有如下事情發(fā)生:

    • 當(dāng)進(jìn)行 behavior2 的聲明時(shí)就會(huì)調(diào)用 behavior3 的 definitionFilter 函數(shù),其中 defFields 參數(shù)是 behavior2 的定義段, definitionFilterArr 參數(shù)即為空數(shù)組,因?yàn)?behavior3 沒(méi)有使用其他的 behavior 。
    • 當(dāng)進(jìn)行 behavior1 的聲明時(shí)就會(huì)調(diào)用 behavior2 的 definitionFilter 函數(shù),其中 defFields 參數(shù)是 behavior1 的定義段, definitionFilterArr 參數(shù)是一個(gè)長(zhǎng)度為 1 的數(shù)組,definitionFilterArr[0] 即為 behavior3 的 definitionFilter 函數(shù),因?yàn)?behavior2 使用了 behavior3。用戶在此處可以自行決定在進(jìn)行 behavior1 的聲明時(shí)要不要調(diào)用 behavior3 的 definitionFilter 函數(shù),如果需要調(diào)用,在此處補(bǔ)充代碼 definitionFilterArr[0](defFields) 即可,definitionFilterArr 參數(shù)會(huì)由基礎(chǔ)庫(kù)補(bǔ)充傳入。
    • 同理,在進(jìn)行 component 的聲明時(shí)就會(huì)調(diào)用 behavior1 的 definitionFilter 函數(shù)。

    簡(jiǎn)單概括,definitionFilter 函數(shù)可以理解為當(dāng) A 使用了 B 時(shí),A 聲明就會(huì)調(diào)用 B 的 definitionFilter 函數(shù)并傳入 A 的定義對(duì)象讓 B 去過(guò)濾。此時(shí)如果 B 還使用了 C 和 D,那么 B 可以自行決定要不要調(diào)用 C 和 D 的 definitionFilter 函數(shù)去過(guò)濾 A 的定義對(duì)象。

    真實(shí)案例

    下面利用擴(kuò)展簡(jiǎn)單實(shí)現(xiàn)自定義組件的計(jì)算屬性功能:

    代碼示例

    在開(kāi)發(fā)者工具中打開(kāi)

    在開(kāi)發(fā)者工具中打開(kāi)

    在 WEB IDE 中打開(kāi)

     
     
     
    1. // behavior1.js
    2. module.exports = Behavior({
    3. lifetimes: {
    4. created() {
    5. // 原始 setData
    6. this._originalSetData = this.setData
    7. // 封裝后的 setData
    8. this.setData = this.methods._setData
    9. }
    10. },
    11. definitionFilter(defFields) {
    12. const computed = defFields.computed || {}
    13. const computedKeys = Object.keys(computed)
    14. const computedCache = {}
    15. // 計(jì)算 computed
    16. const calcComputed = (scope, insertToData) => {
    17. const needUpdate = {}
    18. const data = defFields.data = defFields.data || {}
    19. for (let key of computedKeys) {
    20. // 計(jì)算新值
    21. const value = computed[key].call(scope)
    22. if (computedCache[key] !== value) needUpdate[key] = computedCache[key] = value
    23. // 直接插入到 data 中,初始化時(shí)才需要的操作
    24. if (insertToData) data[key] = needUpdate[key]
    25. }
    26. return needUpdate
    27. }
    28. // 重寫(xiě) setData 方法
    29. defFields.methods = defFields.methods || {}
    30. defFields.methods._setData = function (data, callback) {
    31. // 原始 setData
    32. const originalSetData = this._originalSetData
    33. // 做 data 的 setData
    34. originalSetData.call(this, data, callback)
    35. // 計(jì)算 computed
    36. const needUpdate = calcComputed(this)
    37. // 做 computed 的 setData
    38. originalSetData.call(this, needUpdate)
    39. }
    40. // 初始化 computed
    41. // 計(jì)算 computed
    42. calcComputed(defFields, true)
    43. }
    44. })
     
     
     
    1. // 在組件js中
    2. const beh = require('./behavior1.js')
    3. Component({
    4. behaviors: [beh],
    5. data: {
    6. a: 0,
    7. },
    8. computed: {
    9. b() {
    10. return this.data.a + 100
    11. },
    12. },
    13. methods: {
    14. onTap() {
    15. this._originalSetData({
    16. a: ++this.data.a,
    17. })
    18. }
    19. }
    20. })
     
     
     
    1. data: {{a}}
    2. computed: {}

    文章標(biāo)題:創(chuàng)新互聯(lián)百度小程序教程:自定義組件擴(kuò)展
    分享鏈接:http://m.5511xx.com/article/dhhised.html