在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

微信小程序開發圖文詳細教程之增加mixin擴展

微信小程序開發圖文詳細教程之增加mixin擴展

更新時間:2025-09-27 文章作者:未知 信息來源:網絡 閱讀次數:

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
這篇文章主要介紹了關于微信小程序開發教程之增加mixin擴展,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Mixin是一種思想,用部分實現的接口來實現代碼復用。可以用來解決多繼承的問題,又可以用來擴展功能。下面這篇文章主要給大家介紹了關于為微信小程序增加mixin擴展的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

Mixin簡介

Mixin(織入)模式并不是GOF的《設計模式》歸納中的一種,但是在各種語言以及框架都會發現該模式(或者思想)的一些應用。簡單來說,Mixin是帶有全部實現或者部分實現的接口,其主要作用是更好的代碼復用。

Mixin這個概念在React, Vue中都有支持,它為我們抽象業務邏輯,代碼復用提供了方便。然而小程序原生框架并沒直接支持Mixin。我們先看一個很實際的需求:

為所有小程序頁面增加運行環境class,以方便做一些樣式hack。具體說就是小程序在不同的運行環境(開發者工具|iOS|Android)運行時,platform值為對應的運行環境值("ios|android|devtools")

<view class="{{platform}}">
 <!--頁面模板-->
</view>

回顧vue中mixin的使用

文章開始提到的問題是非常適合使用Mixin來解決的。我們把這個需求轉換成一個Vue問題:在每個路由頁面中增加一個platform的樣式class(雖然這樣做可能沒實際意義)。實現思路就是為每個路由組件增加一個data: platform。代碼實現如下:

// mixins/platform.js
const getPlatform = () => {
 // 具體實現略,這里mock返回'ios'
 return 'ios';
};

export default {
 data() {
 return {
  platform: getPlatform()
 }
 }
}
// 在路由組件中使用
// views/index.vue
import platform from 'mixins/platform';

export default {
 mixins: [platform],
 // ...
}
// 在路由組件中使用
// views/detail.vue
import platform from 'mixins/platform';

export default {
 mixins: [platform],
 // ...
}

這樣,在index,detail兩個路由頁的viewModel上就都有platform這個值,可以直接在模板中使用。

vue中mixin分類

  • data mixin

  • normal method mixin

  • lifecycle method mixin

用代碼表示的話,就如:

export default {
 data () {
 return {
  platform: 'ios'
 }
 },

 methods: {
 sayHello () {
  console.log(`hello!`)
 }
 },

 created () {
 console.log(`lifecycle3`)
 }
}

vue中mixin合并,執行策略

如果mixin間出現了重復,這些mixin會有具體的合并,執行策略。如下圖:

微信小程序開發教程之增加mixin擴展

如何讓小程序支持mixin

在前面,我們回顧了vue中mixin的相關知識。現在我們要讓小程序也支持mixin,實現vue中一樣的mixin功能。

實現思路

我們先看一下官方的小程序頁面注冊方式:

Page({
 data: {
 text: "This is page data."
 },
 onLoad: function(options) {
 // Do some initialize when page load.
 },
 onReady: function() {
 // Do something when page ready.
 },
 onShow: function() {
 // Do something when page show.
 },
 onHide: function() {
 // Do something when page hide.
 },
 onUnload: function() {
 // Do something when page close.
 },
 customData: {
 hi: 'MINA'
 }
})

假如我們加入mixin配置,上面的官方注冊方式會變成:

Page({
 mixins: [platform],
 data: {
 text: "This is page data."
 },
 onLoad: function(options) {
 // Do some initialize when page load.
 },
 onReady: function() {
 // Do something when page ready.
 },
 onShow: function() {
 // Do something when page show.
 },
 onHide: function() {
 // Do something when page hide.
 },
 onUnload: function() {
 // Do something when page close.
 },
 customData: {
 hi: 'MINA'
 }
})

這里有兩個點,我們要特別注意:

  • Page(configObj) - 通過configObj配置小程序頁面的data, method, lifecycle等

  • onLoad方法 - 頁面main入口

要想讓mixin中的定義有效,就要在configObj正式傳給Page()之前做文章。其實Page(configObj)就是一個普通的函數調用,我們加個中間方法:

Page(createPage(configObj))

在createPage這個方法中,我們可以預處理configObj中的mixin,把其中的配置按正確的方式合并到configObj上,最后交給Page() 。這就是實現mixin的思路。

具體實現

具體代碼實現就不再贅述,可以看下面的代碼。更詳細的代碼實現,更多擴展,測試可以參看github

/**
 * 為每個頁面提供mixin,page invoke橋接
 */

const isArray = v => Array.isArray(v);
const isFunction = v => typeof v === 'function';
const noop = function () {};

// 借鑒redux https://github.com/reactjs/redux
function compose(...funcs) {
 if (funcs.length === 0) {
 return arg => arg;
 }

 if (funcs.length === 1) {
 return funcs[0];
 }

 const last = funcs[funcs.length - 1];
 const rest = funcs.slice(0, -1);
 return (...args) => rest.reduceRight((composed, f) => f(composed), last(...args));
}


// 頁面堆棧
const pagesStack = getApp().$pagesStack;

const PAGE_EVENT = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage'];
const APP_EVENT = ['onLaunch', 'onShow', 'onHide', 'onError'];

const onLoad = function (opts) {
 // 把pageModel放入頁面堆棧
 pagesStack.addPage(this);

 this.$invoke = (pagePath, methodName, ...args) => {
 pagesStack.invoke(pagePath, methodName, ...args);
 };

 this.onBeforeLoad(opts);
 this.onNativeLoad(opts);
 this.onAfterLoad(opts);
};

const getMixinData = mixins => {
 let ret = {};

 mixins.forEach(mixin => {
 let { data={} } = mixin;

 Object.keys(data).forEach(key => {
  ret[key] = data[key];
 });
 });

 return ret;
};

const getMixinMethods = mixins => {
 let ret = {};

 mixins.forEach(mixin => {
 let { methods={} } = mixin;

 // 提取methods
 Object.keys(methods).forEach(key => {
  if (isFunction(methods[key])) {
  // mixin中的onLoad方法會被丟棄
  if (key === 'onLoad') return;

  ret[key] = methods[key];
  }
 });

 // 提取lifecycle
 PAGE_EVENT.forEach(key => {
  if (isFunction(mixin[key]) && key !== 'onLoad') {
  if (ret[key]) {
   // 多個mixin有相同lifecycle時,將方法轉為數組存儲
   ret[key] = ret[key].concat(mixin[key]);
  } else {
   ret[key] = [mixin[key]];
  }
  }
 })
 });

 return ret;
};

/**
 * 重復沖突處理借鑒vue:
 * data, methods會合并,組件自身具有最高優先級,其次mixins中后配置的mixin優先級較高
 * lifecycle不會合并。先順序執行mixins中的lifecycle,再執行組件自身的lifecycle
 */

const mixData = (minxinData, nativeData) => {
 Object.keys(minxinData).forEach(key => {
 // page中定義的data不會被覆蓋
 if (nativeData[key] === undefined) {
  nativeData[key] = minxinData[key];
 }
 });

 return nativeData;
};

const mixMethods = (mixinMethods, pageConf) => {
 Object.keys(mixinMethods).forEach(key => {
 // lifecycle方法
 if (PAGE_EVENT.includes(key)) {
  let methodsList = mixinMethods[key];

  if (isFunction(pageConf[key])) {
  methodsList.push(pageConf[key]);
  }

  pageConf[key] = (function () {
  return function (...args) {
   compose(...methodsList.reverse().map(f => f.bind(this)))(...args);
  };
  })();
 }

 // 普通方法
 else {
  if (pageConf[key] == null) {
  pageConf[key] = mixinMethods[key];
  }
 }
 });

 return pageConf;
};

export default pageConf => {

 let {
 mixins = [],
 onBeforeLoad = noop,
 onAfterLoad = noop
 } = pageConf;

 let onNativeLoad = pageConf.onLoad || noop;
 let nativeData = pageConf.data || {};

 let minxinData = getMixinData(mixins);
 let mixinMethods = getMixinMethods(mixins);

 Object.assign(pageConf, {
 data: mixData(minxinData, nativeData),
 onLoad,
 onBeforeLoad,
 onAfterLoad,
 onNativeLoad,
 });

 pageConf = mixMethods(mixinMethods, pageConf);

 return pageConf;
};

小結

1、本文主要講了如何為小程序增加mixin支持。實現思路為:預處理configObj

Page(createPage(configObj))

2、在處理mixin重復時,與vue保持一致:

data, methods會合并,組件自身具有最高優先級,其次mixins中后配置的mixin優先級較高。

lifecycle不會合并。先順序執行mixins中的lifecycle,再執行組件自身的lifecycle。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

微信小程序中跳轉頁面的兩種方法

微信開發之js實現tabs選項卡效果

以上就是微信小程序開發教程之增加mixin擴展的詳細內容,更多請關注php中文網其它相關文章!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 午夜视频在线瓜伦| 大肉大捧一进一出好爽动态图| 中文精品无码中文字幕无码专区| 久久久久狠狠高潮亚洲精品| 国产乱子伦精品视频| 国产永久免费网站| 亚欧激情乱码久久久久久久久| 欧美黄色一级片视频| 免费人成自慰网站| 丰满人妻一区二区三区53号| 男女视频在线观看网站| 色诱视频在线观看| 日韩欧美黄色大片| 国产三区在线视频| 久久精品网站视频| 日韩一级理论片| 久久精品视频91| 日本特黄a级片| 五月婷婷狠狠操| 天天操狠狠操夜夜操| 国产精品久久a| 国产资源中文字幕| 国产在线无码精品| 精品视频在线观看一区| 欧美在线一区视频| 日本一极黄色片| 性chinese极品按摩| 国产xxxxhd| 免费视频爱爱太爽了| 国产无套内射久久久国产| 亚洲综合色在线观看| av电影一区二区三区| 日本欧美黄色片| 黄色片视频在线播放| 国产又猛又黄的视频| 亚洲欧美日韩网站| 男人添女人下部视频免费| 免费国产a级片| 国产精品视频黄色| 黄色一级片av| 久久久久狠狠高潮亚洲精品| 99999精品| 欧美亚洲一二三区| 国产成年人视频网站| 国产无限制自拍| 中文字幕国内自拍| 中文字幕色呦呦| 国产熟人av一二三区| 日本三日本三级少妇三级66| 欧美 国产 综合| 欧美一级xxxx| 欧美亚洲国产成人| 特色特色大片在线| 久久久久久香蕉| av免费观看国产| 国产毛片久久久久久| 久久人妻精品白浆国产| 热久久最新网址| 婷婷中文字幕在线观看| 黑人糟蹋人妻hd中文字幕| 色偷偷中文字幕| 日韩精品你懂的| 久久久久久久久久久久久国产精品| 伊人五月天婷婷| 亚洲国产成人va在线观看麻豆| 亚洲熟妇av一区二区三区漫画| 成人手机在线播放| 九九久久久久久| 日韩一级理论片| 香蕉视频网站入口| 欧美亚洲一二三区| 97在线国产视频| 大地资源网在线观看免费官网| 在线能看的av网站| 国产男女激情视频| 欧美黄网站在线观看| 国模吧无码一区二区三区| 男的插女的下面视频| 成年人深夜视频| 精品视频在线观看一区| 18黄暴禁片在线观看| 99久久免费观看| 成人在线观看你懂的| 国内精品在线观看视频| 亚洲熟妇国产熟妇肥婆| 高清欧美精品xxxxx| 国产一区二区四区| 欧美男女爱爱视频| 99精品在线免费视频| 国产中文字幕在线免费观看| 青青草原成人网| 欧美v在线观看| 日韩一级免费片| 99999精品| 国产天堂视频在线观看| 欧美日韩黄色一级片| wwwwxxxx日韩| 欧美精品久久96人妻无码| 欧美国产综合在线| 91精品91久久久中77777老牛| 国产又猛又黄的视频| 日本一二三四区视频| 大胆欧美熟妇xx| 国产av人人夜夜澡人人爽| 成人av毛片在线观看| 欧美狂野激情性xxxx在线观| 青青青在线视频免费观看| 成人不卡免费视频| 无码粉嫩虎白一线天在线观看| 日日碰狠狠躁久久躁婷婷| 国产精品嫩草影院8vv8| 波多野结衣av一区二区全免费观看 | 免费超爽大片黄| 中国女人做爰视频| 日韩无套无码精品| 777久久精品一区二区三区无码| 欧在线一二三四区| 亚洲高清在线不卡| 浮妇高潮喷白浆视频| 搡的我好爽在线观看免费视频| 男人天堂网视频| 免费成人深夜夜行网站视频| 91猫先生在线| 黄色一级片国产| 国产精品区在线| 欧美成人黑人猛交| 免费在线观看视频a| 亚洲av综合色区| 午夜精品免费看| 超碰影院在线观看| 国产中文字幕二区| 日本a级片在线播放| 午夜视频在线网站| 污污网站免费看| 午夜精品在线免费观看| 蜜臀av无码一区二区三区| 亚洲小说欧美另类激情| 中文字幕国产免费| 亚洲欧美自偷自拍另类| 日韩中文字幕组| 激情婷婷综合网| 日韩毛片在线免费看| 欧美aⅴ在线观看| 国产免费黄色一级片| 亚洲精品久久久久久久蜜桃臀| 黄色高清视频网站| 亚洲最新免费视频| 亚洲精品免费一区亚洲精品免费精品一区 | 激情五月婷婷六月| 午夜激情影院在线观看| 怡红院亚洲色图| 久久精品国产露脸对白| 国产三级三级三级看三级| 91视频 -- 69xx| 黄色成人免费看| 可以看污的网站| 2025韩国大尺度电影| 成人性生交视频免费观看| 女人床在线观看| 男人的天堂99| 欧美成人手机在线视频| 国产日韩第一页| 日韩a在线播放| xxxx在线免费观看| 黄色一级片av| 成人中文字幕在线播放| 免费国产成人av| 大桥未久一区二区三区| 国产一二三区在线播放| 成年人在线观看视频免费| 肉色超薄丝袜脚交| av网站大全免费| 黄色高清无遮挡| 日本女人高潮视频| 中文字幕无码精品亚洲35| 中文字幕中文在线| 极品粉嫩国产18尤物| 91香蕉视频导航| 精品一二三四五区| 国产喷水theporn| www.亚洲成人网| 午夜剧场在线免费观看| 男人添女人荫蒂免费视频| 日韩在线不卡一区| 国产精品丝袜久久久久久消防器材| 日韩av加勒比| 欧美 日韩 国产 激情| 国产精品igao激情视频 | 欧美午夜小视频| 操人视频免费看| 成人性视频欧美一区二区三区| 色婷婷777777仙踪林| 美女黄色片视频| 六月丁香婷婷激情| 国产精品av免费观看| 天天看片天天操| 欧美黑人又粗又大又爽免费| 亚洲人精品午夜射精日韩| 做爰高潮hd色即是空| 成人在线激情网|