微信小程序开发踩坑指南

August 26, 2019

Mini Program Notes

尺寸单位 - rpx和px

  • rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。
设备rpx换算px (屏幕宽度/750)px换算rpx (750/屏幕宽度)
iPhone51rpx = 0.42px1px = 2.34rpx
iPhone61rpx = 0.5px1px = 2rpx
iPhone6 Plus1rpx = 0.552px1px = 1.81rpx

详情查看官方文档

组件

API

小程序生命周期(Life Cycle)

文档

jpg

事件传参

注意

bindtap或者bindtap(1) 都会会直接当成函数名直接调用包括括号

传参使用自定义属性 data-*

<view bindtap="bdtap" data-info="1"></view>

// js代码
bdtap() {
	// e.target.dataset 获取data-*的值
	console.log(e.target.dataset.info)
}

wxs

  • 没有兼容性
  • 与JavaScript不同
  • 隔离性:不能调用js代码,也不能调用小程序提供的API
  • 不能作为事件回调
  • IOS设备比JavaScript运行环境快2~20倍,而在AndroidJavaScript环境运行效率无差异

语法

wx:if 控制元素的渲染,为惰性渲染,更高的切换消耗

hidden 始终会渲染,只是简单的控制显示和隐藏,更高的出事渲染消耗

// 相当于 v-if
wx:if=""
wx:elif=""
wx:else

// 控制元素的显示和隐藏
hidden 

// 列表渲染
wx:for=""
wx:for-index=""
wx:for-item=""

block标签

相当于vue中的template,只做包括,当前标签不会渲染出来,内容会渲染

<block></block>

自定义组件

数据监听器

类似于Vue中的watch,支持版本2.6.1以上

数据监听器
Component({
    observers: {
        '字段1', '字段2': function(字段1的新值,字段2的新值) {
   			// do something         
        }
    }
})
监听子数据字段的变化
Component({
  observers: {
    'some.subfield': function (subfield) {
      // 使用 setData 设置 this.data.some.subfield 时触发
      // (除此以外,使用 setData 设置 this.data.some 也会触发)
    },
    'arr[12]': function (arr12) {
      // 使用 setData 设置 this.data.arr[12] 时触发
      // (除此以外,使用 setData 设置 this.data.arr 也会触发)
    }
  }
})
通配符**监听所有子数据字段的变化
Component({
  observers: {
    'some.field.**': function (field) {
      // 使用 setData 设置 this.data.some.field 本身或其下任何子数据字段时触发
      // (除此以外,使用 setData 设置 this.data.some 也会触发)
      field === this.data.some.field
    }
  }
})

组件的生命周期

取消顶部导航栏

{
    "window": {
        navigationStyle: "custom"
    }
}

将图片转换为base64

const fileManger = wx.getFileSystemManger()
const fileStr = fileManger.readFileSync('dir', 'base64')
// fileStr 即为 图片的base64

hover-class

去除navigator跳转链接的跳转时的默认灰色背景,设置为none

<navigator hover-class="none">
</navigator>

WEPY

创建 wepy 项目

# 全局安装wepy-cli
yarn global add wepy-cli

# 创建项目
wepy new myproject
# 1.7.0之后的版本使用 wepy init standard myproject 初始化项目,使用 wepy list 查看项目模板

# 切换至目录
cd myproject

# 安装依赖
yarn

# 开启实时编译
wepy build --watch

wepy-cli 命令

# 根据生成一个新项目
init [options] <template-name> [project-name]
		
    -c --clone  use git clone
    --offline   use cached template
    -h, --help  output usage information

# 构建项目
build [options]
		-f, --file <file>      待编译wpy文件
    -s, --source <source>  源码目录
    -t, --target <target>  生成代码目录
    -o, --output <type>    编译类型:web,weapp。默认为weapp
    -p, --platform <type>  编译平台:browser, wechat,qq。默认为browser
    -w, --watch            监听文件改动
    --no-cache             对于引用到的文件,即使无改动也会再次编译
    -h, --help             output usage information

# 列出可用的官方模板
list [options]
		
		-g, --github  list all registered github projects
    -h, --help    output usage information

# 更新至最新版
upgrade [options]

		--cli   upgrade wepy-cli
    --wepy  upgrade wepy
    -h, --help  output usage information

wepy 文件结构

├── dist                   小程序运行代码目录(该目录由WePY的build指令自动编译生成,请不要直接修改该目录下的文件)
├── node_modules           
├── src                    代码编写的目录(该目录为使用WePY后的开发目录)
|   ├── components         WePY组件目录(组件不属于完整页面,仅供完整页面或其他组件引用)
|   |   ├── com_a.wpy      可复用的WePY组件a
|   |   └── com_b.wpy      可复用的WePY组件b
|   ├── pages              WePY页面目录(属于完整页面)
|   |   ├── index.wpy      index页面(经build后,会在dist目录下的pages目录生成index.js、index.json、index.wxml和index.wxss文件)
|   |   └── other.wpy      other页面(经build后,会在dist目录下的pages目录生成other.js、other.json、other.wxml和other.wxss文件)
|   └── app.wpy            小程序配置项(全局数据、样式、声明钩子等;经build后,会在dist目录下生成app.js、app.json和app.wxss文件)
└── package.json           项目的package配置

wepy,为异步API启用Promise

修改 app.wpy 文件

constructor() {
    super()
    // 通过下面这一行代码,可以为异步的API,
    // 开启Promise功能,这样,异步API调用的结果,返回值是Promise对象
    this.use('promisify')
}

将页面的业务逻辑抽离到单独的 mixin 文件

精简小程序页面的代码,将 script 中的业务逻辑抽离到对应的 mixin 文件中

  • 抽离的文件路径 src -> mixins -> index.js
import wepy from 'wepy'

export default class extens wepy.mixin {
  data = {}
  methods = {}
  computed = {}
  onLoad() {}
  // ,..
}
  • 对应页面导入抽离出去的 js 文件
<template>
  <view></view>
</template>

<script>
import wepy from 'wepy'
// 1. 导入js,@为 src 层的绝对路径
import mix from '@/mixins/index.js'

export default class extends wepy.page {
  // 2. 导入并挂载
  mixins = [mix]
}
</script>

<style></style>

异步函数中更新数据的时候需要手动触发渲染 this.$apply()

参考

小程序框架 - WePY

wepy-cli

小程序文档

黑马优购项目