WeChatアプリケーションは、ユーザー登録イベントの実現方法を監督する。
4680 ワード
最近、小さいプログラムを開発していますが、新しいユーザーのコンテンツのプレビューを兼ねて、ユーザー登録のためにサービスを提供します。簡単に整理して、基本的な需要は以下の通りです。ウィジェットは全部で3つのtabページで、すべてのユーザーはトップページの内容を閲覧できます。私たちが提供できる良質なサービスを理解します。 は他の2つのページに入った後、ユーザーがログインしていない場合はログインボタンを表示し、ログインしたらサービス内容を表示する。 ユーザは一つのページにログインした後、グローバルに有効になります。 このような単純な需要についても、次のような反復が行われている。は登録状態と証明書をApp.global Data.authorizeに記憶し、各許可が必要なページonloadライフサイクルチェックApp.global Data.authorize.authorizedに登録し、trueの時にサービス内容をレンダリングし、falseの場合は登録ボタンを表示する。 ですが、もし許可が必要なページAを開けたら、ログインしていません。またページBを開いてログインします。この時、Aページに戻り、登録ボタンが目に見えます。これはAページのワンロードコールバック関数が一回だけ実行されたからです。 AページでBページ登録後の状態をタイムリーに共有するために、Aページのオンショーライフサイクルでもう一度ログイン状態を取得しましたが、これによってAページを開くと、短いホワイトスクリーンが現れ、ユーザーはボタンがサービスの中身になる過程を見ることができます。 小さいプログラムのAPIのドキュメントをひっくり返しても、登録を傍受するためのライフサイクルが見つかりませんでした。あっても使えません。自分のアカウントシステムを持っていますので、サービス端末の認証が終わったら、本当の登録が成功します。
だから私は自分でオリジナルのPage関数を包装することを決定して、1つのonauth生命の周期を添加します――
まず、カスタム登録イベントのトリガと傍受です。公式のEventChanelは後方互換性があります。とにかく購読フィードバックです。自分で絞るよりはいいです。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
だから私は自分でオリジナルのPage関数を包装することを決定して、1つのonauth生命の周期を添加します――
まず、カスタム登録イベントのトリガと傍受です。公式のEventChanelは後方互換性があります。とにかく購読フィードバックです。自分で絞るよりはいいです。
/**
* @file utils/event.js
*/
/**
* @const EMPTY_HANDLER
* @desc ,
*/
const EMPTY_HANDLER = () => {};
/**
* @const eventSet -
*/
const eventSet = {
authorize: []
};
/**
* @function emit -
* @param {String} type -
* @param {Object} event -
*/
export const emit = (type, event) => (eventSet[type] || []).forEach(item => item(Object.freeze(event)));
/**
* @function on -
* @param {String} type -
* @param {Function} callback -
*/
export const on = (type, callback) => {
if (!eventSet[type]) {
eventSet[type] = [];
}
if (!callback instanceof Function) {
throw new Error('callback must be a Function!');
}
return eventSet[type].push(callback)
};
/**
* @function off -
* @param {String} type -
* @param {Number} id - ID, registEvent
*/
export const off = (type, id) => {
if (!eventSet[type]) return
eventSet[type][id - 1] = EMPTY_HANDLER
// ,
const noListener = !eventSet[type].reduce((pre, cur) => (cur && cur === EMPTY_HANDLER) || pre, false);
if (noListener){
eventSet[type] = []
};
}
そして、Page関数に対する魔改です。
/**
* @file utils/auth-page.js
*/
import { on } from '/event.js';
export const AuthPage = function(options){
const { onAuth, data, onLoad } = options;
const userInfo = {
nickName: '', //
account: '', //
avatar: { //
small: '',
middle: '',
large: ''
},
title: 'student', //
phoneNumber: 0, //
gender: 'secret', //
'class': '' //
}
if (options.data){
options.data.authorized = false;
options.data.userInfo = userInfo
} else {
options.data = {
authorized: false,
userInfo: userInfo
}
}
/**
* Page
*/
Page(Object.assign(
options,
{
onLoad: function () {
const { authorize, userInfo } = getApp().globalData;
// onload
onLoad instanceof Function && onLoad.bind(this)(arguments);
// , ,
//
if (onAuth instanceof Function){
if (authorize.authorized){
onAuth.bind(this)({
type: 'authorize',
authorized: true,
token: authorize.token,
userInfo: userInfo
});
} else {
on('authorize', onAuth.bind(this));
}
}
}
}
));
}
最後に、コンポーネント登録の中で:
import { emit } from '../../utils/event.js';
wx.login({
success: res => {
// ...
getApp().globalData.authorize = {
authorized: true
};
emit('authorize', res);
}
})
そして、2つの登録が必要なtabページでAuthPageを元のPage関数に置き換え、設定項目にオンAuthフィードバックを書くと、登録イベントを傍受することができます。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。