使用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 相关文章推荐
JS 创建对象(常见的几种方法)
Nov 03 Javascript
js url传值中文乱码之解决之道
Nov 20 Javascript
jQuery 操作下拉列表框实现代码
Feb 22 Javascript
Javascript实现动态菜单添加的实例代码
Jul 05 Javascript
jquery中get和post的简单实例
Feb 04 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
Jun 16 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
Aug 30 Javascript
微信小程序实现图片放大预览功能
Oct 22 Javascript
如何获取TypeScript的声明文件.d.ts
May 01 Javascript
小程序实现左滑删除功能
Oct 30 Javascript
JavaScript中的this原理及6种常见使用场景详解
Feb 14 Javascript
vue实现购物车案例
May 30 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
Search Engine Friendly的URL设计
2006/10/09 PHP
精通php的十大要点(上)
2009/02/04 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
JQuery实现倒计时按钮的实现代码
2012/03/23 Javascript
Javascript学习指南
2014/12/01 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
python中管道用法入门实例
2015/06/04 Python
python数据封装json格式数据
2018/03/04 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Python中的延迟绑定原理详解
2019/10/11 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
制衣厂各岗位职责
2013/12/02 职场文书
投资协议书范本
2014/04/21 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
政协委员个人总结
2015/03/03 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
降价通知函
2015/04/23 职场文书
2015年幼师工作总结
2015/04/28 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python