小程序分享鏈接功能 - onShareAppMessage


onShareAppMessage用法:

只需要在button標簽中加入open-type="share",小程序ui就會自動識別分享鏈接功能

<button data-name="shareBtn" open-type="share">分享</button>

 

js中代碼如下:

onShareAppMessage: function( options ){
  var that = this;
  // 設置菜單中的轉發按鈕觸發轉發事件時的轉發內容
  var shareObj = {
    title: "轉發的標題",        // 默認是小程序的名稱(可以寫slogan等)
    path: '/pages/share/share',        // 默認是當前頁面,必須是以‘/’開頭的完整路徑
    imageUrl: '',     //自定義圖片路徑,可以是本地文件路徑、代碼包文件路徑或者網絡圖片路徑,支持PNG及JPG,不傳入 imageUrl 則使用默認截圖。顯示圖片長寬比是 5:4
    success: function(res){
      // 轉發成功之后的回調
      if(res.errMsg == 'shareAppMessage:ok'){
      }
    },
    fail: function(){
      // 轉發失敗之后的回調
      if(res.errMsg == 'shareAppMessage:fail cancel'){
        // 用戶取消轉發
      }else if(res.errMsg == 'shareAppMessage:fail'){
        // 轉發失敗,其中 detail message 為詳細失敗信息
      }
    },
    complete: fucntion(){
      // 轉發結束之后的回調(轉發成不成功都會執行)
    }
  };
  // 來自頁面內的按鈕的轉發
  if( options.from == 'button' ){
    var eData = options.target.dataset;
    console.log( eData.id);     // shareBtn
    // 此處可以修改 shareObj 中的內容
    shareObj.path = '/pages/goods/goods?goodId='+eData.id;
  }
  // 返回shareObj
  return shareObj;
}

 

在實際應用中,會碰到這種情況:

微信小程序分享時,需要調用一個ajax(Promise)請求,然后return 一個對象,怎么同步實現?

比如:微信小程序分享時會調用 onShareAppMessage 方法,他會return 一個對象作為分享時的參數。但是我需要在他return之前調用一個ajax方法getShareCode,怎么樣同步實現?

//將字符串鏈接轉為二維碼,如:轉換前 itemid/344*fromuser/4909*shopid/75,轉換后 KtIQE4j9OP4JNGS2dsZy
getShareCode: function () {
    var that = this;
    util.request(api.CreateShareCode, {
      sharecode: 'itemid/' + that.data.productid + '*fromuser/' + user.getBuyerUserId() + '*shopid/' + that.data.shopId
    }).then(function (res) {

      if (res.statusCode === 0) {
        that.setData({ newShareCode: res.sharedata });
      }
    });
  },

  //分享功能
  onShareAppMessage: function () {
    this.getShareCode();
    let that = this;
    var newShareCode = that.data.newShareCode;
    var shareBackUrl = 'pages/goods/goods?scene=' + newShareCode;
    return {
      title: that.data.goods.title,
      path: shareBackUrl
    }
  },

 

 

嘗試用async await 和 Promise都沒有得到想要的結果。

不能用async await原因是, 如果 onShareAppMessage 是async函數,分享時會調用這個方法,但是分享的事件是走的默認的分享,沒用使用我return的參數對象。Promise同理。

而且return的對象寫到請求方法里面也會出現上面的問題:方法會被調用,但是分享事件沒有用return的參數。如下:

//分享功能
  onShareAppMessage: function () {
    var that = this;
    util.request(api.CreateShareCode, {
      sharecode: 'itemid/' + that.data.productid + '*fromuser/' + user.getBuyerUserId() + '*shopid/' + that.data.shopId
    }).then(function (res) {

      if (res.statusCode === 0) {
        var newShareCode = res.sharedata;
        var shareBackUrl = 'pages/goods/goods?scene=' + newShareCode;
        return {
          title: that.data.goods.title,
          path: shareBackUrl
        }
      }
    });
  },    

 

jQuery的ajax請求可以這么設置同步請求:

$.ajaxSetup({
    async: false
});

async 方法,別人調用的時候,會立刻返回一個Promise,而return里的path,則是在返回的那個getShareCode里獲取的。微信調用這個方法拿的是返回值,也就是一個Promise,而Promise里沒有他需要的那些參數,所以就是默認的分享了。
換句話說,這個Share回調不允許有異步操作。能改成同步就改,不能改的話,就得改代碼邏輯了。

結果發現這個Share回調還真不允許有異步操作。

曲線救國的方法就多了,比如:

1、在頁面加載的時候先請求好數據,存在data里

2、寫個阻塞的函數

3、封裝自己的分享函數onShareAppMessage實現分享參數的動態獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM