写在前面:

     最近公司在做微信公众号的开发,我的任务是在微信服务号中嵌套第三方页面,也就是公司自己负责的页面,技术我选的是vue,应为在之前的开发经历中并没有使用过vue,这也是一次新的尝试,当然在开发过程中会遇到一系列之前没有遇到的问题,不过这不是重点,只要有解决问题的那一刻就非常心满意足了。

因为vue的特性,页面与页面之间是通过路由的改变来请求ajax的,所以,浏览器是不会产生刷新行为的,所以,在“不同的页面”之间添加不同的标题也是一个问题,我在网上查阅了些资料后,发现问题确实是可以解决的。

主要思路:

  在网上查阅了很多资料后发现,主要思路是通过路由的改变,在路由配置里添加不同路由页面的meta属性:

vuepress页面标题目录右侧_ico

vuepress页面标题目录右侧_ajax_02

1 /*实例化vue-router*/
  2 var router = new VueRouter({
  3 	linkActiveClass:'mui-active',
  4 	routes:[
  5 		{
  6 			path:'/',redirect:"/course/courseList",
  7 		},
  8 		{
  9 			path:'/course/courseList',
 10 			component:courseList,
 11 			name:"全部课程",
 12 			meta:{
 13 				title:"全部课程"
 14 			}
 15 		},
 16 		{
 17 			path:'/course/courseInfo/:courseId',
 18 			component:courseInfo
 19 		},
 20 		{
 21 			path:'/course/myCourse',
 22 			component:myCourse,
 23 			name:"我的课桌",
 24 			meta:{
 25 				title:"我的课桌"
 26 			}
 27 		},
 28 		{
 29 			path:'/personal/personalCenter/:studentId',
 30 			component:personalCenter,
 31 			name:"个人中心",
 32 			meta:{
 33 				title:"个人中心"
 34 			}
 35 		},
 36 		{
 37 			path:'/personal/personalInfo',
 38 			component:personalInfo,
 39 			name:"个人信息",
 40 			meta:{
 41 				title:"个人信息"
 42 			}
 43 		},
 44 		{
 45 			path:'/personal/learningRecord',
 46 			component:learningRecord,
 47 			name:"学习记录",
 48 			meta:{
 49 				title:"学习记录"
 50 			}
 51 		},
 52 		{
 53 			path:'/personal/myClass',
 54 			component:myClass,
 55 			name:"我的班级",
 56 			meta:{
 57 				title:"我的班级"
 58 			}
 59 		},
 60 		{
 61 			path:'/fuli/articleList',
 62 			component:articleList,
 63 			name:"轻友福利",
 64 			meta:{
 65 				title:"轻友福利"
 66 			}
 67 		}
 68 	]
 69 });

router

在 router 中设置完成以后还需要在router.beforeEach()中设置document.title:

vuepress页面标题目录右侧_ico

vuepress页面标题目录右侧_ajax_02

1 router.beforeEach((to, from, next) => {
  2 	if (to.meta.title) {
  3 	document.title = to.meta.title
  4 	}
  5 	next()
  6 })

router.beforeEach

这样大概的样式就可以出来了:

vuepress页面标题目录右侧_ajax_05

vuepress页面标题目录右侧_ajax_06

但是这种效果只是适用于固定的标题,如果需要根据目标路由页面设置不同的标题的话,这样做就不能满足要求了,这是就需要借助于网上封装的设置微信标题的方法:(setWechatTitle):具体代码如下:

vuepress页面标题目录右侧_ico

vuepress页面标题目录右侧_ajax_02

1 const setWechatTitle = function(title) {
  2     document.title = title;
  3     let mobile = navigator.userAgent.toLowerCase();
  4     if (/iphone|ipad|ipod/.test(mobile)) {
  5         let iframe = document.createElement('iframe');
  6         iframe.style.visibility = 'hidden';
  7         let iframeCallback = function() {
  8             setTimeout(function() {
  9                 iframe.removeEventListener('load', iframeCallback)
 10                 document.body.removeChild(iframe)
 11             }, 10)
 12         };
 13         iframe.addEventListener('load', iframeCallback)
 14         document.body.appendChild(iframe)
 15     }
 16 };
 17 // 第二种修改title的方法,其中包含iframe的设置:
 18 let setTitleHack = function (t) {
 19     document.title = t;
 20     let iframe = document.createElement('iframe');
 21     iframe.style.visibility = 'hidden';
 22     iframe.style.width = '1px';
 23     iframe.style.height = '1px';
 24     // iframe.src = '//m.baidu.com/favicon.ico';
 25     iframe.onload = function () {
 26         setTimeout(function () {
 27             iframe.remove();
 28         }, 10);
 29     };
 30     document.body.appendChild(iframe);
 31 };
 32 
 33 // 在文件的最下方输出这两个方法:
 34 module.exports = {
 35     setWechatTitle,
 36     setTitleHack
 37 };

utils

将当前代码引入到要设置标题的目标路由组件中,

1 /*引入修改组件标题js*/
  2 import { setWechatTitle, setTitleHack } from '../../kits/utils.js';

并在created中调用该方法:

1 created(){
  2 	this.id = this.$route.params.courseId;//获取路由参数
  3 	setWechatTitle(this.bookInfo.title);
  4 },

这里的“this.bookInfo.title”是通过vue-resource发送请求获取到的,这里我用假数据代替的(公司后台还没有生成接口文档),这样,当前的“this.bookInfo.title”就成为了当前组件的标题,而且标题会随着title的改变而改变:

vuepress页面标题目录右侧_ajax_09