mpvue开发音频类小程序踩坑和建议详解

这是我第一次开发小程序,开发的产品是音频类的,在大佬的建议下采用了 mpvue ,一周时间把功能都做出来,由于不太熟悉mpvue和微信小程序,足足用了一周时间来改bug才出来一个能用的版本,在这里整理分享下我开发时遇到的一些问题和给出一些建议。

Linux 上开发小程序

在公司电脑装了双系统,日常用的是 Ubuntu 系统,Linux或Mac的开发环境对前端相对来说会友好一些。微信小程序官方的开发者工具只有 WindowsMac 版本,所以这就尴尬了。

不过还好,发现已经有大神在GitHub上做了Linux的支持,推荐给大家: Linux微信web开发者工具。 根据教程安装使用即可,使用时就用 ./bin/wxdt 命令打开。不过用了几天后面觉得不太方便,就索性切回Windows系统用官方最新的版本了。

封装wx.request为Promise

wx.request 用于发起http请求,但平时习惯了Promise的写法,所以还是封装一下这个方法为Promise的形式。 我看很多小程序会使用fly这个库。

但个人觉得发起请求不需要那么强大的功能,小程序本身就应该是一个轻量级的东西,引入一个库可能会导致项目打包变大,可能让小程序更卡,所以本着能自己写就自己写吧的心态,索性自己封装一下算了。

src/utils ,新建一个 request.js :

const apiUrl = 'https://your server.com/api/'
const request = (apiName, reqData, isShowLoading = true) => {
 // 某些请求可能不需要显示loading
 if (isShowLoading) {
 wx.showLoading({
  title: '正在努力加载中',
  mask: true
 })
 }

 return new Promise(function (resolve, reject) {
 wx.request({
  url: apiUrl + apiName,
  method: 'POST',
  data: reqData,
  header: {
  'content-type': 'application/json' // 默认值
  },
  success (res) {
  if (res.data.code === 0) {
   // 与后端约定code=0时才是正常的
   resolve(res)
  } else {
   reject(res)
  }
  },
  fail (err) {
  reject(err)
  },
  complete (res) {
  wx.hideLoading()
  }
 })
 })
}

export default request

当然这是个简化版的,我实际项目中还会在初始化时加入一些 token 之类的参数,大家能看明白是这样封装成Promise的就可以啦。

使用vant-weapp

小程序已经支持了npm安装,但不太会弄。还是按网上方法,将项目clone下来放进static目录下。

git clone https://github.com/youzan/vant-weapp.git

然后将 vant-weappdist 目录拷贝到项目的static目录下(尽可能精简,删掉一些奇奇怪怪的如 .github 的东西,所以直接使用dist目录),改名为 vant (也可以不改名)。全局使用时,可以在 app.json 引入:

 "usingComponents": {
 "van-button": "/static/vant/button/index",
 "van-field": "/static/vant/field/index"
 },

注意:需要打开微信开发者工具中的ES6转ES5功能

一开始以为使用起来和web端的没啥差别,但没想到那么麻烦。比如:在vue中是可以使用 v-model 的,但在mpvue中的小程序中不能使用,只能

<van-field :value="password" type="password" @change="pwdChange" input-class="myClass" />

而且不能随意灵活添加class修改组件的样式,需要vant组件支持提供外部样式才可修改,比如上面的 van-field 是通过 input-class 来添加样式控制的,很不方便。而且某些内部样式由于没有外部样式表,根本改不了。

综上: 在微信小程序使用第三方组件库不太方便,样式修改比较麻烦,如果产品是有UI设计时, 尽量不使用 ,有时候自己实现样式可能更快,而且项目体积更小。

使用vuex

mpvue官方的快速模板中是将vuex放在 counter 这个page目录下,可能习惯了vue官方写法的很多同学(包括我)不太喜欢,所以最好就改为vuex官方的写法。

在src目录下建一个 store 的文件夹,分别建以下文件:

项目不太复杂时不建议使用modules,使用起来比较麻烦。

贴一下 index.js 的代码,其他的 actions.js , getters.js 按官方的写法就好啦。

import Vue from 'vue'
import Vuex from 'vuex'
import * as actions from './actions'
import * as getters from './getters'
import state from './state'
import mutations from './mutations'
import createLogger from 'vuex/dist/logger'

Vue.use(Vuex)

const debug = process.env.NODE_ENV !== 'production'

export default new Vuex.Store({
 actions,
 getters,
 state,
 mutations,
 strict: debug,
 plugins: debug ? [createLogger()] : []
})

vuex/dist/logger 是vuex在开发环境可以自动打印日志的工具,debug比较方便,建议使用。 然后在 src/main.js 引入:

import Vue from 'vue'
import App from './App'
import store from '@/store'

Vue.config.productionTip = false
App.mpType = 'app'

Vue.prototype.$store = store

const app = new Vue({
 store
})
app.$mount()

这样就可以在项目中正常使用啦,完全支持 mapState , mapActions , mapGetters 的写法,比如在 pages/index/index.vue 中使用:

<script>
import { mapState, mapActions } from 'vuex'
export default {
 computed: {
 ...mapState(['myAudio'])
 },
 methods: {
 ...mapActions(['myActions'])
 },
 created () {
 this.myActions() //调用vuex中的方法
 }
}
</script>

踩坑指南

其实大多数坑可能是mpvue的,很多情况也是自己不熟悉小程序生命周期导致的一些奇奇怪怪的bug。

mpvue是支持小程序原生组件的

mpvue会将 div 编译为小程序中的 view 。一开始我不了解,以为用了mpvue后就不能使用小程序原生支持的组件了,比如 swiper , scroll-view 等,小程序是支持的,可以放心使用哈哈。

npm run build后样式丢失

本来在开发环境正常的,然后准备发版 npm run build 后发现样式丢失了。然后重新 npm start 排查问题,样式还是丢失的。内心此时是mmp的:npm run build丢失就算了,我没改什么东西重新npm start后为什么还是丢失,之前还是正常的呀?

刚开始怀疑是缓存什么的问题,删掉的dist目录,重启开发者工具,甚至重启电脑都试了一下,这是我遇到的超级诡异的问题之一。

冷静下来想到:之前的版本是正常的,一定是新版本引入了什么导致了打包样式的丢失。于是回滚版本一个个build排查问题,最后找到了原因: 在一个page中引入了其他page,即在页面中import另一个页面。

在我这里的具体例子是:我在 pages/index/index.vue 中想做底部共用一个tabbar,页面根据tabbar的值来显示对应的子级页面: pages/page1/index.vuepages/page2/index.vue

所以我将这两个页面当做子组件来引入了: import Page1 from '@/pages/page1' ,一开始没有问题,等重启项目,或者build后就发现样式丢失了。

这可能是mpvue打包机制的一个限制,即 页面不能将另一个页面当子组件来引用 ,否则会导致样式丢失。

背景音频的src无法读取

项目中希望用户退出小程序后依然能播放音频,所以用到了背景音频的api: wx.getBackgroundAudioManager()。

this.audio = wx.getBackgroundAudioManager()
this.audio.src = 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46'
this.audio.title = '此时此刻' //注意必填
this.audio.epname = '此时此刻'
this.audio.singer = '许巍'
this.audio.coverImgUrl = 'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000'

titlesrc 赋值后会直接播放音频,后面的几个属性建议也填上,因为播放背景音频时微信是有个界面需要封面图和歌手名称等的。

如果想要获取当前正在播放的音频src,本来以为通过 this.audio.src 来获取就可以了但是有bug。

在开发者工具中是可以正常获取的,即开发时是没问题的,但在真机上返回的是 undefined ,因此不能用 this.audio.src 来获取当前播放的音频url,得用一个变量来存这个数据。

直接使用音频的currentTime可能渲染不及时

currentTime用于显示当前的播放进度,但我用在子组件中时经常更新不及时,打印是正常的,但试图渲染不及时,有时候需要点击一下才能重新渲染,这可能是mpvue使用时才会遇到。

所以建议还是项目自身维护一套背景音频的变量比较好一点,比如放在 vuex 中。监听 BackgroundAudioManager.onTimeUpdate() 方法每次赋值到自身维护的变量中。

音频的onCanplay方法不一定每个音频都会触发

一开始我监听在 onCanplay 方法,将音频的时长信息 duration 赋值到vuex中存起来,但发现 onCanplay 有时候是不会触发的,比如重新赋值src播放下一首时,很尴尬。

所以不要太依赖onCanplay这个方法,还好目前直接使用 audio.duration 好像不会出现像上面的 currentTime 渲染不及时的问题,所以就这样用着先。

音频播放结束,即onStop后,不能再通过audio.play()的方法重新播放,得重新赋值src

正常来说,音频播放结束后,音频的src是不变的,再次 play() 应该是可以的。但在小程序中偏偏不行,得重新赋值src才能重新播放,这应该是小程序的一个bug。。。

所以需要判断一下 暂停停止 的情况,用不同的办法播放。正常来说,音频暂停时 currentTime 是不为0的,而结束时 currentTime 会为0。

所以可以通过 currentTime (最好是自己维护的变量)来判断暂停和停止的情况: 如果currentTime不为0,表示是暂停的情况,可以用 play() ,如果小于等于0,则重新赋值src播放 :

if (currentTime) {
 this.audio.play()
} else {
 this.audio.src = 'xx.mp3'
}

mpvue不支持直接在template上直接绑定函数

这个是mpvue文档上有写的,不过一开始并不是很理解,也踩坑了,所以在这里提一下,避免不知道的同学踩坑找半天。

<template>
 <div v-for="(item, index) in list" :key="index">{{ formatItem(item) }}</div>
</template>

<script>
export default {
 data () {
 return{
  list: [1, 2, 3]
 }
 },
 methods: {
 formatItem (item) {
  return `我是${item}`
 }
 }
}
</script>

上面的代码应该是日常vue中比较常用的,就是将数据传参给方法做一些处理,这个在mpvue中是不支持的,会被编译成一个空字符串。

小程序中可放心使用css3的一些特性

比如高斯模糊

filter: blur(50px);

如果要使用动画,尽量用 css 动画代替 wx.createAnimation

在实际使用时, wx.createAnimation 做动画其实很卡,性能很差,所以在需要使用动画时,建议尽量使用css做动画。

在小程序中是支持css动画的, transition , animation , @keyframes 这些特性都支持。

比如做一个div一直旋转的动画,大家可以对比一下两个版本:

wx.createAnimation 版本

原理:通过setInterval()不断更新div的旋转位置

<template>
 <div class="cover" :animation="animationData"></div>
</template>

<script>
export default {
 data () {
 return {
  animationData: '',
  animation: '',
  rotateCount: 0,
  timer: ''
 }
 },
 components: {

 },
 methods: {
  startRotate () {
  this.timer = setInterval(() => {
   this.rotateAni(++this.rotateCount)
  }, 100)
  },
  rotateAni (n) {
  if (!this.animation) {
   return
  }
  // 每100毫秒旋转10度
  this.animation.rotate(10 * n).step()
  this.animationData = this.animation.export()
  }
 },
 onShow () {
  // 页面从隐藏到显示时才执行
  if (!this.animation) {
  this.animation = wx.createAnimation()
  this.startRotate()
  }
 },
 onReady () {
  // 第一次初始化时会执行
  if (!this.animation) {
  this.animation = wx.createAnimation()
  this.starRotate()
  }
 },
 onHide () {
 // 页面隐藏时会执行,避免频繁的setData操作,将定时器停掉
 this.timer && clearInterval(this.timer)
 },
 beforeDestroy () {
 // 页面卸载,也停掉定时器
 this.timer && clearInterval(this.timer)
 }
}
</script>

<style scoped lang="scss">
 .cover {
 left: 20px;
 bottom: 70px;
 border-radius: 50%;
 background: #fff;
 position: absolute;
 width: 50px;
 height: 50px;
 background: rgba(0, 0, 0, 0.2);
 box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.2);
 border: 1px solid rgba(255, 255, 255, 0.5);
 overflow: hidden;
 z-index: 10000;
 }
</style>

使用css的 @keyframes 做旋转动画

<template>
 <div class="cover" :style="coverStyle"></div>
</template>

<script>
export default {
}
</script>

<style scoped lang="scss">
 // 定义一个动画名为 rotate
 @keyframes rotate {
 0%,
 100% {
  transform: rotate(0deg);
 }
 100% {
  transform: rotate(360deg);
 }
 }
 .cover {
 left: 20px;
 bottom: 70px;
 border-radius: 50%;
 background: #fff;
 position: absolute;
 width: 50px;
 height: 50px;
 background: rgba(0, 0, 0, 0.2);
 box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.2);
 border: 1px solid rgba(255, 255, 255, 0.5);
 overflow: hidden;
 z-index: 10000;
 // 使用动画
 animation: rotate 4s linear infinite;
 }
</style>

用js写的动画需要控制好setInterval的间隔时间和旋转角度,比较难调。而用css写动画很简单,性能比js好,代码量也很少。

使用css动画时建议开启硬件加速

为了动画更流畅,想尽办法做优化,虽然不知道有没效果,反正用了再说[手动滑稽]。

可以用will-changetransform: translate3d(0,0,0)开启硬件加速。我也不太会用,具体用法大家自行百度Google。

will-change: auto;
transform: translate3d(0, 0, 0);

iPhoneX需要底部导航条预留34px(68rpx)的高度

由于小程序中不能设置 viewport-fit=cover ,所以也就没有web中的安全区域说法,目前主流的做法是通过 wx.getSystemInfoSync() 判断是否是ipx,若是则给页面底部撑高34px。

const res = wx.getSystemInfoSync()
if (res.model.indexOf('iPhone X') >= 0) {
 this.isIpx = true
}

注意是用 res.model.indexOf('iPhone X') ,在开发者工具的iPhone X中,model是全等于 iPhone X 的,但在真机中往往拿到的值是 iPhone X GZxxx ,即后面可能会带一串东西,所以用 indexOf 才是比较稳的,而且对 iPhone XR 等机型也适用。

由于还有其他安卓机的全面屏,不太可能一一判断,而且某些安卓全面屏是没有用iPhone底部的工具条的(不存在冲突的情况),所以我们只判断iPhone X的情况就可以了,其他全面屏就不需要给底部预留了。

至于全面屏布局的适配,需要用 flex 布局或者获取屏幕宽高来慢慢调了,建议最好用flex布局自适应处理。

for循环中的子组件click事件无法触发

Page -> 父组件 -> 子组件 ,在子组件click后 $emit 一个事件出来,发现无法触发。

这个bug一开始没有出现,但偶然 npm run build 出现的,然后排查原因,后面即使回滚所有版本再npm start也还会出现。好像不触发则已,一发就不可收拾,这又是一个大坑,搜issue和加群问人,当晚下班回家研究到1点多都没有解决。

第二天继续研究,感觉可能是框架的原因,最后尝试升级一下mpvue版本,没想到就正常了。直接使用quick-strat项目的 mpvue 版本是 2.0.0, mpvuempvue-template-compiler 升级到最新 2.0.6 就解决了。

事后查看mpvue版本记录,果然是框架本身原因,并且找到了 issue

npm run build后代码报错,再build一次可能报另一些错

解决: 没找到原因,可能是引入vant导致的,打包时丢失了部分文件。多build几次,或者重启下小程序开发者工具就正常了。

mpvue中created() 钩子会在页面初始化时全部一起触发,尽量不要用 小程序生命周期的理解

进入已销毁的page组件时依次触发: onLoad,onShow,onReady,beforeMount,mounted

第一次进入已销毁的子组件时依次触发: onLoad,onReady,beforeMount,mounted

第二次进入已销毁的子组件时依次触发: onLoad,onShow,onReady

再次进入 未被销毁的page组件、子组件时只触发: onShow

mpvue文档中建议尽量不要使用小程序的生命周期,这个应该是为了让项目更好地适应支付宝小程序和头条小程序等,所以才这样建议大家尽量不要使用某一个小程序自身的api。

如果你们的小程序只是微信小程序(不考虑兼容其他平台小程序),我建议 直接用小程序的生命周期 ,而不要用mpvue的生命周期,坑太多了。比如mpvue的created周期,初始化时所有的page都会执行,所以created这个周期是不能用了。

onUnload不触发

小程序中与平常web开发不同的是,它的页面会被缓存。举个例子:

  1. page1 跳转到 page2 ,再从 page2 返回 page1 ,此时的 page1 还没销毁,不会触发 onLoad 再重新渲染,而是直接使用之前的数据。从性能上来说,单纯的返回不应该再请求api获取数据重新渲染,这是对的,符合我们的预期。
  2. 而有时候,从 page2 返回 page1 时,我们希望 page1 是重新获取数据渲染的。比如在 page2 做了一个退出登录的操作,此时再返回 page1 时,还是会看到之前的数据。实际上我们的预期是:由于已经退出登录了, page1 的数据应该被销毁了。

在平常的web开发中,遇到上面的问题,我们可能是不管缓存,每次返回 page1 都再次请求api渲染最新的数据,牺牲掉部分性能从而保证逻辑的正确性。

在mpvue中我也尝试这样干了:想在 page1onUnload() 生命周期中销毁数据,但是没有成功。即使在 page2 退出登录时,采用 wx.reLaunch() 重新刷一遍, page1onUnload() 生命周期也没有执行。所以 onUnload() 是有可能不执行的,建议慎用。

最后还是得想办法做到 page2 控制 page1 的数据销毁或保留 。想到这里, vuex 就不自觉浮现在眼前了,如果page1的数据是通过vuex来控制的,那么我在page2就可以用vuex来灵活管理其他页面的数据了。

如果page2做退出登录操作时,就让page1的数据销毁,如果是不退出登录正常返回,page1的数据还是正常,做到灵活控制。

个人平时web开发很少用 vuex ,因为项目比较简单不用那么复杂的全局数据传递。但在小程序中,建议全局使用 vuex 来控制所有数据(当然是得根据需求来用)。

总结

第一次开发小程序就直接上了mpvue,可能有些坑已经很多同学总结过了,有些坑可能是不熟悉而导致的,但自己没有去踩过一遍可能不够深刻。

有两种坑会比较难啃:

框架本身的问题,如mpvue2.0.0出现的子组件无法触发事件的问题。 开发者工具和真机运行环境不一致导致的坑。

遇到真机和开发者工具不一致的情况,可按以下步骤排查:

  • 有可能是缓存,可以杀掉之前的版本再跑起来
  • 手机微信版本太低,可能api不支持,用wx.canIUse打印一下
  • 手机端某些属性不支持读取,比如上面的this.audio.src,可以在真机打印调试一下
  • 代码在手机端运行有报错,可以在手机端开启调试,看一下log
  • 微信设计上的坑,百度下是否有相关的案例和解决办法

而遇到mpvue框架的问题可以:

  • 去搜一下mpvue的issue看有没相关解决办法
  • 尽量使用最新版本的框架,可能某些问题已经修复了的。实在解决不了的,建议想办法绕过,换一种方法来实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用mpvue搭建一个初始小程序及项目配置方法

     1. 初始化一个 mpvue 项目 现代前端开发框架和环境都是需要 Node.js 的,如果没有的话,请先下载 nodejs 并安装. 然后打开命令行工具: # 1. 先检查下 Node.js 是否安装成功 $ node -v v8.9.0 $ npm -v 5.6.0 # 2. 由于众所周知的原因,可以考虑切换源为 taobao 源 $ npm set registry https://registry.npm.taobao.org/ # 3. 全局安装 vue-cli # 一般是要 sud

  • mpvue+vuex搭建小程序详细教程(完整步骤)

    本文介绍了mpvue+vuex搭建小程序详细教程(完整步骤),分享给大家,具体如下: 源码 mpvue-vuex-demo 构成 1.采用mpvue 官方脚手架搭建项目底层结构 2.采用Fly.js 作为http请求库 3.引入mpvue-router-patach,以便在mpvue小程序中能使用vue-router的写法 目录结构 ├── src // 我们的项目的源码编写文件 │ ├── components // 组件目录 │ ├── common //静态资源 │ │ └── font

  • mpvue构建小程序的方法(步骤+地址)

    mpvue是一个使用Vue.js开发小程序的前端框架(美团的开源项目).框架基于Vue.js核心,mpvue修改了Vue.js的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套Vue.js开发体验. mpvue你可以使用你熟悉的vue框架语法,双向绑定让你不用再使用wx的this.setData了,你可以使用npm方便的引入第三方了,真的是贫穷限制了我的想象力啊.个人感觉mpvue比wepy更加简单,上手更加方便,mpuve五分钟教程快速构建.

  • 详解使用mpvue开发github小程序总结

    前言 最近有点闲,想起关注已久的mpvue写小程序,所以稍微肝了半个多月写了个github版的微信小程序,已上线.现在总结一下遇到的坑. 扫码体验. 项目地址:https://github.com/cheesekun/wx-github mina坑 scroll-view 高度 可滚动视图区域. 使用竖向滚动时,需要给<scroll-view/>一个固定高度,通过 WXSS 设置 height. 小程序提供的scroll-view组件,想让他能滚动,就要给他提供一个固定的高度. 我们一般需求是

  • 详解mpvue开发小程序小总结

    最近用mpvue开发了一个小程序,现总结一下碰见的问题及解决方案 1.项目中数据请求用到了fly.io,封装成request.js如下: import wx from 'wx' import Fly from 'flyio' import store from '../store/index' const fly = new Fly() fly.config.baseURL = process.env.BASE_URL fly.config.timeout = 5000 //http 请求拦截器

  • mpvue将vue项目转换为小程序

    一. mpvue简介 mpvue:是由 美团点评团队出品的小程序开 发的一款基于 vue的框架, 从整个 Vue的核心代码上经过二次开发而形成的一个框架,相当于是给Vue本身赋能,增加了开发微信小程序的能力. 使用 mpvue开发小程序,你将在小程序技术体系的基础上获取到这样一些能力: l 彻底的组件化开发能力:提高代码 l 完整的 Vue.js 开发体验 l 方便的 Vuex 数据管理方案:方便构建复杂应用 l 快捷的 webpack 构建机制:自定义构建策略.开发阶段 hotReload l

  • 基于mpvue的小程序项目搭建的步骤

    前言 mpvue 是美团开源的一套语法与vue.js一致的.快速开发小程序的前端框架,按官网说可以达到小程序与H5界面使用一套代码.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程序,或开发小程序后希望将其转换为 H5,mpvue 将是十分契合的一种解决方案. Mpvue官网:http://mpvue.com/ demo地址 :https://github.com/ccwyn/mpvuedemo/tree/mast

  • 浅谈使用mpvue开发小程序需要注意和了解的知识点

    一.实例生命周期 除了Vue本身的生命周期处,mpvue还兼容了小程序的生命周期,这部分生命周期的钩子来源于微信小程序的Page,除特殊情况外,不建议使用小程序的生命周期钩子. app 部分: onLaunch,初始化 onShow,当小程序启动,或从后台进入前台显示 onHide,当小程序从前台进入后台 page 部分: onLoad,监听页面加载 onShow,监听页面显示 onReady,监听页面初次渲染完成 onHide,监听页面隐藏 onUnload,监听页面卸载 onPullDown

  • mpvue开发音频类小程序踩坑和建议详解

    这是我第一次开发小程序,开发的产品是音频类的,在大佬的建议下采用了 mpvue ,一周时间把功能都做出来,由于不太熟悉mpvue和微信小程序,足足用了一周时间来改bug才出来一个能用的版本,在这里整理分享下我开发时遇到的一些问题和给出一些建议. 在 Linux 上开发小程序 在公司电脑装了双系统,日常用的是 Ubuntu 系统,Linux或Mac的开发环境对前端相对来说会友好一些.微信小程序官方的开发者工具只有 Windows 和 Mac 版本,所以这就尴尬了. 不过还好,发现已经有大神在Git

  • Android App跳转微信小程序踩坑实战

    最近,有一个App跳转小程序的需求,参考微信的官方文档,接入还是比较简单的,不过中途遇到了一个坑,所以记录一下. 首先,需要登录微信开放平台 微信开放平台,创建一个移动应用,然后系统会返回一个appid. 需要说明的是,不管是跳转微信小程序还是微信登录.分享,都需要先在微信开放平台注册appId.然后,就可以参考 Android APP拉取小程序的例子,在WebView中调用下面的代码(可以是直接调用,也可以是协议拦截). String appId = "wxd930ea5d5a258f4f&q

  • 基于mpvue搭建微信小程序项目框架的教程详解

    简介: mpvue框架对于从没有接触过小程序又要尝试小程序开发的人员来说,无疑是目前最好的选择.mpvue从底层支持 Vue.js 语法和构建工具体系,同时再结合相关UI组件库,便可以高效的实现小程序开发 前言: 本文讲述如何搭建完整的小程序项目框架,因为是第一次使用,有不完善的地方请大佬指正. 搭建内容包括: 1.使用scss语法:依赖插件sass-loader .node-sass 2.像vue一样使用路由:依赖插件 mpvue-entry 和 mpvue-router-patch 3.使用

  • 低门槛开发iOS、Android、小程序应用的前端框架详解

    现如今跨平台开发技术已不是什么新鲜话题了,在市面上也有一些开源的框架可供选择,然而技术成熟.产品服务健全的平台并不多,其中也不乏推陈出新的框架值得关注. 比如最近使用的AVM,由APICloud迭代推出的多端开发框架,基于JavaScript,兼容多语法,如果是Vue.React的用户,可直接上手,没什么学习成本,具备虚拟DOM,可一次编写多端渲染:主要是APICloud上线已有7年,相对已经成熟,所以我把自己的一些认知和实践结合AVM官方文档的内容做了一下整理,希望能对需要使用跨平台开发技术的

  • 微信小程序支付及退款流程详解

    首先说明一下,微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可.我在后端使用的是php,当然在这篇博客里我不打算贴一堆代码来说明支付的具体实现,而主要会侧重于整个支付的流程和一些细节方面的东西.所以使用其他后端语言的朋友有需要也是可以看一下的.很多时候开发的需求和相应问题的解决真的要跳出语言语法层面,去从系统和流程的角度考虑.好的,也不说什么废话了.进入正题. 一. 支付 支付主要分为几个步骤: 前端携带支付需要的数据(商品id,购

  • 微信小程序 本地数据存储实例详解

    微信小程序 本地数据存储实例详解 前言 如果您在看此文章之前有过其他程序的开发经验,那一定会知道一般例如安卓或者苹果的原生APP都提供了本地的存储功能,甚至可以使用sqlite数据库来做存储.可是微信的小程序框架基于微信本身,其实际运行环境只是在浏览器里面,所以不会提供那么丰富的数据存储实力.但html5开始已经可以在浏览器里面存储数据,好在微信的小程序给这个功能封装好了,这样我们可以使用数据存储. 每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStor

  • 微信小程序url与token设置详解

    微信小程序url与token设置详解 新浪云应用sae的代码里创建一个weixin.php文件,写入以下代码 define("TOKEN","myToken");// 后台填写的token,在微信公众平台启用 $wechatObj = new wechatAPI(); $wechatObj->isValid(); class wechatAPI { public function isValid()//验证微信接口,验证函数以外的代码和微信公众号开发token

  • 微信小程序-getUserInfo回调的实例详解

    微信小程序-getUserInfo回调的实例详解 前言: 这里就不吹嘘微信小程序有多厉害了,毕竟也不是我写的,直接谈谈我在做小程序开发时遇到的奇异Bug. getUserInfo多次调用: 对于wx.getUserInfo应该很多开发者都用过,用于获取用户基本信息,前提是需要用户授权,如果用户先前没有授权,则弹出一个提示框如下: 点击允许后,我们就能拿到用户信息,再进行后面的一系列操作.这一切看起来都是那么美好,可是在某次运行中,点允许授权后,程序并没有按照我们的预期往下执行.最后发现在其他的地

  • 微信小程序 合法域名校验出错详解及解决办法

    微信小程序 合法域名校验出错详解及解决办法 看下出现错误: 微信小程序开发,遇到这个问题怎么办? 产生原因是因为发起了wx.request请求 而请求的域名没有在微信公众平台后台设置. 1.开发者自己手动设置不检验 不管你有没有拿到App ID ,我相信很多人都会和我一样做一件事,就是二话不说先大概了解下文档,然后直接上github找项目,导入试试.我是这么做的,结果上来就报这个错,后来发现其实可以自己设置本地开发工具不校验域名,完全没有影响. 在"项目">最后一个选项,勾选之后

  • 微信小程序switch开关选择器使用详解

    本文为大家分享了微信小程序switch开关选择器使用方法,供大家参考,具体内容如下 效果图 WXML <view class="tui-list-box"> <view class="tui-menu-list"> <text>状态:{{isChecked1}}</text> <switch class="tui-fr" checked="{{isChecked1}}" b

随机推荐