使用vue完成微信公众号网页小记(推荐)


Posted in Javascript onApril 28, 2019

前言:

公司最近有一个H5页面的功能,比较简单的一个调查表功能,嵌套在我们微信公众号里面。选用的技术栈是Vue。同时用到了微信的登录和分享接口。ps:本人小白,如果有问题希望大家能指出来,写文章不止是为了记录,还是为了发现自己的问题。谢谢大噶!!!

主要功能以及遇到的问题:

  1. 左右切换动画
  2. 路由带参数跳转
  3. 移动端引入外部字体样式
  4. 使用htmtl2canvas截图功能
  5. 使用微信接口(前端部分)
  6. 移动端屏幕适配
  7. 移动端点击一个页面点击多次只执行一次问题
  8. ios使用输入框的时键盘弹起来掩盖住按钮问题
  9. 打包项目遇到静态资源加载问题

1.左右切换动画

--首先我考虑到用vue的移动端动画库,看了好久,但是项目非常小,就放弃了这个选择自己开始手写。首先我考虑到的是过渡效果。并且找到了相关的文章参考。代码如下:

`<template>
 <div id="app">
 <transition :name="'fade-'+(direction==='forward'?'last':'next')">
 <router-view></router-view>
 </transition>
 </div>
</template>
<script>
export default {
 name: "app",
 data: () => {
 return {
 direction: ""
 };
 },
 watch: {
 $route(to, from) {
 let toName = to.name;
 const toIndex = to.meta.index;
 const fromIndex = from.meta.index;
 this.direction = toIndex < fromIndex ? "forward" : "";
 }
 }
}
</script>
<style scoped>
.fade-last-enter-active {
 animation: bounce-in 0.6s;
}
.fade-next-enter-active {
 animation: bounce-out 0.6s;
}
@keyframes bounce-in {
 0% {
 transform: translateX(-100%);
 }
 100% {
 transform: translateX(0rem);
 }
}
@keyframes bounce-out {
 0% {
 transform: translateX(100%);
 }
 100% {
 transform: translateX(0rem);
 }
}
</style>

2.路由带参数跳转

这个就是记录一下,有三种方法。

1.直接在route-link:to 中带参数:

<router-link :to="{name:'home', query: {id:1}}">

2.在this.$router.push中带参数:

使用query带参数: 类似于get传参 参数会拼接到url上面

this.$router.push({name:'home',query: {id:'1'}})
this.$router.push({path:'/home',query: {id:'1'}})

使用params带参数: 只能用name 类似于post 参数不会拼接

this.$router.push({name:'home',params: {id:'1'}})

参考链接:https://3water.com/article/160401.htm

3.移动端引入外部字体样式

移动端引入外部样式,我用的是直接把字体库的字体下载下来,一般后缀为 .ttf/.otf等。在asset文件下创建 fonts文件,将字体文件全部放入。

再新建一个.css文件,相当于注册你下载的字体,可以自定义给字体们命名,不过一般还是按照以前的名字。src是文件所在的路径。

使用vue完成微信公众号网页小记(推荐)

在需要的地方使用就可以了:font-family:"PingFang"

4.使用htmtl2canvas截图功能,转换成图片

先下载html2canvas包: cnpm i html2canvas -S / import html2canvas from 'html2canvas';

查看文档 : 点击进来直接生成图片 利用微信长按保存图片功能来保存

setTimeout(() => { //这里用定时器是因为页面一加载出来我就展示的是图片 为了防止图片还未生成 给点时间
 html2canvas(document.querySelector("#top"), {
 useCORS: true, //是否尝试使用CORS从服务器加载图像 
 logging: false,//删除打印的日志 
 allowTaint: false //这个和第一个很像 但是不能同时使用 同时使用toDataURL会失效
 }).then(canvas => {
 let imageSrc = canvas.toDataURL("image/jpg"); // 转行img的路径 
 this.imageSrc = imageSrc; //定义一个动态的 :src 现在是赋值给src 图片就会展现
 this.$refs.top.style.display = "none"; // 让页面上其他元素消失 只显示图片
 });
 }, 1000);

题外话: 当时做这个的时候真的有点懵。官网文档太少了,当时遇到图片跨域问题,找了好久,可能是我没有仔细Jan官网的参数配置文件。浪费了很多时间,哭哭。

5.使用微信接口(前端部分)

我们用微信SDK接口主要是做的登录和分享功能,首先是上微信公众平台上边看看,把权限搞好之后后端配置。前端只需请求得到数据,在进行一些配置就可以。这里主要介绍分享给朋友和分享到朋友圈功能:

this.code = location.href; //首先获取code 
if (this.code.lastIndexOf("code=") != -1) {
 (this.code = this.code.substring(
 this.code.lastIndexOf("code=") + 5,
 this.code.lastIndexOf("&state")
 )),
 this.$axios
 .get("*******8?code=".concat(this.code))
 .then(function(t) { //获取后端传会来的参数 
 localStorage.setItem("unionid", t.data.unionid);
 localStorage.setItem("openid", t.data.openid);
 localStorage.setItem("nickname", t.data.nickname);
 localStorage.setItem("headimgurl", t.data.headimgurl);
 });
}
this.url = encodeURIComponent(location.href.split("#/")[0]);//获取配置的路径
this.$axios.get(`*********?url=${this.url}`).then(res => {
 this.res = res.data;
 wx.config({
 debug: false, // 开启调试模式,
 appId: res.data.appId, // 必填,企业号的唯一标识,此处填写企业号corpid
 timestamp: res.data.timestamp, // 必填,生成签名的时间戳
 nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
 signature: res.data.signature, // 必填,签名,见附录1
 jsApiList: [
 "updateAppMessageShareData",
 "updateTimelineShareData",
 "showMenuItems",
 "hideAllNonBaseMenuItem"
 ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
 });
 //参考公众平台写的:
 wx.ready(function() {
 wx.hideAllNonBaseMenuItem();
 wx.showMenuItems({
 menuList: [
 "menuItem:share:appMessage",
 "menuItem:share:timeline",
 "menuItem:favorite"
 ] // 要显示的菜单项,所有menu项见附录3
 });
 wx.updateTimelineShareData({
 title: "******", // 分享标题
 desc: "*********", // 分享描述
 link: "**********", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
 imgUrl: "******", // 分享图标
 success: function() {
 ***** 执行结束后执行的回调
 }
 });
 wx.updateAppMessageShareData({
 title: "*******", // 分享标题
 desc: "*********", // 分享描述
 link: "*********", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
 imgUrl: "********, // 分享图标
 success: function() {
 *******
 }
 });
 });
 }

6.移动端屏幕适配

现在我们移动端屏幕适配,我用的是rem,之前也有看到说有一个felxable.js的库,后来去查,说是有更好的作者放弃了,并且给我们提供了链接,哈哈哈哈真的太可爱了。准备抽时间去仔细看看,公司下一个项目又来了,真的加班了好久,为了如期完成项目,完成之后立马就新开项目,有点心累,这把应该是APP了,完全没有任何经验,嗷嗷只能硬着头皮做,还是要恰饭的,可怜的应届狗不敢造次。

下面分享一下rem适配的代码:

//默认调用一次设置
 setHtmlFontSize();
 
 function setHtmlFontSize() {
 // 1. 获取当前屏幕的宽度
 var windowWidth = document.documentElement.offsetWidth;
 // console.log(windowWidth);
 // 2. 定义标准屏幕宽度 假设375
 var standardWidth = 375;
 // 3. 定义标准屏幕的根元素字体大小 假设100px 1rem=100px 10px = 0.1rem 1px 0.01rem
 var standardFontSize = 100;
 // 4. 计算当前屏幕对应的根元素字体大小
 var nowFontSize = windowWidth / standardWidth * standardFontSize + 'px';
 // console.log(nowFontSize);
 // 5. 把当前计算的根元素的字体大小设置到html上
 document.querySelector('html').style.fontSize = nowFontSize;
 }
 // 6. 添加一个屏幕宽度变化的事件 屏幕变化就触发变化根元素字体大小计算的js 
 window.addEventListener('resize', setHtmlFontSize);

把这段代码引入到main.js里面,然后使用转换器把px转成rem 就可以了。

7.其他问题汇总

点击事件点击多次只执行一次:

可以使用.once修饰符 还有很多有用的修饰符,大家有时间可以去看看~~

使用ios输入框的时候,键盘弹起来回遮挡下面的按钮等元素的事件:

我们可以给input注册一个失去焦点事件,当失去焦点的时候设置document.body.scroolTop = 0;

打包项目遇到静态资源不展示的现象或者是路径错误:

我用的是vue-cil3,他把配置文件都放在了node_modules中,官方文档上面有介绍,如果需要修改配置,

就新建一个vue.config.js文件,他会自动的覆盖之前的文件。主要是修改成: publicPath: "./",

文档已经没有baseUrl,现在全部使用publicPath,跟着文档配置就ok了。

结尾:

我遇到的问题大致就这些,因为项目比较小,所以没有遇到太多问题。过程真的有点心酸,我独立解决问题的能力真的很一般,不知道是不是没有做程序员的潜质,出现问题就很焦虑,解决了一段时间以后,还是没有办法,就会更加焦虑。在上家公司实习的时候,我们组长指出来这个问题以后,我真的反省了好久。现在这家公司还是在实习,但是前端就一个人,小姐姐人很好,但是不用vue框架,所以遇到问题还是得单独解决。前端小姐姐是很坚韧的人,遇到问题,真的是一个一个线索的去找,不放弃那种,一开始我们要用flutter,我环境搭建搞了好久,最后是小姐姐陪我搞好的。真的走到那里都是学习的过程。我觉得坚毅真的是世界上特别珍贵的品质,渴望拥有!!!

Javascript 相关文章推荐
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
使用jQuery动态加载js脚本文件的方法
Apr 03 Javascript
jQuery中get和post方法传值测试及注意事项
Aug 08 Javascript
node.js中watch机制详解
Nov 17 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
Nov 05 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
Jan 28 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
Jun 13 Javascript
easyui combobox开启搜索自动完成功能的实例代码
Nov 08 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
axios发送post请求,提交图片类型表单数据方法
Mar 16 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
Sep 16 Javascript
详解VUE项目中安装和使用vant组件
Apr 28 #Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
Apr 28 #Javascript
vue slot与传参实例代码讲解
Apr 28 #Javascript
Vue项目从webpack3.x升级webpack4不完全指南
Apr 28 #Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
Apr 28 #jQuery
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 #Javascript
微信小程序--特定区域滚动到顶部时固定的方法
Apr 28 #Javascript
You might like
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
JS求平均值的小例子
2013/11/29 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Django中处理出错页面的方法
2015/07/15 Python
详解Python发送邮件实例
2016/01/10 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python如何使用unittest测试接口
2018/04/04 Python
使用Python进行目录的对比方法
2018/11/01 Python
python将音频进行变速的操作方法
2020/04/08 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
五好党支部事迹材料
2014/02/06 职场文书
会计专业求职信
2014/08/10 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
用JS写一个发布订阅模式
2021/11/07 Javascript
JavaScript前端面试组合函数
2022/06/21 Javascript