ホームページ >WeChat アプレット >ミニプログラム開発 >ミニ プログラムの各ページが確実にログインしていることを確認する方法についての簡単な説明

ミニ プログラムの各ページが確実にログインしていることを確認する方法についての簡単な説明

青灯夜游
青灯夜游転載
2021-12-27 10:23:542231ブラウズ

WeChat アプレットはどのようにしてすべてのページがログインしていることを確認しますか?この記事では、すべてのページに確実にログインするためのミニプログラムの方法を紹介します。お役に立てば幸いです。

ミニ プログラムの各ページが確実にログインしていることを確認する方法についての簡単な説明

WeChat アプレットには、ホームページ、個人ページ、いくつかのリスト ページ、詳細ページなどがあり、これらのページのほとんどは共有できます。共有ページが別のユーザーによって開かれた場合、このページはユーザーがログインしていることをどのように確認しますか?

インターネット上には、リクエストのカプセル化にインターセプトを追加するソリューションが多数あります。トークンがない場合は、まずログイン リクエストを呼び出してトークンを取得してから続行します。 このソリューションには何も問題はありません。1 つの点に注意してください。ページ上で複数のリクエストが同時にトリガーされた場合、すべてのリクエストがインターセプトされた後、それらは配列に配置されます。トークンの取得に成功したら、単に一度に 1 つのリクエストを配列します。

しかし、この要件は少し複雑です。たとえば、チェーンのコンビニ アプレットでは、ほとんどのページに店舗が必要です (現在の店舗の商品の在庫、価格などをベースに取得する必要があるため)このストアは現在のストアをベースにしています。位置情報はバックグラウンドインターフェイスを呼び出すことで取得します。このとき、リクエストにカプセル化するのは面倒です。

解決策

まず、ログイン、位置の取得、ページリクエストが非同期であることに気付きました。ページリクエスト ログインして位置情報を取得した後ですが、ページごとに書き直すとメンテナンス性が悪すぎます。したがって、これを行う方法を抽出できます。 したがって、コードは次のようになります。

const app = getApp()
Page({
  data: {
    logs: []
  },
  onLoad() {
    app.commonLogin(()=>{
        // 处理页页面请求
    })
  }
})

これを実行すると問題は解決するように見えますが、ページごとの onShareAppMessage の統一処理など、さらにやりたい場合はもう一度考えてください。すべてのページにもう一度書きたくないのですが、さらに自分で各ページにウォッチを実装したいのですが、どうすればよいですか?

さらなる解決策

WeChat アプレット、各ページが Page() であることがわかり、このページに追加することができます。外側のシェルのレイヤーを使用すると、このページを置き換える MyPage を作成できます。これ以上の手間をかけずに、コードを次に示します:

tool.js 関連コード

/**
   * 处理合并参数
   */
  handlePageParamMerge(arg) {
    let numargs = arg.length; // 获取被传递参数的数值。
    let data = {}
    let page = {}
    for (let ix in arg) {
      let item = arg[ix]
      if (item.data && typeof (item.data) === 'object') {
        data = Object.assign(data, item.data)
      }
      if (item.methods && typeof (item.methods) === 'object') {
        page = Object.assign(page, item.methods)
      } else {
        page = Object.assign(page, item)
      }
    }
    page.data = data
    return page
  }

  /***
   * 合并页面方法以及数据, 兼容 {data:{}, methods: {}} 或 {data:{}, a:{}, b:{}}
   */
  mergePage() {
    return this.handlePageParamMerge(arguments)
  }

  /**
   * 处理组件参数合并
   */
  handleCompParamMerge(arg) {
    let numargs = arg.length; // 获取被传递参数的数值。
    let data = {}
    let options = {}
    let properties = {}
    let methods = {}
    let comp = {}
    for (let ix in arg) {
      let item = arg[ix]
      // 合并组件的初始数据
      if (item.data && typeof (item.data) === 'object') {
        data = Object.assign(data, item.data)
      }
      // 合并组件的属性列表
      if (item.properties && typeof (item.properties) === 'object') {
        properties = Object.assign(properties, item.properties)
      }
      // 合组件的方法列表
      if (item.methods && typeof (item.methods) === 'object') {
        methods = Object.assign(methods, item.methods)
      }
      if (item.options && typeof (item.options) === 'object') {
        options = Object.assign(options, item.options)
      }
      comp = Object.assign(comp, item)
    }
    comp.data = data
    comp.options = options
    comp.properties = properties
    comp.methods = methods
    return comp
  }

  /**
   * 组件混合 {properties: {}, options: {}, data:{}, methods: {}}
   */
  mergeComponent() {
    return this.handleCompParamMerge(arguments)
  }

  /***
   * 合成带watch的页面
   */
  newPage() {
    let options = this.handlePageParamMerge(arguments)
    let that = this
    let app = getApp()

    //增加全局点击登录判断
    if (!options.publicCheckLogin){
      options.publicCheckLogin = function (e) {
        let pages = getCurrentPages()
        let page = pages[pages.length - 1]
        let dataset = e.currentTarget.dataset
        let callback = null

        //获取回调方法
        if (dataset.callback && typeof (page[dataset.callback]) === "function"){
          callback = page[dataset.callback]
        }
        // console.log('callback>>', callback, app.isRegister())
        //判断是否登录
        if (callback && app.isRegister()){
          callback(e)
        }
        else{
          wx.navigateTo({
            url: '/pages/login/login'
          })
        }
      }
    }

    const { onLoad } = options
    options.onLoad = function (arg) {
      options.watch && that.setWatcher(this)
      onLoad && onLoad.call(this, arg)
    }

    const { onShow } = options
    options.onShow = function (arg) {
      if (options.data.noAutoLogin || app.isRegister()) {
        onShow && onShow.call(this, arg)
        //页面埋点
        app.ga({})
      }
      else {
        wx.navigateTo({
          url: '/pages/login/login'
        })
      }
    }

    return Page(options)
  }

  /**
   * 合成带watch等的组件
   */
  newComponent() {
    let options = this.handleCompParamMerge(arguments)
    let that = this
    const { ready } = options
    options.ready = function (arg) {
      options.watch && that.setWatcher(this)
      ready && ready.call(this, arg)
    }
    return Component(options)
  }

  /**
    * 设置监听器
    */
  setWatcher(page) {
    let data = page.data;
    let watch = page.watch;
    Object.keys(watch).forEach(v => {
      let key = v.split('.'); // 将watch中的属性以'.'切分成数组
      let nowData = data; // 将data赋值给nowData
      for (let i = 0; i < key.length - 1; i++) { // 遍历key数组的元素,除了最后一个!
        nowData = nowData[key[i]]; // 将nowData指向它的key属性对象
      }

      let lastKey = key[key.length - 1];
      // 假设key===&#39;my.name&#39;,此时nowData===data[&#39;my&#39;]===data.my,lastKey===&#39;name&#39;
      let watchFun = watch[v].handler || watch[v]; // 兼容带handler和不带handler的两种写法
      let deep = watch[v].deep; // 若未设置deep,则为undefine
      this.observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey
    })
  }

  /**
   * 监听属性 并执行监听函数
   */
  observe(obj, key, watchFun, deep, page) {
    var val = obj[key];
    // 判断deep是true 且 val不能为空 且 typeof val===&#39;object&#39;(数组内数值变化也需要深度监听)
    if (deep && val != null && typeof val === &#39;object&#39;) {
      Object.keys(val).forEach(childKey => { // 遍历val对象下的每一个key
        this.observe(val, childKey, watchFun, deep, page); // 递归调用监听函数
      })
    }
    var that = this;
    Object.defineProperty(obj, key, {
      configurable: true,
      enumerable: true,
      set: function (value) {
        if (val === value) {
          return
        }
        // 用page对象调用,改变函数内this指向,以便this.data访问data内的属性值
        watchFun.call(page, value, val); // value是新值,val是旧值
        val = value;
        if (deep) { // 若是深度监听,重新监听该对象,以便监听其属性。
          that.observe(obj, key, watchFun, deep, page);
        }
      },
      get: function () {
        return val;
      }
    })
  }

ページ コード:

app.tool.newPage({
  data: {
    // noAutoLogin: false
  },
  onShow: function () {
    // 在这里写页面请求逻辑
  }
}

最後に

#コードは長い間オンラインで実行されており、ツールの newPage パッケージを使用してニーズに応じて追加できます。つまり、私はアイデアを提供するためにここにいます。もっと良いアイデアがあれば、ぜひ共有してください。

[関連する学習の推奨事項:

小さなプログラム開発チュートリアル]

以上がミニ プログラムの各ページが確実にログインしていることを確認する方法についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。