Recommandations d'apprentissage connexes : Tutoriel de développement de mini-programmes
Lorsque nous exerçons diverses activités, nous ne pouvons pas éviter d'avoir à points d'enfouissement dans l'entreprise, ces points d'enfouissement incluent généralement, mais sans s'y limiter, l'exposition, les clics, le temps d'arrêt, la sortie de la page et d'autres scénarios. Dans le mini-programme, en raison de son architecture différente de celle du navigateur, la page de surveillance a changé. C'est plus difficile. Habituellement, nous réécrirons la méthode Page
pour intercepter le proxy du cycle de vie natif du mini programme, afin d'enterrer l'entreprise, mais dans Taro
tout devient différent.
Dans le multi-terminal unifié Taro
, on ne voit plus les appels Page
explicites, et même le Taro
code packagé ne contient plus de Page
les signes sont remplacés par le Component
natif du mini programme (vous pouvez le savoir en observant le contenu emballé), donc afin de réaliser l'intégration automatique du mini programme WeChat dans Taro
, nous avons besoin d'une autre stratégie : réécrire Component
.
Dans l'applet WeChat, les Component
et Page
exposés peuvent être directement réécrits et attribués :
const _originalComponent = Component;const wrappedComponent = function (options) { ...do something before real Component return _originalComponent(options); }复制代码
De cette façon, résolvez le problème rapidement, mais lorsque nous faisons cela dans un autre petit programme, nous devons refaire ces processus manuellement, ce qui est inévitablement un peu gênant. Pourquoi ne pas trouver une solution plus générale, nous devons uniquement nous concentrer sur ce dont nous avons besoin. Est-il suffisant de se concentrer uniquement sur ce dont nous avons besoin. activité sur laquelle vous vous concentrez ?
La priorité absolue est de penser à partir de zéro, de maîtriser le vrai problème et de se rapprocher de l'essence du problème
Avant de résoudre le problème, regardons d'abord la nature du problème. Si vous souhaitez enterrer automatiquement des points dans un mini-programme, ce que vous devez faire est d'effectuer un traitement fixe dans le cycle de vie spécifié par le mini-programme. Par conséquent, notre problème d'enfouissement automatique est en fait de savoir comment détourner le cycle de vie de. le mini programme. Pour détourner le cycle de vie de l'applet, il suffit de réécrire options
.
Avant de résoudre ce problème, nous devons séparer les problèmes que nous devons résoudre :
options
options
Notre solution de base ci-dessus a déjà la réponse sur la façon de réécrire options
Il nous suffit d'envelopper une autre couche en dehors de la méthode fournie par l'applet d'origine pour résoudre le problème. afin de garantir que notre solution puisse être appliquée aux mini-programmes natifs et aux solutions de mini-programmes unifiés multi-terminaux tels que Taro
, nous devrions prendre en charge la réécriture de Component
et Page
. js
Dans le système d'événements, nous pouvons également implémenter un ensemble de logiques de publication et d'abonnement. Il nous suffit de personnaliser l'événement déclencheur (cycle de vie) et listeners
, puis d'emballer la logique originale du cycle de vie ; >
et Component
pour éviter que la méthode d'origine ne soit contaminée et ne puisse pas revenir en arrière. procéder à tous les cycles de vie dans le mini programme. L'énumération génère un objet événement par défaut, garantissant que nous pouvons le trouver en adressant et en réécrivant la méthode du cycle de vie d'origine après avoir enregistré le Page
correspondant au cycle de vie. listeners
export const ProxyLifecycle = { ON_READY: 'onReady', ON_SHOW: 'onShow', ON_HIDE: 'onHide', ON_LOAD: 'onLoad', ON_UNLOAD: 'onUnload', CREATED: 'created', ATTACHED: 'attached', READY: 'ready', MOVED: 'moved', DETACHED: 'detached', SHOW: 'show', HIDE: 'hide', RESIZE: 'resize', };public constructor() { this.initLifecycleHooks(); this.wechatOriginalPage = getWxPage(); this.wechatOriginalComponent = getWxComponent(); }// 初始化所有生命周期的钩子函数private initLifecycleHooks(): void { this.lifecycleHooks = Object.keys(ProxyLifecycle).reduce((res, cur: keyof typeof ProxyLifecycle) => { res[ProxyLifecycle[cur]] = [] as WeappLifecycleHook[]; return res; }, {} as Record<string, WeappLifecycleHook[]>); }复制代码
public addLifecycleListener(lifeTimeOrLifecycle: string, listener: WeappLifecycleHook): OverrideWechatPage { // 针对指定周期定义Hooks this.lifecycleHooks[lifeTimeOrLifecycle].push(listener); const _Page = this.wechatOriginalPage; const _Component = this.wechatOriginalComponent; const self = this; const wrapMode = this.checkMode(lifeTimeOrLifecycle); const componentNeedWrap = ['component', 'pageLifetimes'].includes(wrapMode); const wrapper = function wrapFunc(options: IOverrideWechatPageInitOptions): string | void { const optionsKey = wrapMode === 'pageLifetimes' ? 'pageLifetimes' : ''; options = self.findHooksAndWrap(lifeTimeOrLifecycle, optionsKey, options); const res = componentNeedWrap ? _Component(options) : _Page(options); options.__router__ = (wrapper as any).__route__ = res; return res; }; (wrapper as any).__route__ = ''; if (componentNeedWrap) { overrideWxComponent(wrapper); } else { overrideWxPage(wrapper); } return this; }/** * 为对应的生命周期重写options * @param proxyLifecycleOrTime 需要拦截的生命周期 * @param optionsKey 需要重写的 optionsKey,此处用于 lifetime 模式 * @param options 需要被重写的 options * @returns {IOverrideWechatPageInitOptions} 被重写的options */private findHooksAndWrap = ( proxyLifecycleOrTime: string, optionsKey = '', options: IOverrideWechatPageInitOptions, ): IOverrideWechatPageInitOptions => { let processedOptions = { ...options }; const hooks = this.lifecycleHooks[proxyLifecycleOrTime]; processedOptions = OverrideWechatPage.wrapLifecycleOptions(proxyLifecycleOrTime, hooks, optionsKey, options); return processedOptions; };/** * 重写options * @param lifecycle 需要被重写的生命周期 * @param hooks 为生命周期添加的钩子函数 * @param optionsKey 需要被重写的optionsKey,仅用于 lifetime 模式 * @param options 需要被重写的配置项 * @returns {IOverrideWechatPageInitOptions} 被重写的options */private static wrapLifecycleOptions = ( lifecycle: string, hooks: WeappLifecycleHook[], optionsKey = '', options: IOverrideWechatPageInitOptions, ): IOverrideWechatPageInitOptions => { let currentOptions = { ...options }; const originalMethod = optionsKey ? (currentOptions[optionsKey] || {})[lifecycle] : currentOptions[lifecycle]; const runLifecycleHooks = (): void => { hooks.forEach((hook) => { if (currentOptions.__isPage__) { hook(currentOptions); } }); }; const warpMethod = runFunctionWithAop([runLifecycleHooks], originalMethod); currentOptions = optionsKey ? { ...currentOptions, [optionsKey]: { ...options[optionsKey], ...(currentOptions[optionsKey] || {}), [lifecycle]: warpMethod, }, } : { ...currentOptions, [lifecycle]: warpMethod, }; return currentOptions; };复制代码
. L'utilisation du listeners
ou du Component
remplacé les déclenchera automatiquement Page
. listeners
, j'ai implémenté un plug-in Pour résoudre ce problème (pour des raisons égoïstes) Taro
npm install weapp-lifecycle-hook-plugin 或者 yarn add weapp-lifecycle-hook-plugin复制代码
import OverrideWechatPage, { setupLifecycleListeners, ProxyLifecycle } from 'weapp-lifecycle-hook-plugin'; // 供 setupLifecycleListeners 使用的 hook 函数,接受一个参数,为当前组件/页面的options function simpleReportGoPage(options: any): void { console.log('goPage', options); } // setupListeners class App extends Component { constructor(props) { super(props); } componentWillMount() { // ... // 手动创建的实例和使用 setupLifecycleListeners 创建的实例不是同一个,所以需要销毁时需要单独对其进行销毁 // 直接调用实例方式 const instance = new OverrideWechatPage(this.config.pages); // 直接调用实例上的 addListener 方法在全局增加监听函数,可链式调用 instance.addLifecycleListener(ProxyLifecycle.SHOW, simpleReportGoPage); // setupListeners 的使用 setupLifecycleListeners(ProxyLifecycle.SHOW, [simpleReportGoPage], this.config.pages); // ... } // ... }复制代码
vous pouvez résoudre le problème de l'écriture manuelle d'un beaucoup de tâches lourdes avant. Écrivez de la logique, pourquoi ne pas le faire setup
Si vous souhaitez en savoir plus sur la programmation, faites attention à la colonneformation php !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!