WeChat アプレット開発におけるミックスイン拡張機能の追加に関する詳細な説明
Mixin は、部分的に実装されたインターフェイスを使用してコードの再利用を実現するアイデアです。多重継承の問題を解決したり、関数を拡張したりするために使用できます。以下の記事では、WeChat ミニプログラムに mixin 拡張機能を追加するための関連情報を主に紹介します。必要な方は一緒に参照してください。
Mixin の紹介
Mixin (ウィービング) パターンは GOF の「デザイン パターン」の概要の 1 つではありませんが、このパターン (またはアイデア) のいくつかの応用例はさまざまな言語やフレームワークで見つけることができます。簡単に言うと、Mixin は完全または部分的に実装されたインターフェイスであり、その主な機能はコードの再利用を改善することです。
Mixin の概念は React と Vue でサポートされており、ビジネス ロジックの抽象化とコードの再利用に便利です。ただし、ネイティブ ミニ プログラム フレームワークは Mixin を直接サポートしません。まず、非常に実用的な要件を見てみましょう:
スタイル ハックを簡単に実行できるように、すべてのミニ プログラム ページに実行環境クラスを追加します。具体的には、ミニ プログラムが異なる動作環境 (開発者ツール|iOS|Android) で実行される場合、プラットフォームの値は対応する動作環境の値 ("ios|android|devtools") になります
<view class="{{platform}}"> <!--页面模板--> </view>
vue で確認するミックスインの使用
記事の冒頭で述べた問題は、ミックスインを使用して解決するのに非常に適しています。この要件を Vue の問題に変換しました。プラットフォーム スタイル クラスを各ルーティング ページに追加します (ただし、これは現実的ではないかもしれません)。実装のアイデアは、data:platform
を各ルーティング コンポーネントに追加することです。コードは次のように実装されます。 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
在前面,我们回顾了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,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;
};
Page(createPage(configObj))
このように、インデックスおよび詳細ルーティング ページの viewModel には、テンプレートで直接使用できるプラットフォーム値が含まれます。
vueのmixin分類
- データmixin
-
通常のメソッドmixin ライフサイクル メソッド mixin
rrreee
mixin 間に重複がある場合、これらの mixin は具体的な合併および実行戦略です。以下に示すように:
- 🎜
Page(configObj) - configObj を通じてミニプログラム ページのデータ、メソッド、ライフサイクルなどを設定します🎜
- 🎜onLoad メソッド - ページのメインの入り口🎜
Page()
に渡される前に大騒ぎする必要があります。実際、Page(configObj)
は通常の関数呼び出しです: 🎜🎜🎜🎜rrreee🎜 createPage メソッドでは、configObj でミックスインを前処理し、その中に設定を入れることができます。これを正しい方法で configObj にマージし、最後に Page()
に渡します。これがミックスインの実装のアイデアです。 🎜🎜🎜🎜具体的な実装🎜🎜🎜🎜具体的なコードの実装については詳しく説明しません。次のコードを参照してください。より詳細なコードの実装、その他の拡張機能、テストについては、github を参照してください🎜🎜🎜🎜rrreee🎜🎜🎜概要🎜🎜🎜🎜1 この記事では主に、小規模なプログラムに mixin サポートを追加する方法について説明します。実装のアイデアは次のとおりです。 configObj🎜🎜🎜🎜🎜rrreee🎜 2 を前処理する。ミックスインの重複を処理するときは、vue と一貫性を保つようにしてください。🎜🎜 データとメソッドがマージされ、コンポーネント自体が最も優先され、次にミックスインが続きます。後のミックスインで設定されます。 🎜🎜🎜 ライフサイクルはマージされません。まずミックスイン内のライフサイクルを順番に実行し、次にコンポーネント自体のライフサイクルを実行します。 🎜🎜🎜🎜概要🎜🎜🎜以上がWeChat アプレット開発におけるミックスイン拡張機能の追加に関する詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









モバイル インターネット技術とスマートフォンの普及により、WeChat は人々の生活に欠かせないアプリケーションになりました。 WeChat ミニ プログラムを使用すると、アプリケーションをダウンロードしてインストールすることなく、ミニ プログラムを直接使用して、いくつかの簡単なニーズを解決できます。この記事では、Python を使用して WeChat アプレットを開発する方法を紹介します。 1. 準備 Python を使用して WeChat アプレットを開発する前に、関連する Python ライブラリをインストールする必要があります。ここでは、wxpy と itchat の 2 つのライブラリを使用することをお勧めします。 wxpy は WeChat マシンです

ミニプログラムはreactを利用することができます 使い方: 1. 「react-reconciler」に基づいてレンダラーを実装し、DSLを生成します; 2. DSLを解析してレンダリングするためのミニプログラムコンポーネントを作成します; 3. npmをインストールし、開発者ビルドを実行しますツール内の npm; 4. パッケージを独自のページに導入し、API を使用して開発を完了します。

WeChat ミニ プログラムでのカードめくり効果の実装 WeChat ミニ プログラムでは、カードめくり効果の実装は、ユーザー エクスペリエンスとインターフェイス インタラクションの魅力を向上させることができる一般的なアニメーション効果です。以下では、WeChat アプレットでカードめくりの特殊効果を実装する方法と、関連するコード例を詳しく紹介します。まず、ミニ プログラムのページ レイアウト ファイルに 2 つのカード要素を定義する必要があります。1 つは前面のコンテンツを表示するため、もう 1 つは背面のコンテンツを表示するためです。具体的なサンプル コードは次のとおりです: <!--index.wxml- ->&l

10月31日の当サイトのニュースによると、今年5月27日、アント・グループは「漢字拾いプロジェクト」の立ち上げを発表し、最近新たな進展を迎えた:アリペイが「漢字拾い-珍しい文字」ミニプログラムを開始協会からコレクションを収集する レア文字は、レア文字ライブラリを補完し、アリペイでのレア文字入力方法の改善に役立つように、レア文字に異なる入力エクスペリエンスを提供します。現在、ユーザーは「漢字ピックアップ」「珍文字」などのキーワードで検索することで「珍文字」アプレットに入ることができる。ミニプログラムでは、ユーザーがシステムで認識・入力されなかった珍しい文字の画像を送信し、確認後、Alipay のエンジニアがフォントライブラリに追加エントリを作成します。当サイトでは、発音が不明瞭な珍しい単語を対象とした最新の単語分割入力方法をミニプログラムで体験できることに注目しました。ユーザー解体

uniapp がミニ プログラムと H5 の間で迅速な変換を実現するには、具体的なコード例が必要ですが、近年、モバイル インターネットの発展とスマートフォンの普及に伴い、ミニ プログラムと H5 は不可欠なアプリケーション形式となっています。クロスプラットフォーム開発フレームワークとして、uniapp は一連のコードに基づいて小規模プログラムと H5 間の変換を迅速に実現し、開発効率を大幅に向上させます。この記事では、uniapp がミニ プログラムと H5 の間で迅速な変換を実現する方法と、具体的なコード例を紹介します。 1. uniapp uniaの紹介

Vue の Mixin は非常に便利な機能で、再利用可能なコードを mixin オブジェクトにカプセル化し、mixin を使用してこれらのコードを使用する必要があるコンポーネントにコードを導入できます。この方法により、特に繰り返し行われる CRUD (追加、削除、変更) 操作において、コードの再利用性と保守性が大幅に向上します。この記事では、ミックスインを使用して Vue で CRUD 操作を実装する方法を紹介します。まず、作成方法を理解する必要があります。

実装アイデア: チャット ルームのさまざまな機能を処理するために、スレッドのサーバー側を確立します。x02 クライアントの確立はサーバーよりもはるかに簡単です。クライアントの機能はメッセージの送受信と、特定の文字を特定の規則に従って入力するため、クライアント側では、メッセージ受信専用とメッセージ送信専用の 2 つのスレッドを使用するだけで、さまざまな機能を使用できます。使用しないでください。

1. WeChat ミニ プログラムを開き、対応するミニ プログラム ページに入ります。 2. ミニ プログラム ページでメンバー関連の入り口を見つけます。通常、メンバーの入り口は下部のナビゲーション バーまたはパーソナル センターにあります。 3. メンバーシップポータルをクリックして、メンバーシップ申請ページに入ります。 4. 入会申込ページにて、携帯電話番号、氏名等の必要事項をご入力の上、送信してください。 5. ミニ プログラムは会員申請を審査します。審査に合格すると、ユーザーは WeChat ミニ プログラムの会員になることができます。 6. 会員になると、ユーザーはポイント、クーポン、会員限定アクティビティなど、より多くの会員権を享受できます。
