Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vue微信分享 #39

Open
xiaotiandada opened this issue Jan 19, 2021 · 0 comments
Open

vue微信分享 #39

xiaotiandada opened this issue Jan 19, 2021 · 0 comments

Comments

@xiaotiandada
Copy link
Owner

2019-11-02 00:30:30

上文 配置环境

这篇主要是分享vue做微信分享

假设本地的开发环境已经准备好了!!! 👍 并且你有一个好的同事为你写好了接口😊

npm的地址

sdk
axios

npm install weixin-js-sdk #微信官方js-sdk

npm install axios #基于Promise的HTTP客户端,用于浏览器和node.js

新建一个js文件(假如他叫wechat_share.js)

import wx from 'weixin-js-sdk'
import axios from 'axios'

export default ({ title, desc, link, imgUrl }) => {
  let defaultTitle = '默认标题'
  let defaultDesc = '默认描述'
  let defaultLink = window.location.href
  let defaultimgUrl ='默认图片'
  // 通过接口获取签名信息, 传递url过去, url 需要 encodeURIComponent
  axios
    .get(`/xxx/sign?url=${encodeURIComponent(defaultLink)}`)
    .then(res => {
      if (res.status === 200 && '其他判断') {
        let { hash, timestamp, nonce } = res.data.data
        wx.config({
          debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
          appId: 'xxxxxx', // 必填,公众号的唯一标识
          timestamp, // 必填,生成签名的时间戳
          nonceStr: nonce, // 必填,生成签名的随机串
          signature: hash, // 必填,签名
          jsApiList: [
            'updateAppMessageShareData',
            'updateTimelineShareData',
            'onMenuShareAppMessage'
          ]
        })
        wx.error(function(res) {
          console.log('wechat error', res)
        })
        wx.ready(function() {
          wx.updateAppMessageShareData({
            title: title || defaultTitle,
            desc: desc || defaultDesc,
            link: link || defaultLink,
            imgUrl: imgUrl || defaultimgUrl,
            success: function() {
              console.log('wechat share success updateAppMessageShareData')
            }
          })
          wx.updateTimelineShareData({
            title: title || desc || defaultTitle,
            link: link || defaultLink,
            imgUrl: imgUrl || defaultimgUrl,
            success: function() {
              console.log('wechat share success updateTimelineShareData')
            }
          })
          // 即将废弃,适配电脑版微信,参考:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115#10
          wx.onMenuShareAppMessage({
            title: title || defaultTitle,
            desc: desc || defaultDesc,
            link: link || defaultLink,
            imgUrl: imgUrl || defaultimgUrl,
            success: function() {
              console.log('wechat share success onMenuShareAppMessage')
            }
          })
        })
      }
    })
}

封装了一个简单的方法, 用户做微信分享 我们只需要调用方法, 并且传递信息即可, 里面的标题信息可以根据自己的实际情况修改!!!

接下来只需要在使用的地方调用即可(我在全局写了一个)

// main.js
import wechatShare from 'wechat_share'
Vue.prototype.$wechatShare = wechatShare

// other.vue xxx used

this.$wechatShare({})

如果每个页面都调用一次那就太麻烦了, 利用router的钩子函数, 然后把方法放入router.js 里面, 使用 router.afterEach 方法(全局后置钩子)

// router.js
import wechatShare from 'wechat_share'

router.afterEach((to, from) => {
  wechatShare({})
})

然后每个页面都会拥有分享功能(😄😄😄😄)


但是这里有一个问题�⚠️️️️️�⚠️️️️️�⚠️️️️️, 切换页面 然后去签名的时候, 微信报错说是无效签名!!!!

原因是因为传递的localhost.href与当前页面不符合!!!

因为router.afterEach是异步的(别人这样说的)然后需要通过this.$nextTick来解决(用setTimeout也可以 但是不太好 你懂的233)

// router.js
import wechatShare from 'wechat_share'
import Vue from 'vue'

router.afterEach((to, from) => {
  Vue.nextTick(() => {
    wechatShare({})
  })
})

在router里面使用讲this.$nextTick修改为Vue.nextTick(这样就可以解决, router.afterEach获取的localhost.href与当前页面不符合的问题

然后就是一个个别页面, 需要定制化内容分享, 调用方法即可

// 异步
async xx() {
  await xx().then(() => {
      this.$wechatShare({
        title,
        desc,
        imgUrl
      })
  })
}

// 同步
this.$wechatShare({
  title,
  desc,
  imgUrl
})

如果是异步的只需要在调用完方法之后, 调用写入内容即可(🚀🚀🚀)


如果每个页面都想设置怎么办???

解决方案 在router的meta里面配置一些简单的信息即可

...
router: [
     {
      path: '/',
      name: 'index',
      component: () => import(/* webpackChunkName: "index" */ 'index.vue'),
      meta: {
        title: 'xxxxxxxxxx'
        ....
      }
    },
]
...

router.afterEach((to, from) => {
  Vue.nextTick(() => {
    wechatShare({
      title: to.meta.title
    })
  })
})

在钩子函数afterEach里面设置默认的title: to.meta.title 👍 🚀 🔥

效果图

体验地址 微信打开会自动跳转的

https://matataki.io/

效果图

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant