微信小程序 常见问题总结(4058,40013)及解决办法


Posted in Javascript onJanuary 11, 2017

微信小程序 常见问题:

一:项目结构

微信小程序项目结构主要有四个文件类型,如下

WXML (WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。内部主要是微信自己定义的一套组件。

WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式,

js 逻辑处理,网络请求

json 小程序设置,如页面注册,页面标题及tabBar。

注意:为了方便开发者减少配置项,规定描述页面的这四个文件必须具有相同的路径与文件名。

在根目录下用app来命名的这四中类型的文件,就是程序入口文件。

app.json

必须要有这个文件,如果没有这个文件,项目无法运行,因为微信框架把这个作为配置文件入口,整个小程序的全局配置。包括页面注册,网络设置,以及小程序的window背景色,配置导航条样式,配置默认标题。

app.js

必须要有这个文件,没有也是会报错!但是这个文件创建一下就行 什么都不需要写
以后我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量。

app.wxss

全局配置的样式文件,项目非必须。

知道小程序基本文件结构,就可以开始研究官方demo了,研究过程中如果有不明白的地方可以去官方文档寻求答案,如果找不到答案或者有疑问,可再此博客留言,相互交流。下面介绍下出现概率较高的几个问题。

二:常见问题

rpx(responsive pixel)

微信小程序新定义了一个尺寸单位,可以适配不同分辨率的屏幕,它规定屏幕宽为750rpx,如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

这个项目我用的都是rpx尺寸单位,期间遇到一个很奇葩的问题。在相邻的两条信息直接都会有一个分割线,我将线的高度都设置成1rpx,但是不有个别分割线是不显示的

看到没在第一条和第二条直接并没有现实这条线,但是其他的都展示了,分割线的属性是一样的,而且在不同的手机上(分辨率不同)不显示的分割线也是不同的,有的分辨率好几条分割线都不显示,不知道这是模拟器的bug还是rpx的bug。最后分割线的高度尺寸单位使用了px,解决了这个问题。

40013错误

在微信小程序刚出来的时候如果输入AppID提示这个信息就表示没有破解,但是现在官方软件更新可以选择无AppID开发,如下图,我们之间选择无AppID,即可解决此错误。建议安装官方开发工具。可去此处找下载链接。

4058错误

微信小程序创建项目时选择无AppID,创建项目时会生成app.json,app.josn是程序启动最重要的文件,程序的页面注册,窗口设置,tab设置及网络请求时间设置都是在此文件下的。如果你创建的项目目录下没有app.json文件就会报下面的错误。

我们看到上面的错误信息中有个数字-4058,这应该是初入微信小程序遇到最多的错误了,这种一般都是文件缺失,后面有个path,可以对着该路径看看是否存在这个文件。造成这种错误的原因一般都是创建项目选择的目录不正确,或者在app.json注册了一个不存在的页面。

当然还有一种情况就是在app.json文件的pages注册的页面是没有创建的,或者你删除了某个页面,但是没有取消注册也会是-4058错误。

Page注册错误

这个错误可能很容易理解,页面注册错误。页面是通过Page对象来渲染的,每个页面对应的js文件必须要创建page,最简单的方式就是在js文件下写入Page({}),在page中有管理页面渲染的生命周期,以及数据处理,事件都在这完成。这个错误引起的原因一般都是刚创建页面,js文件还有有处理或者忘了处理。所以要养成创建页面的同时在js文件先创建Page的习惯.

Page route错误

字面意思就是页面路由错误,在微信中有两种路由方式一种是在wxml文件使用

如下代码:

wxml文件:

js文件事件处理函数:

bindtap:function(event){
wx.navigateTo({
url: "search/search"
})
}

如果你这样写的话,恭喜你,你就会看到上面提示的错误,这是因为重复调用路由引起的,处理方法就是删除一个路由,删除

<navigator url="search/search">
<navigator url="search/search">
<view class="serach_view_show" bindtap="bindtap"> 搜索</view>
</navigator>
</navigator>

这种也是不允许的,也就是说

Do not have * handler in current page.

大概意思就是当前页面没有此处理,让确定是否已经定义,还指出了错误出现的可能位置pages/message/message,其实这种问题出现一般就是我们在wxml定义了一些处理事件,但是在js文件中没有实现这个时事件的处理方法,就会出现这个错误。那么我们按提示在js文件加上事件处理,如下代码,加上后就不会再有此错误提示。

bind:function(event){
  wx.navigateTo({
   url: "
pages/logs/logs
"
  })
 },

tabBar设置不显示

对于tabBar不显示,原因有很多,查找这个错误直接去app.json这个文件,最常见的也是刚学习微信小程序最容易犯的错误无外乎下面几种

注册页面即将页面写到app.json的pages字段中,如

"pages":[
  "pages/index/index",
  "pages/logs/logs",
  "pages/account/account",
  "pages/more/more"
 ],

tabBar写法错误导致的不显示,将其中的大写字母B写成小写,导致tabBar不显示。

tabBar的list中没有写pagePath字段,或者pagePath中的页面没有注册

tabBar的list的pagePath指定的页面没有写在注册页面第一个。微信小程序的逻辑是"pages"中的第一个页面是首页,也就是程序启动后第一个显示的页面,如果tabBar的list的pagePath指定的页面都不是pages的第一个,当然也就不会电视tabBar了。
tabBar的数量低于两项或者高于五项,微信官方中明确规定tabBar的至少两项最多五项。超过或者少于都不会显示tabBar。

navigationBarTitle显示问题

通过这个动态图你应该发现问题了,当点击音乐进入音乐界面时,title先显示了WeChatForQQ然后显示的音乐,这个体验肯定是难以接受的,原因是音乐界面的title是在js文件中page的生命周期方法中设置的。
若你不了解生命周期,可以点击查看

Page({
data:{
// text:"这是一个页面"
},
onLoad:function(options){
// 页面初始化 options为页面跳转所带来的参数

 },
 onReady:function(){
  // 页面渲染完成
  //NavigationBarTitle如果此处和json文件都设置,最后展示此处的标题栏
wx.setNavigationBarTitle({
 title: '账户'
})
 },
 onShow:function(){
  // 页面显示
 },
 onHide:function(){
  // 页面隐藏
 },
 onUnload:function(){
  // 页面关闭
 }
})

通过注释你应该明白了,设置标题写在了onReady方法中,也就是页面已经渲染完成了,在onReady之前显示的title就是json文件(覆盖关系,如果在子页面json文件设置title会覆盖app.json全局设置)中的title。可能你会说将wx.setNavigationBarTitle写在onLoad函数中,不过如果这样设置是不对的,因为onLoad执行过后才渲染页面,在渲染页面时title会从json文件中读取,导致onLoad设置的title会只在页面渲染之前展示,之后就显示json文件的tile,所以现在你应该明白ttle设置最优的地方就是给子文件写一个json文件,在文件中写入,如果想改变颜色直接在文件中添加就可以,该文件所写的属性值会覆盖app.json中设置的值。

{
"navigationBarTitleText": "账户"
}

wx.navigateTo无法打开页面

一个应用同时只能打开5个页面,当已经打开了5个页面之后,wx.navigateTo不能正常打开新页面。请避免多层级的交互方式,或者使用wx.redirectTo

本地资源无法通过 css 获取

background-image:可以使用网络图片,或者 base64,或者使用标签

页面间数据传递

微信小程序路由(页面跳转)是通过API wx.navigateTo或者wxml中

<navigator url="/pages/dynamic/dynamic?title={{item.title}}&message={{item.message}}">
     <view class="item" >
       <view class="item-left">
         <image src="{{item.url}}" class="image"/>
       </view>
       <view class="item-middle">
         <view>
            <text class="title">{{item.title}}</text>
         </view>
         <view>
           <text class="message">{{item.message}}</text>
         </view>
      </view>
      <view class="item_right">
        <view><text class="time">{{item.time}}</text></view>
        <view class="mark" wx:if="{{item.count>0}}"><text class="text">{{item.count}}</text></view>
      </view>
     </view>
     <view class="line"></view>
    </navigator>

而数据接收是在js文件的page里接收的,page生命周期有一个onLoad函数,它就是做一些初始化数据的工作,onLoad函数有一个参数options,我们就可以通过key将数据获取,如下

Page({
 data:{
  // text:"这是一个页面"
  isHiddenToast:true
 }
 onLoad:function(options){
  // 页面初始化 options为页面跳转所带来的参数
  console.log(options.title)
   console.log(options.message)

 },
 onReady:function(){
  // 页面渲染完成
 },
 onShow:function(){
  // 页面显示
 },
 onHide:function(){
  // 页面隐藏
 },
 onUnload:function(){
  // 页面关闭
 },
 bind:function(event){
wx.navigateTo({
 url: "
pages/logs/logs
"
})
 },
})

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript基本语法分析说明
Jun 15 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
Jul 03 Javascript
实现局部遮罩与关闭原理及代码
Feb 04 Javascript
jquery获取复选框被选中的值
Apr 10 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
Dec 07 Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 Javascript
headjs实现网站并行加载但顺序执行JS
Nov 29 Javascript
JavaScript中匿名函数的递归调用
Jan 22 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
Mar 21 Javascript
AngularJS自定义指令之复制指令实现方法
May 18 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
Sep 15 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
Jan 11 #Javascript
AngularJS中的缓存使用
Jan 11 #Javascript
AngularJS中的按需加载ocLazyLoad示例
Jan 11 #Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 #Javascript
JavaScript实现大图轮播效果
Jan 11 #Javascript
微信小程序 特效菜单抽屉效果实例代码
Jan 11 #Javascript
canvas 弹幕效果(实例分享)
Jan 11 #Javascript
You might like
php 阴历-农历-转换类代码
2012/01/16 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php实现无限级分类
2014/12/24 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
Python中optparse模块使用浅析
2015/01/01 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
python命令行参数用法实例分析
2019/06/25 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
外企C语言笔试题
2013/11/10 面试题
优秀员工获奖感言
2014/03/01 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
学校会议通知范文
2015/04/15 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书