vue-wechat-title完美解决微信网页标题问题,底层原理

1,260 阅读5分钟

前言

  • 常网IT源码上线啦!
  • 本篇录入技术选型专栏,希望能祝君拿下Offer一臂之力,各位看官感兴趣可移步🚶。
  • 有人说面试造火箭,进去拧螺丝;其实个人觉得问的问题是项目中涉及的点 || 热门的技术栈都是很好的面试体验,不要是旁门左道冷门的知识,实际上并不会用到的。
  • 接下来想分享一些自己在项目中遇到的技术选型以及问题场景。

等待是痛苦的,在我们的社会中,比等待更痛苦的,是无所事事。
当然,无所事事这个词还不够精准,再精准一些,应该叫失去角色,或身份空档期。

241b729c741e16d2af925c2af5d9ee0.jpg

御窑。

一、前言

今天像往常一样,开开心心的打代码编程。

测试说,你的网页在微信打开,不正常。

什么不正常?

说清楚点嘛!

标题不正常。

于是便有了今天这篇文章,一起来探讨一下。

当然,你也可以当做面试题。

二、分析

我们先来了解一下问题的根源。

为什么会不正常?

内置浏览器和标准浏览器有很大的不同,尤其是在处理网页的 title 标签时。微信常常会根据网页的内容、浏览的状态等因素决定展示什么标题,这意味着有时候我们在页面源码中设置的 title 并不一定会出现在微信的标签页上。

不同于其他浏览器,微信有时会缓存标题,甚至在页面切换或后退时,标题也不会即时更新。

三、vue-wechat-title:一行代码解决问题

vue-wechat-title 是一个专门为解决这个问题而设计的 Vue 插件。

它的功能非常简单,但却非常实用:通过它,可以方便地在 Vue 项目中动态修改微信内置浏览器的标题。

安装 vue-wechat-title

npm install vue-wechat-title --save
# 或者
yarn add vue-wechat-title

安装完成后,你只需要在项目的入口文件中(如 main.jsmain.ts)进行简单的配置。

import Vue from 'vue';
import WeChatTitle from 'vue-wechat-title';

Vue.use(WeChatTitle);

接下来,在你的 Vue 组件中,你只需要通过 this.$wechatTitle 来设置微信标题。例如:

export default {
  mounted() {
    this.$wechatTitle('好帅的标题');
  }
}

除了在 mounted 钩子中设置静态标题外,可以根据需要动态修改标题。

export default {
  watch: {
    '$route': function (to) {
      if (to.name === 'Home') {
        this.$wechatTitle('首页 - 我的Vue应用');
      } else if (to.name === 'About') {
        this.$wechatTitle('关于我们 - 我的Vue应用');
      }
    }
  }
}

使用还可以这样子添加到div元素

<div  v-wechat-title="我是标题"></div>

无副作用:不会影响其他浏览器,微信外的浏览器仍然按照标准的 title 标签进行展示。

四、底层原理

通过生命周期钩子函数来监听路由的变化,并在路由发生变化时动态更新页面标题。当路由变化时,可以使用 document.title 属性来设置页面的标题。

而为了避免重复代码,可以通过 Vue 的混入(mixin)机制实现这一功能。

为了确保在微信浏览器中标题能够正确显示,需要使用微信 JS-SDK 提供的 wx.ready 接口。当 JS-SDK 配置完成并准备就绪后,可以调用 wx.setDocumentTitle 方法来设置微信浏览器中的标题。这个过程可以通过 Vue.js 的插件(plugin)机制来实现,以确保与微信浏览器的兼容性和功能的完整性。

以下是vue-wechat-title的底层实现示例代码:

mixin.js

// mixin.js
export default {
  mounted() {
    this.$nextTick(() => {
      document.title = this.$route.meta.title || 'Default Title';
    });
  },
  activated() {
    this.$nextTick(() => {
      document.title = this.$route.meta.title || 'Default Title';
    });
  }
};

plugin.js

// plugin.js
export default {
  install(Vue, { setTitle }) {
    if (typeof wx === 'undefined') {
      return;
    }
    wx.ready(() => {
      setTitle(document.title);
    });
  }
};

在上述示例中,mixin.js 定义了一个混入对象,该对象会在 Vue.js 组件的 mountedactivated 生命周期钩子中被调用。每当路由发生变化时,这个混入对象会动态更新 document.title 属性,从而实现浏览器标题的实时修改。

plugin.js 定义了一个 Vue.js 插件对象,利用 Vue.js 插件机制进行配置。在插件安装时,它会检查微信 JS-SDK 是否可用,然后调用 wx.ready 接口,并在回调函数中设置微信浏览器的标题。

插件(plugin)会在Vue实例化之前被触发。使用Vue.use()方法来安装插件时,插件的install函数会被调用。

我们使用<div v-wechat-title="我是标题"></div>就可以实现,是因为用了vue的插件plugin,内部帮我们实现了上述的功能。

补充一点:使用微信 JS-SDK 动态设置微信标题

为了在微信浏览器中正确设置标题,我们需要使用微信的 JS-SDK 来调用 wx.setDocumentTitle 方法。在微信的 JS-SDK 中,在 wx.ready 接口被调用之后,修改页面标题。

引入微信的 JS-SDK,并进行初始化。

在 main.js 或单独的 js 文件中引入微信 JS-SDK

import wx from 'weixin-js-sdk';

export default {
  install(Vue) {
    // 检查微信 JS-SDK 是否准备就绪
    wx.config({
      debug: false, // 开启调试模式,发布时可以关闭
      appId: 'your-app-id', // 公众号的唯一标识
      timestamp: 1234567890, // 生成签名的时间戳
      nonceStr: 'your-nonce-str', // 生成签名的随机串
      signature: 'your-signature', // 签名
      jsApiList: ['setDocumentTitle'] // 需要使用的 JS 接口
    });

    wx.ready(() => {
      // 在微信 JS-SDK 准备好之后,动态设置标题
      document.addEventListener('DOMContentLoaded', function () {
        const pageTitle = document.title;  // 获取当前标题
        wx.setDocumentTitle(pageTitle);   // 设置微信浏览器中的标题
      });
    });

    // 当配置失败时的回调
    wx.error((error) => {
      console.error("微信配置失败:", error);
    });
  }
};

在 Vue 项目中使用微信 JS-SDK 插件

main.js 中,安装并使用上面的微信 JS-SDK 插件。

import Vue from 'vue';
import App from './App.vue';
import WeChatPlugin from './plugins/weChatPlugin';

Vue.config.productionTip = false;

// 使用微信插件
Vue.use(WeChatPlugin);

然后就可以完美而又愉快的玩耍啦~

五、有时候会遇到的问题

为什么有时标题设置了,但还是不显示?

微信有时会缓存标题,尝试手动清除缓存或刷新页面。确保设置了正确的生命周期钩子,避免过早设置标题。

插件是否兼容低版本的 Vue?

vue-wechat-title 兼容 Vue 2.x 和 Vue 3.x,可以根据你的项目版本选择合适的版本安装。

至此撒花~

后记

我们在实际项目中或多或少遇到一些奇奇怪怪的问题。

自己也会对一些写法的思考,为什么不行🤔,又为什么行了?

最后,祝君能拿下满意的offer。

我是Dignity_呱,来交个朋友呀,有朋自远方来,不亦乐乎呀!深夜末班车

👍 如果对您有帮助,您的点赞是我前进的润滑剂。

以往推荐

小小导出,我大前端足矣!

靓仔,说一下keep-alive缓存组件后怎么更新及原理?

面试官问我watch和computed的区别以及选择?

面试官问我new Vue阶段做了什么?

前端仔,快把dist部署到Nginx上

多图详解,一次性啃懂原型链(上万字)

Vue-Cli3搭建组件库

Vue实现动态路由(和面试官吹项目亮点)

项目中你不知道的Axios骚操作(手写核心原理、兼容性)

VuePress搭建项目组件文档

原文链接

juejin.cn/post/744376…