Эта статья также размещена в моем блоге,Добро пожаловать на просмотр 😄
написать впереди
Этот проект представляет собой проект мобильного терминала, который в основном используется для доступа к услугам публичного аккаунта. В проекте используются два метода входа в систему: авторизованный логин WeChat и логин с паролем учетной записи. Для мобильных проектов, чтобы облегчить расширение проекта и обеспечить скорость горячего обновления разработки, проект разделен на разные модули, каждый модуль представляет собой одностраничное приложение. Существует два типа страниц: на первом пользователи должны войти в систему, прежде чем они смогут просматривать их, а на другом пользователи могут просматривать их без входа в систему. В любом случае общий доступ WeChat настроен.
используемая технология
- использовать vue в качестве фреймворка
- Использование vux в качестве библиотеки компонентов пользовательского интерфейса
Глобальная конфигурация WeChat для обмена идеями
- Различие между общим и специальным. В общем, глобальная конфигурация по умолчанию использует совместное копирование; есть два особых случая. Один из них заключается в том, что общий контент не нужно получать асинхронно, который настраивается при переходе маршрута, а другой - что общий контент должен быть получен асинхронно.Обновите общий контент после получения асинхронного контента.
- Для контента, который не нужно получать асинхронно, мы используем метод, определенный в метаинформации маршрутизации, и напрямую вызываем общедоступную функцию после каждого перехода маршрутизации для обновления общего контента.
Для получения подробной информации вы можете проверить WeChat JSSDKИнструкции по применению
// wxShare.js
import Vue from 'vue'
// 在组件外使用vux集成的微信jssdk
import { WechatPlugin, AjaxPlugin } from 'vux'
Vue.use(WechatPlugin)
Vue.use(AjaxPlugin)
export default function wxShare ({title, desc, timelineTitle, link, imgUrl} = {}) {
Vue.wechat.config({
debug: false,
appId: appId,
timestamp: timestamp,
nonceStr: nonceStr,
signature: signature,
jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline']
})
Vue.wechat.ready(() => {
Vue.wechat.onMenuShareAppMessage({
title: title, // 分享标题
desc: desc || '默认分享文案', // 分享描述
link: link || window.location.href, // 分享链接
imgUrl: imgUrl || '图标地址(必须是有效的Link)' // 分享图标
})
Vue.wechat.onMenuShareTimeline({
title: timelineTitle || desc || '默认分享文案', // 分享标题,由于分享到朋友圈没有desc,所以这里采用的策略是,指定的朋友圈分享标题优先,其次采用发送给朋友的描述,最后采用默认文案。
link: link || window.location.href, // 分享链接
imgUrl: imgUrl || '图标地址(必须是有效的Link)' // 分享图标
})
})
Vue.wechat.error((res) => {
})
}
// 为Vue的原型对象添加该方法,则所有vue实例都能继承该方法
Vue.prototype.$wxShare = wxShare
// router/index.js 每个模块都有自己内部的路由配置
// codes...
const routes = [
{
path: '/index',
name: 'index',
redirect: '/index/homepage',
children: [
{
path: '/index/homepage',
name: 'homepage',
component: homepage
meta: {
title: '这是主页',
shareDesc: '这是本站的主页',
desc: 'homepage, click and see!',
timelineTitle: '这是首页,欢迎点击关注,blablablablabla~~~',
imgUrl: 'http://frankzhang.me/wp-content/uploads/2017/08/cropped-favicon-01.png'
}
},
]
}
]
// routerRule,公共路由配置,所有模块共用一个路由控制策略
import wxShare from '@/utils/wxShare'
export default function routerRule (router) {
// other codes...
router.afterEach(( to, from ) => {
wxShare({ title: to.meta.title, desc: to.meta.shareDesc, link: to.meta.shareLink, logo: to.meta.shareLogo})
})
}
// main.js
import routerRule from ...
routerRule(router)
После указанной выше настройки router.afterEach вызовет wxShare один раз, повторно прочитает метаинформацию в маршрутизаторе и переопределит содержимое обмена WeChat, чтобы достичь цели объединения глобальной конфигурации и специальной конфигурации.
Общий контент, который необходимо получать асинхронно
В этом случае мы берем созданный хук экземпляра vue и один раз вызываем wxShare в успешном обратном вызове получения данных
// homepage.vue
<script>
export default {
data() {
return {
}
},
created() {
getHomepageInfo()
.then( res => {
this.$wxShare({
title: res.title,
desc: res.desc,
imgUrl: res.logo
})
} )
}
}
</script>
Пит-точки, о которых нужно знать
- Если проект принимает режим отсутствия истории, вам необходимо удалить часть после # в URL-адресе и отправить ее на серверную часть в обмен на подпись WeChat.
- Согласно официальному описанию WeChat:
Все страницы, которые должны использовать JS-SDK, должны сначала ввести информацию о конфигурации, иначе они не смогут быть вызваны (один и тот же URL-адрес нужно вызывать только один раз, а веб-приложение SPA, которое изменяет URL-адрес, может вызываться каждый раз). когда URL изменится...
Из-за приложения SPA после изменения URL-адреса его необходимо перенастроить, чтобы повторно ввести информацию о конфигурации текущей страницы, поэтому этот шаг должен быть вызван в router.afterEach! Потому что, согласно описанию vue-router, после подтверждения навигации вызывается глобальный хук afterEach.В это время навигация была подтверждена, URL-адрес изменен, и подпись WeChat может быть повторно получена для обновленный URL.
Хочу записать процесс наступания на яму с этим, есть много недочетов, надеюсь вы меня поправите!