国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在小程序中實現(xiàn) Mixins 方案

chunquedong / 2549人閱讀

摘要:明白了什么是以后,便可開始著手在小程序里面實現(xiàn)了。但是在小程序中,這套機(jī)制會和的有一點區(qū)別。代碼實現(xiàn)在小程序中,每個頁面都由函數(shù)定義,而則作用于這個函數(shù)當(dāng)中的對象。函數(shù)即為小程序運行機(jī)制的具體實現(xiàn),完全按照上一節(jié)總結(jié)的三條結(jié)論來進(jìn)行。

原文來自我的博客:https://jrainlau.github.io/#/...

在原生開發(fā)小程序的過程中,發(fā)現(xiàn)有多個頁面都使用了幾乎完全一樣的邏輯。由于小程序官方并沒有提供 Mixins 這種代碼復(fù)用機(jī)制,所以只能采用非常不優(yōu)雅的復(fù)制粘貼的方式去“復(fù)用”代碼。隨著功能越來越復(fù)雜,靠復(fù)制粘貼來維護(hù)代碼顯然不科學(xué),于是便尋思著如何在小程序里面實現(xiàn) Mixins。

什么是 Mixins

Mixins 直譯過來是“混入”的意思,顧名思義就是把可復(fù)用的代碼混入當(dāng)前的代碼里面。熟悉 VueJS 的同學(xué)應(yīng)該清楚,它提供了更強(qiáng)大了代碼復(fù)用能力,解耦了重復(fù)的模塊,讓系統(tǒng)維護(hù)更加方便優(yōu)雅。

先看看在 VueJS 中是怎么使用 Mixins 的。

// define a mixin object
var myMixin = {
  created: function () {
    this.hello()
  },
  methods: {
    hello: function () {
      console.log("hello from mixin!")
    }
  }
}

// define a component that uses this mixin
var Component = Vue.extend({
  mixins: [myMixin]
})

var component = new Component() // => "hello from mixin!"

在上述的代碼中,首先定義了一個名為 myMixin 的對象,里面定義了一些生命周期函數(shù)和方法。接著在一個新建的組件里面直接通過 mixins: [myMixin] 的方式注入,此時新建的組件便獲得了來自 myMixin 的方法了。

明白了什么是 Mixins 以后,便可開始著手在小程序里面實現(xiàn)了。

Mixins 的機(jī)制

Mixins 也有一些小小的細(xì)節(jié)需要注意的,就是關(guān)于生命周期事件的執(zhí)行順序。在上一節(jié)的例子中,我們在 myMixin 里定義了一個 created() 方法,這是 VueJS 里面的一個生命周期事件。如果我們在新建組件 Component 里面也定義一個 created() 方法,那么執(zhí)行結(jié)果會是如何呢?

var Component = Vue.extend({
  mixins: [myMixin],
  created: function () {
    console.log("hello from Component!")
  }
})

var component = new Component()

// =>
// Hello from mixin!
// Hello from Component!

可以看運行結(jié)果是先輸出了來自 Mixin 的 log,再輸出來自組件的 log。

除了生命周期函數(shù)以外,再看看對象屬性的混入結(jié)果:

// define a mixin object
const myMixin = {
  data () {
    return {
      mixinData: "data from mixin"
    }
  }
}

// define a component that uses this mixin
var Component = Vue.extend({
  mixins: [myMixin],
  data () {
    return {
      componentData: "data from component"
    }
  },
  mounted () {
    console.log(this.$data)
  }
})

var component = new Component()

在 VueJS 中,會把來自 Mixins 和組件的對象屬性當(dāng)中的內(nèi)容(如 data, methods等)混合,以確保兩邊的數(shù)據(jù)都同時存在。

經(jīng)過上述的驗證,我們可以得到 VueJS 中關(guān)于 Mixins 運行機(jī)制的結(jié)論:

生命周期屬性,會優(yōu)先執(zhí)行來自 Mixins 當(dāng)中的,后執(zhí)行來自組件當(dāng)中的。

對象類型屬性,來自 Mixins 和來自組件中的會共存。

但是在小程序中,這套機(jī)制會和 VueJS 的有一點區(qū)別。在小程序中,自定義的方法是直接定義在 Page 的屬性當(dāng)中的,既不屬于生命周期類型屬性,也不屬于對象類型屬性。為了不引入奇怪的問題,我們?yōu)樾〕绦虻?Mixins 運行機(jī)制多加一條:

小程序中的自定義方法,優(yōu)先級為 Page > Mixins,即 Page 中的自定義方法會覆蓋 Mixins 當(dāng)中的。

代碼實現(xiàn)

在小程序中,每個頁面都由 Page(options) 函數(shù)定義,而 Mixins 則作用于這個函數(shù)當(dāng)中的 options 對象。因此我們實現(xiàn) Mixins 的思路就有了——劫持并改寫 Page 函數(shù),最后再重新把它釋放出來。

新建一個 mixins.js 文件:

// 保存原生的 Page 函數(shù)
const originPage = Page

Page = (options) => {
  const mixins = options.mixins
  // mixins 必須為數(shù)組
  if (Array.isArray(mixins)) {
    delete options.mixins
    // mixins 注入并執(zhí)行相應(yīng)邏輯
    options = merge(mixins, options)
  }
  // 釋放原生 Page 函數(shù)
  originPage(options)
}

原理很簡單,關(guān)鍵的地方在于 merge() 函數(shù)。merge 函數(shù)即為小程序 Mixins 運行機(jī)制的具體實現(xiàn),完全按照上一節(jié)總結(jié)的三條結(jié)論來進(jìn)行。

// 定義小程序內(nèi)置的屬性/方法
const originProperties = ["data", "properties", "options"]
const originMethods = ["onLoad", "onReady", "onShow", "onHide", "onUnload", "onPullDownRefresh", "onReachBottom", "onShareAppMessage", "onPageScroll", "onTabItemTap"]

function merge (mixins, options) {
  mixins.forEach((mixin) => {
    if (Object.prototype.toString.call(mixin) !== "[object Object]") {
      throw new Error("mixin 類型必須為對象!")
    }
    // 遍歷 mixin 里面的所有屬性
    for (let [key, value] of Object.entries(mixin)) {
      if (originProperties.includes(key)) {
        // 內(nèi)置對象屬性混入
        options[key] = { ...value, ...options[key] }
      } else if (originMethods.includes(key)) {
        // 內(nèi)置方法屬性混入,優(yōu)先執(zhí)行混入的部分
        const originFunc = options[key]
        options[key] = function (...args) {
          value.call(this, ...args)
          return originFunc && originFunc.call(this, ...args)
        }
      } else {
        // 自定義方法混入
        options = { ...mixin, ...options }
      }
    }
  })
  return options
}
Mixins 使用

在小程序的 app.js 里引入 mixins.js

require("./mixins.js")

撰寫一個 myMixin.js

module.exports = {
  data: { someData: "myMixin" },
  onShow () { console.log("Log from mixin!") }
}

page/index/index.js 中使用

Page({
  mixins: [require("../../myMixin.js")]
})

大功告成!此時小程序已經(jīng)具備 Mixins 的能力,對于代碼解耦與復(fù)用來說將會更加方便。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104845.html

相關(guān)文章

  • 程序開發(fā)經(jīng)驗:多頁面數(shù)據(jù)同步

    摘要:監(jiān)聽點贊事件廣播重點在這里我的動態(tài)頁面收到點贊變化通知進(jìn)行更新操作監(jiān)聽發(fā)布事件廣播重點在這里我的動態(tài)頁面收到發(fā)布動態(tài)通知進(jìn)行更新操作重點在這里至此,我們在小程序中完美的實現(xiàn)了跨頁面組件多頁面數(shù)據(jù)同步。 導(dǎo)語:本文主要介紹在小程序中,多頁面之間如何保持?jǐn)?shù)據(jù)同步 在很多的產(chǎn)品中,都會存在跨頁面間需要數(shù)據(jù)同步,如下示例: showImg(https://user-gold-cdn.xitu.io...

    mudiyouyou 評論0 收藏0
  • 微信小程序開發(fā)中的二三事之網(wǎng)易云信IMSDK DEMO

    摘要:傳統(tǒng)的網(wǎng)頁編程采用的三劍客來實現(xiàn),在微信小程序中同樣有三劍客。觀察者模式不難實現(xiàn),重點是如何在微信小程序中搭配其特有的生命周期來使用。交互事件傳統(tǒng)的事件傳遞類型有冒泡型與捕獲型,微信小程序中自然也有。 本文由作者鄒永勝授權(quán)網(wǎng)易云社區(qū)發(fā)布。 簡介為了更好的展示我們即時通訊SDK強(qiáng)悍的能力,網(wǎng)易云信IM SDK微信小程序DEMO的開發(fā)就提上了日程。用產(chǎn)品的話說就是: 云信 IM 小程序 S...

    weij 評論0 收藏0
  • 演示在小程序中實現(xiàn)excel數(shù)據(jù)的批量導(dǎo)入的具體代碼

      其實我們本篇文章主要講述的就是需要將采集的數(shù)據(jù)積累下來,變成企業(yè)的數(shù)字資產(chǎn)。  積累數(shù)據(jù)最好的方式就是把數(shù)據(jù)存入數(shù)據(jù)庫,低碼工具除了有可視化編程的便利外,不僅如此還有提供了線上的文檔型數(shù)據(jù)庫。文檔數(shù)據(jù)庫相比傳統(tǒng)數(shù)據(jù)庫,文檔數(shù)據(jù)庫的返回結(jié)構(gòu)是JSON格式,直接就可以在前端進(jìn)行渲染。關(guān)系型數(shù)據(jù)庫還得通過代碼進(jìn)行轉(zhuǎn)譯。  我們現(xiàn)在還講另外一個方面是文檔數(shù)據(jù)庫的類型更豐富,有附件、富文本、自動編號、數(shù)...

    3403771864 評論0 收藏0
  • 客戶端數(shù)據(jù)存儲概述

    過去十年中,瀏覽器已經(jīng)發(fā)展成為一個強(qiáng)大的工具。這是一個緩慢的過程,伴隨著許多成長之痛。現(xiàn)在,增強(qiáng)型布局控件、3D圖形和游戲,甚至是音樂都可以在小而古老的瀏覽器中實現(xiàn)。客戶端數(shù)據(jù)存儲是一個更加令人興奮的特性。 瀏覽Web的經(jīng)典過程從一開始就沒有變過:瀏覽器請求一個URL,Web服務(wù)器返回請求的內(nèi)容,然后瀏覽器請求更多的內(nèi)容,而服務(wù)器返回更多的內(nèi)容。瀏覽器似乎很健忘,它知道的所有東西都必須從服務(wù)器獲得...

    付永剛 評論0 收藏0

發(fā)表評論

0條評論

chunquedong

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<