最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

微信小程序原生开发学习概述

业界 admin 10浏览 0评论

微信小程序开发全面学习指南

一、微信小程序开发概述

1.1 什么是微信小程序

微信小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或搜一下即可打开应用。小程序具有以下特点:

  • 无需安装:不占用手机存储空间,即用即走
  • 开发成本低:基于Web技术栈,学习曲线平缓
  • 跨平台:一次开发,可在iOS和Android平台运行
  • 微信生态整合:可方便调用微信支付、分享、定位等原生能力

1.2 小程序与APP、H5的区别

特性微信小程序原生APPH5网页
安装无需安装需安装无需安装
入口微信内桌面图标浏览器
性能接近原生最佳一般
开发成本较低
更新机制微信审核应用商店审核即时更新
系统权限有限完整有限

1.3 小程序适用场景

小程序特别适合以下场景:

  • 工具类应用:计算器、天气预报、翻译等轻量工具
  • 电商平台:快速搭建商品展示和购买流程
  • 内容展示:新闻、博客、教育内容展示
  • O2O服务:餐饮、酒店、票务等线上线下结合服务
  • 企业内部应用:CRM、OA等企业内部工具

二、开发环境搭建

2.1 注册开发者账号

  1. 访问微信公众平台
  2. 点击"立即注册",选择"小程序"
  3. 填写邮箱、密码等信息完成注册
  4. 登录后补充小程序基本信息,包括名称、图标、简介等

2.2 下载开发工具

微信官方提供了专门的开发工具:

  1. 前往开发者工具下载页面
  2. 根据操作系统选择对应版本(Windows/Mac)
  3. 安装完成后打开工具,使用微信扫码登录

2.3 创建第一个小程序项目

  1. 打开开发者工具,点击"新建项目"
  2. 填写项目信息:
    • 项目名称:MyFirstMiniProgram
    • 目录:选择本地存储路径
    • AppID:可使用测试号或已注册的正式ID
    • 模板:选择"普通快速启动模板"
  3. 点击确定,工具会自动生成基础项目结构

2.4 开发工具界面介绍

微信开发者工具主要包含以下区域:

  • 编辑器区域:代码编写和文件管理
  • 模拟器:实时预览小程序效果
  • 调试器:包含Console、Sources、Network等调试面板
  • 工具栏:编译、预览、上传等操作按钮
  • 详情面板:项目配置和基本信息

三、小程序项目结构解析

3.1 目录结构详解

一个标准的小程序项目包含以下目录和文件:

├── pages/                  # 页面目录
│   ├── index/              # 首页
│   │   ├── index.js        # 页面逻辑
│   │   ├── index.json      # 页面配置
│   │   ├── index.wxml      # 页面结构
│   │   └── index.wxss      # 页面样式
│   └── logs/               # 日志页
│       ├── logs.js
│       ├── logs.json
│       ├── logs.wxml
│       └── logs.wxss
├── utils/                  # 工具类文件
│   └── util.js             # 工具函数
├── app.js                  # 小程序逻辑
├── app.json                # 全局配置
├── app.wxss                # 全局样式
└── project.config.json     # 项目配置文件

3.2 核心配置文件

app.json 全局配置
{
  "pages": [
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window": {
    "navigationBarTitleText": "Demo",
    "navigationBarBackgroundColor": "#ffffff",
    "backgroundColor": "#eeeeee",
    "enablePullDownRefresh": true
  },
  "tabBar": {
    "list": [{
      "pagePath": "pages/index/index",
      "text": "首页"
    }, {
      "pagePath": "pages/logs/logs",
      "text": "日志"
    }]
  },
  "networkTimeout": {
    "request": 10000,
    "connectSocket": 10000
  },
  "debug": true
}
page.json 页面配置
{
  "navigationBarTitleText": "我的页面",
  "usingComponents": {
    "my-component": "/components/my-component"
  }
}

3.3 WXML模板语法

WXML(WeiXin Markup Language)是小程序框架设计的一套标签语言,用于构建页面结构。

数据绑定
<view>{{message}}</view>
<view id="item-{{id}}">Item {{index}}</view>
<checkbox checked="{{isChecked}}"></checkbox>
条件渲染
<view wx:if="{{condition}}">条件成立时显示</view>
<view wx:elif="{{anotherCondition}}">其他条件</view>
<view wx:else>否则显示</view>

<block wx:if="{{true}}">
  <view>view1</view>
  <view>view2</view>
</block>
列表渲染
<view wx:for="{{array}}" wx:key="id">
  {{index}}: {{item.message}}
</view>

<view wx:for="{{[1,2,3]}}" wx:for-item="num" wx:key="*this">
  {{num}}
</view>

3.4 WXSS样式语言

WXSS(WeiXin Style Sheets)是一套样式语言,用于描述WXML的组件样式,具有CSS大部分特性。

尺寸单位rpx

rpx(responsive pixel)可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。

/* 在iPhone6上,屏幕宽度为375px,1rpx=0.5px */
.container {
  width: 750rpx; /* 在iPhone6上会显示为375px */
  height: 200rpx;
  font-size: 32rpx;
}
样式导入
/* app.wxss */
@import "common.wxss";
.container {
  color: #333;
}

3.5 JavaScript逻辑层

小程序的JS处理页面逻辑,同时提供了丰富的API。

页面生命周期
Page({
  data: {
    text: "初始化数据"
  },
  onLoad: function(options) {
    // 页面创建时执行
  },
  onShow: function() {
    // 页面显示时执行
  },
  onReady: function() {
    // 页面首次渲染完毕时执行
  },
  onHide: function() {
    // 页面隐藏时执行
  },
  onUnload: function() {
    // 页面卸载时执行
  },
  onPullDownRefresh: function() {
    // 下拉刷新时执行
  },
  onReachBottom: function() {
    // 页面上拉触底时执行
  }
})
事件处理
Page({
  tapName: function(event) {
    console.log(event)
  }
})
<view bindtap="tapName">点击我</view>

四、小程序核心组件

4.1 视图容器组件

view

基础视图容器,相当于HTML中的div。

<view class="container" hover-class="hover" hover-stop-propagation hover-start-time="50" hover-stay-time="400">
  这是一个视图容器
</view>
scroll-view

可滚动视图区域。

<scroll-view scroll-y style="height: 200px;" bindscroll="scrollHandler">
  <view style="height: 400px;">可滚动内容</view>
</scroll-view>
swiper

滑块视图容器,常用于轮播图。

<swiper indicator-dots autoplay interval="3000">
  <swiper-item>
    <image src="/images/1.jpg"></image>
  </swiper-item>
  <swiper-item>
    <image src="/images/2.jpg"></image>
  </swiper-item>
</swiper>

4.2 基础内容组件

text

文本组件,支持嵌套和长按选择。

<text selectable>可选择文本</text>
<text space="ensp">使用 en 空格</text>
<text decode>&nbsp; &lt; &gt; &amp; &apos; &ensp; &emsp;</text>
rich-text

富文本组件,支持解析HTML字符串。

<rich-text nodes="{{html}}"></rich-text>
Page({
  data: {
    html: '<div style="color: red;">红色文本</div>'
  }
})

4.3 表单组件

button

按钮组件,丰富多样的开放能力。

<button type="primary" size="mini" plain loading bindtap="btnClick">
  主要按钮
</button>
input

输入框组件。

<input type="text" placeholder="请输入" value="{{inputValue}}" bindinput="inputChange" />
picker

从底部弹起的滚动选择器。

<picker mode="selector" range="{{array}}" bindchange="pickerChange">
  <view>当前选择:{{array[index]}}</view>
</picker>

4.4 导航组件

navigator

页面链接组件,相当于HTML中的a标签。

<navigator url="/pages/logs/logs" open-type="navigate" hover-class="navigator-hover">
  跳转到日志页
</navigator>

open-type支持:

  • navigate:默认值,保留当前页面,跳转到应用内页面
  • redirect:关闭当前页面,跳转到应用内页面
  • switchTab:跳转到tabBar页面
  • reLaunch:关闭所有页面,打开应用内某个页面
  • navigateBack:关闭当前页面,返回上一页面或多级页面

4.5 媒体组件

image

图片组件,支持多种缩放模式。

<image src="/images/1.jpg" mode="aspectFit" lazy-load binderror="imageError"></image>

mode属性值:

  • scaleToFill:默认,不保持纵横比缩放图片
  • aspectFit:保持纵横比缩放,完整显示
  • aspectFill:保持纵横比缩放,填充容器
  • widthFix:宽度不变,高度自动变化
video

视频组件。

<video src="http://example/video.mp4" controls></video>

4.6 地图组件

map

地图组件,功能丰富。

<map longitude="116.397428" latitude="39.90923" scale="14" markers="{{markers}}" bindmarkertap="markerTap"></map>
Page({
  data: {
    markers: [{
      id: 1,
      latitude: 39.90923,
      longitude: 116.397428,
      title: '天安门'
    }]
  },
  markerTap: function(e) {
    console.log(e.markerId)
  }
})

五、小程序API详解

5.1 网络请求

wx.request

发起HTTPS网络请求。

wx.request({
  url: 'https://example/api',
  method: 'POST',
  data: {
    key: 'value'
  },
  header: {
    'content-type': 'application/json'
  },
  success(res) {
    console.log(res.data)
  },
  fail(err) {
    console.error(err)
  }
})
上传下载
// 上传文件
wx.uploadFile({
  url: 'https://example/upload',
  filePath: tempFilePaths[0],
  name: 'file',
  formData: {
    'user': 'test'
  },
  success(res) {
    const data = res.data
  }
})

// 下载文件
wx.downloadFile({
  url: 'https://example/file.pdf',
  success(res) {
    const filePath = res.tempFilePath
  }
})

5.2 数据缓存

同步缓存
try {
  wx.setStorageSync('key', 'value')
  const value = wx.getStorageSync('key')
  wx.removeStorageSync('key')
  wx.clearStorageSync()
} catch (e) {
  console.error(e)
}
异步缓存
wx.setStorage({
  key: 'key',
  data: 'value',
  success() {
    wx.getStorage({
      key: 'key',
      success(res) {
        console.log(res.data)
      }
    })
  }
})

5.3 位置API

获取位置
wx.getLocation({
  type: 'wgs84',
  success(res) {
    const latitude = res.latitude
    const longitude = res.longitude
  }
})
地图控件
wx.chooseLocation({
  success(res) {
    console.log(res.name)
    console.log(res.address)
  }
})

5.4 设备相关API

系统信息
wx.getSystemInfo({
  success(res) {
    console.log(res.model)
    console.log(res.pixelRatio)
    console.log(res.windowWidth)
  }
})
扫码
wx.scanCode({
  success(res) {
    console.log(res.result)
  }
})

5.5 界面交互API

显示提示
wx.showToast({
  title: '成功',
  icon: 'success',
  duration: 2000
})

wx.showLoading({
  title: '加载中',
  mask: true
})

setTimeout(() => {
  wx.hideLoading()
}, 2000)
模态对话框
wx.showModal({
  title: '提示',
  content: '确认删除吗?',
  success(res) {
    if (res.confirm) {
      console.log('用户点击确定')
    }
  }
})

六、小程序高级开发技巧

6.1 自定义组件开发

创建组件
  1. 在项目根目录创建components文件夹
  2. 新建组件文件夹,如my-component
  3. 创建组件文件:
    • my-component.json
    • my-component.wxml
    • my-component.wxss
    • my-component.js
组件配置
// my-component.json
{
  "component": true,
  "usingComponents": {}
}
组件模板
<!-- my-component.wxml -->
<view class="my-component">
  <slot></slot>
  <view>{{innerText}}</view>
</view>
组件样式
/* my-component.wxss */
.my-component {
  color: red;
}
组件逻辑
// my-component.js
Component({
  properties: {
    innerText: {
      type: String,
      value: 'default value'
    }
  },
  data: {},
  methods: {
    customMethod: function() {}
  }
})
使用组件
// 页面json配置
{
  "usingComponents": {
    "my-component": "/components/my-component/my-component"
  }
}
<!-- 页面wxml -->
<my-component inner-text="自定义内容">
  <view>插入slot的内容</view>
</my-component>

6.2 性能优化技巧

数据通信优化
  1. 减少setData的数据量,只设置变化的数据
  2. 避免频繁调用setData,合并更新
  3. 列表渲染使用wx:key提高diff效率
// 不好的做法
this.setData({ 'array[0].text': 'new text' })

// 好的做法
const newArray = this.data.array.slice()
newArray[0].text = 'new text'
this.setData({ array: newArray })
图片优化
  1. 使用合适的图片格式和压缩
  2. 按需加载图片,使用lazy-load
  3. 使用雪碧图减少请求
代码包优化
  1. 合理分包加载
  2. 移除无用代码和资源
  3. 使用小程序提供的按需注入和用时注入

6.3 安全最佳实践

  1. 接口请求使用HTTPS
  2. 敏感数据不存储在本地
  3. 用户输入内容进行过滤和转义
  4. 使用微信提供的登录态管理
  5. 重要操作添加二次确认

6.4 跨平台开发方案

Taro框架

Taro是一套遵循React语法规范的多端开发解决方案。

import Taro, { Component } from '@tarojs/taro'
import { View, Text } from '@tarojs/components'

class Home extends Component {
  render() {
    return (
      <View className='index'>
        <Text>Hello world!</Text>
      </View>
    )
  }
}
uni-app框架

uni-app是一个使用Vue.js开发所有前端应用的框架。

<template>
  <view class="content">
    <image class="logo" src="/static/logo.png"></image>
    <button @click="gotoPage">跳转页面</button>
  </view>
</template>

<script>
export default {
  methods: {
    gotoPage() {
      uni.navigateTo({
        url: '/pages/detail/detail'
      })
    }
  }
}
</script>

七、小程序发布与运营

7.1 代码审核与发布

上传代码
  1. 在开发者工具点击"上传"
  2. 填写版本号和项目备注
  3. 上传成功后,登录小程序管理后台
提交审核
  1. 在管理后台"开发管理"页面找到上传的版本
  2. 填写审核信息,包括测试账号等
  3. 提交审核,通常需要1-7个工作日
发布上线

审核通过后,开发者可手动点击"发布",新版本将全量发布

7.2 数据分析

微信提供了丰富的数据分析工具:

  1. 实时统计:查看实时访问数据
  2. 访问分析:用户来源、留存、画像等
  3. 性能分析:启动性能、运行性能数据
  4. 自定义分析:配置自定义事件跟踪
  5. AB测试:对不同用户展示不同内容

7.3 运营工具

小程序码
  1. 普通二维码:适用于线下场景
  2. 带参数二维码:可追踪不同渠道效果
  3. 小程序码:圆形二维码,辨识度高
模板消息

满足条件时可向用户发送模板消息:

  1. 支付成功后7天内可发送3条
  2. 提交表单后可发送1条
  3. 需要用户主动触发
客服消息

用户可在小程序内联系客服:

<button open-type="contact">联系客服</button>

7.4 推广策略

  1. 微信搜索优化:优化小程序名称、关键词
  2. 附近的小程序:开通位置展示
  3. 公众号关联:与公众号互相导流
  4. 社交分享:设计有吸引力的分享卡片
  5. 广告投放:使用微信广告平台推广

八、实战项目:电商小程序开发

8.1 项目需求分析

开发一个简易电商小程序,包含以下功能:

  • 首页商品展示
  • 商品分类浏览
  • 商品详情页
  • 购物车功能
  • 用户订单管理
  • 微信支付集成

8.2 项目结构设计

├── pages/
│   ├── home/              # 首页
│   ├── category/          # 分类页
│   ├── goods/             # 商品详情
│   ├── cart/              # 购物车
│   ├── order/             # 订单相关
│   └── user/              # 用户中心
├── components/
│   ├── goods-list/        # 商品列表组件
│   ├── cart-control/      # 购物车控件
│   └── tab-bar/           # 自定义tabBar
├── services/              # 服务层
│   ├── api.js             # 接口封装
│   └── cart.js            # 购物车逻辑
└── assets/                # 静态资源

8.3 核心功能实现

首页实现
<!-- home.wxml -->
<swiper indicator-dots autoplay>
  <swiper-item wx:for="{{banners}}" wx:key="id">
    <image src="{{item.image}}" mode="aspectFill"></image>
  </swiper-item>
</swiper>

<goods-list goods="{{hotGoods}}"></goods-list>
// home.js
Page({
  data: {
    banners: [],
    hotGoods: []
  },
  onLoad() {
    this.loadData()
  },
  loadData() {
    wx.request({
      url: 'https://api.example/home',
      success: (res) => {
        this.setData({
          banners: res.data.banners,
          hotGoods: res.data.hotGoods
        })
      }
    })
  }
})
购物车实现
// services/cart.js
const Cart = {
  add(goods) {
    let cart = wx.getStorageSync('cart') || []
    const index = cart.findIndex(item => item.id === goods.id)
    if (index >= 0) {
      cart[index].count++
    } else {
      goods.count = 1
      cart.push(goods)
    }
    wx.setStorageSync('cart', cart)
    return cart
  },
  get() {
    return wx.getStorageSync('cart') || []
  },
  clear() {
    wx.removeStorageSync('cart')
  }
}

export default Cart
微信支付集成
// services/order.js
const payOrder = (orderId) => {
  return new Promise((resolve, reject) => {
    wx.requestPayment({
      timeStamp: '',
      nonceStr: '',
      package: '',
      signType: 'MD5',
      paySign: '',
      success(res) { resolve(res) },
      fail(err) { reject(err) }
    })
  })
}

8.4 项目优化与发布

  1. 分包加载:将商品详情、订单等页面放入子包
  2. 缓存策略:合理使用缓存减少请求
  3. 性能监控:使用小程序后台分析工具
  4. 错误收集:实现错误上报机制
  5. 灰度发布:先小范围测试再全量

九、常见问题与解决方案

9.1 开发常见问题

页面白屏

可能原因:

  1. app.json中pages配置错误
  2. 页面路径不正确
  3. 页面JS报错导致初始化失败

解决方案:

  1. 检查pages配置和文件路径
  2. 查看调试器Console面板错误信息
  3. 使用开发者工具的"编译模式"调试
setData性能问题

优化建议:

  1. 避免频繁调用setData
  2. 只setData变化的数据
  3. 大数据列表使用虚拟列表
// 不好的做法
this.setData({ 'list[10].show': true })

// 好的做法
const newList = [...this.data.list]
newList[10].show = true
this.setData({ list: newList })

9.2 审核常见问题

审核被拒常见原因
  1. 功能不完整或无法使用
  2. 存在测试数据或测试账号
  3. 类目选择不正确
  4. 内容不符合规范
  5. 存在诱导分享行为
解决方案
  1. 确保所有功能可用
  2. 移除测试数据,提供测试账号
  3. 选择正确的服务类目
  4. 检查内容是否符合微信规范
  5. 避免强制用户分享

9.3 性能优化问题

启动加载慢

优化方案:

  1. 减少首屏请求和数据量
  2. 使用分包加载
  3. 启用"按需注入"或"用时注入"
  4. 预加载下一页数据
渲染卡顿

优化方案:

  1. 简化WXML结构,减少节点数量
  2. 避免过深的嵌套
  3. 使用wx:if替代hidden控制显示
  4. 图片使用合适的尺寸和压缩

微信小程序开发全面学习指南

一、微信小程序开发概述

1.1 什么是微信小程序

微信小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或搜一下即可打开应用。小程序具有以下特点:

  • 无需安装:不占用手机存储空间,即用即走
  • 开发成本低:基于Web技术栈,学习曲线平缓
  • 跨平台:一次开发,可在iOS和Android平台运行
  • 微信生态整合:可方便调用微信支付、分享、定位等原生能力

1.2 小程序与APP、H5的区别

特性微信小程序原生APPH5网页
安装无需安装需安装无需安装
入口微信内桌面图标浏览器
性能接近原生最佳一般
开发成本较低
更新机制微信审核应用商店审核即时更新
系统权限有限完整有限

1.3 小程序适用场景

小程序特别适合以下场景:

  • 工具类应用:计算器、天气预报、翻译等轻量工具
  • 电商平台:快速搭建商品展示和购买流程
  • 内容展示:新闻、博客、教育内容展示
  • O2O服务:餐饮、酒店、票务等线上线下结合服务
  • 企业内部应用:CRM、OA等企业内部工具

二、开发环境搭建

2.1 注册开发者账号

  1. 访问微信公众平台
  2. 点击"立即注册",选择"小程序"
  3. 填写邮箱、密码等信息完成注册
  4. 登录后补充小程序基本信息,包括名称、图标、简介等

2.2 下载开发工具

微信官方提供了专门的开发工具:

  1. 前往开发者工具下载页面
  2. 根据操作系统选择对应版本(Windows/Mac)
  3. 安装完成后打开工具,使用微信扫码登录

2.3 创建第一个小程序项目

  1. 打开开发者工具,点击"新建项目"
  2. 填写项目信息:
    • 项目名称:MyFirstMiniProgram
    • 目录:选择本地存储路径
    • AppID:可使用测试号或已注册的正式ID
    • 模板:选择"普通快速启动模板"
  3. 点击确定,工具会自动生成基础项目结构

2.4 开发工具界面介绍

微信开发者工具主要包含以下区域:

  • 编辑器区域:代码编写和文件管理
  • 模拟器:实时预览小程序效果
  • 调试器:包含Console、Sources、Network等调试面板
  • 工具栏:编译、预览、上传等操作按钮
  • 详情面板:项目配置和基本信息

三、小程序项目结构解析

3.1 目录结构详解

一个标准的小程序项目包含以下目录和文件:

├── pages/                  # 页面目录
│   ├── index/              # 首页
│   │   ├── index.js        # 页面逻辑
│   │   ├── index.json      # 页面配置
│   │   ├── index.wxml      # 页面结构
│   │   └── index.wxss      # 页面样式
│   └── logs/               # 日志页
│       ├── logs.js
│       ├── logs.json
│       ├── logs.wxml
│       └── logs.wxss
├── utils/                  # 工具类文件
│   └── util.js             # 工具函数
├── app.js                  # 小程序逻辑
├── app.json                # 全局配置
├── app.wxss                # 全局样式
└── project.config.json     # 项目配置文件

3.2 核心配置文件

app.json 全局配置
{
  "pages": [
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window": {
    "navigationBarTitleText": "Demo",
    "navigationBarBackgroundColor": "#ffffff",
    "backgroundColor": "#eeeeee",
    "enablePullDownRefresh": true
  },
  "tabBar": {
    "list": [{
      "pagePath": "pages/index/index",
      "text": "首页"
    }, {
      "pagePath": "pages/logs/logs",
      "text": "日志"
    }]
  },
  "networkTimeout": {
    "request": 10000,
    "connectSocket": 10000
  },
  "debug": true
}
page.json 页面配置
{
  "navigationBarTitleText": "我的页面",
  "usingComponents": {
    "my-component": "/components/my-component"
  }
}

3.3 WXML模板语法

WXML(WeiXin Markup Language)是小程序框架设计的一套标签语言,用于构建页面结构。

数据绑定
<view>{{message}}</view>
<view id="item-{{id}}">Item {{index}}</view>
<checkbox checked="{{isChecked}}"></checkbox>
条件渲染
<view wx:if="{{condition}}">条件成立时显示</view>
<view wx:elif="{{anotherCondition}}">其他条件</view>
<view wx:else>否则显示</view>

<block wx:if="{{true}}">
  <view>view1</view>
  <view>view2</view>
</block>
列表渲染
<view wx:for="{{array}}" wx:key="id">
  {{index}}: {{item.message}}
</view>

<view wx:for="{{[1,2,3]}}" wx:for-item="num" wx:key="*this">
  {{num}}
</view>

3.4 WXSS样式语言

WXSS(WeiXin Style Sheets)是一套样式语言,用于描述WXML的组件样式,具有CSS大部分特性。

尺寸单位rpx

rpx(responsive pixel)可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。

/* 在iPhone6上,屏幕宽度为375px,1rpx=0.5px */
.container {
  width: 750rpx; /* 在iPhone6上会显示为375px */
  height: 200rpx;
  font-size: 32rpx;
}
样式导入
/* app.wxss */
@import "common.wxss";
.container {
  color: #333;
}

3.5 JavaScript逻辑层

小程序的JS处理页面逻辑,同时提供了丰富的API。

页面生命周期
Page({
  data: {
    text: "初始化数据"
  },
  onLoad: function(options) {
    // 页面创建时执行
  },
  onShow: function() {
    // 页面显示时执行
  },
  onReady: function() {
    // 页面首次渲染完毕时执行
  },
  onHide: function() {
    // 页面隐藏时执行
  },
  onUnload: function() {
    // 页面卸载时执行
  },
  onPullDownRefresh: function() {
    // 下拉刷新时执行
  },
  onReachBottom: function() {
    // 页面上拉触底时执行
  }
})
事件处理
Page({
  tapName: function(event) {
    console.log(event)
  }
})
<view bindtap="tapName">点击我</view>

四、小程序核心组件

4.1 视图容器组件

view

基础视图容器,相当于HTML中的div。

<view class="container" hover-class="hover" hover-stop-propagation hover-start-time="50" hover-stay-time="400">
  这是一个视图容器
</view>
scroll-view

可滚动视图区域。

<scroll-view scroll-y style="height: 200px;" bindscroll="scrollHandler">
  <view style="height: 400px;">可滚动内容</view>
</scroll-view>
swiper

滑块视图容器,常用于轮播图。

<swiper indicator-dots autoplay interval="3000">
  <swiper-item>
    <image src="/images/1.jpg"></image>
  </swiper-item>
  <swiper-item>
    <image src="/images/2.jpg"></image>
  </swiper-item>
</swiper>

4.2 基础内容组件

text

文本组件,支持嵌套和长按选择。

<text selectable>可选择文本</text>
<text space="ensp">使用 en 空格</text>
<text decode>&nbsp; &lt; &gt; &amp; &apos; &ensp; &emsp;</text>
rich-text

富文本组件,支持解析HTML字符串。

<rich-text nodes="{{html}}"></rich-text>
Page({
  data: {
    html: '<div style="color: red;">红色文本</div>'
  }
})

4.3 表单组件

button

按钮组件,丰富多样的开放能力。

<button type="primary" size="mini" plain loading bindtap="btnClick">
  主要按钮
</button>
input

输入框组件。

<input type="text" placeholder="请输入" value="{{inputValue}}" bindinput="inputChange" />
picker

从底部弹起的滚动选择器。

<picker mode="selector" range="{{array}}" bindchange="pickerChange">
  <view>当前选择:{{array[index]}}</view>
</picker>

4.4 导航组件

navigator

页面链接组件,相当于HTML中的a标签。

<navigator url="/pages/logs/logs" open-type="navigate" hover-class="navigator-hover">
  跳转到日志页
</navigator>

open-type支持:

  • navigate:默认值,保留当前页面,跳转到应用内页面
  • redirect:关闭当前页面,跳转到应用内页面
  • switchTab:跳转到tabBar页面
  • reLaunch:关闭所有页面,打开应用内某个页面
  • navigateBack:关闭当前页面,返回上一页面或多级页面

4.5 媒体组件

image

图片组件,支持多种缩放模式。

<image src="/images/1.jpg" mode="aspectFit" lazy-load binderror="imageError"></image>

mode属性值:

  • scaleToFill:默认,不保持纵横比缩放图片
  • aspectFit:保持纵横比缩放,完整显示
  • aspectFill:保持纵横比缩放,填充容器
  • widthFix:宽度不变,高度自动变化
video

视频组件。

<video src="http://example/video.mp4" controls></video>

4.6 地图组件

map

地图组件,功能丰富。

<map longitude="116.397428" latitude="39.90923" scale="14" markers="{{markers}}" bindmarkertap="markerTap"></map>
Page({
  data: {
    markers: [{
      id: 1,
      latitude: 39.90923,
      longitude: 116.397428,
      title: '天安门'
    }]
  },
  markerTap: function(e) {
    console.log(e.markerId)
  }
})

五、小程序API详解

5.1 网络请求

wx.request

发起HTTPS网络请求。

wx.request({
  url: 'https://example/api',
  method: 'POST',
  data: {
    key: 'value'
  },
  header: {
    'content-type': 'application/json'
  },
  success(res) {
    console.log(res.data)
  },
  fail(err) {
    console.error(err)
  }
})
上传下载
// 上传文件
wx.uploadFile({
  url: 'https://example/upload',
  filePath: tempFilePaths[0],
  name: 'file',
  formData: {
    'user': 'test'
  },
  success(res) {
    const data = res.data
  }
})

// 下载文件
wx.downloadFile({
  url: 'https://example/file.pdf',
  success(res) {
    const filePath = res.tempFilePath
  }
})

5.2 数据缓存

同步缓存
try {
  wx.setStorageSync('key', 'value')
  const value = wx.getStorageSync('key')
  wx.removeStorageSync('key')
  wx.clearStorageSync()
} catch (e) {
  console.error(e)
}
异步缓存
wx.setStorage({
  key: 'key',
  data: 'value',
  success() {
    wx.getStorage({
      key: 'key',
      success(res) {
        console.log(res.data)
      }
    })
  }
})

5.3 位置API

获取位置
wx.getLocation({
  type: 'wgs84',
  success(res) {
    const latitude = res.latitude
    const longitude = res.longitude
  }
})
地图控件
wx.chooseLocation({
  success(res) {
    console.log(res.name)
    console.log(res.address)
  }
})

5.4 设备相关API

系统信息
wx.getSystemInfo({
  success(res) {
    console.log(res.model)
    console.log(res.pixelRatio)
    console.log(res.windowWidth)
  }
})
扫码
wx.scanCode({
  success(res) {
    console.log(res.result)
  }
})

5.5 界面交互API

显示提示
wx.showToast({
  title: '成功',
  icon: 'success',
  duration: 2000
})

wx.showLoading({
  title: '加载中',
  mask: true
})

setTimeout(() => {
  wx.hideLoading()
}, 2000)
模态对话框
wx.showModal({
  title: '提示',
  content: '确认删除吗?',
  success(res) {
    if (res.confirm) {
      console.log('用户点击确定')
    }
  }
})

六、小程序高级开发技巧

6.1 自定义组件开发

创建组件
  1. 在项目根目录创建components文件夹
  2. 新建组件文件夹,如my-component
  3. 创建组件文件:
    • my-component.json
    • my-component.wxml
    • my-component.wxss
    • my-component.js
组件配置
// my-component.json
{
  "component": true,
  "usingComponents": {}
}
组件模板
<!-- my-component.wxml -->
<view class="my-component">
  <slot></slot>
  <view>{{innerText}}</view>
</view>
组件样式
/* my-component.wxss */
.my-component {
  color: red;
}
组件逻辑
// my-component.js
Component({
  properties: {
    innerText: {
      type: String,
      value: 'default value'
    }
  },
  data: {},
  methods: {
    customMethod: function() {}
  }
})
使用组件
// 页面json配置
{
  "usingComponents": {
    "my-component": "/components/my-component/my-component"
  }
}
<!-- 页面wxml -->
<my-component inner-text="自定义内容">
  <view>插入slot的内容</view>
</my-component>

6.2 性能优化技巧

数据通信优化
  1. 减少setData的数据量,只设置变化的数据
  2. 避免频繁调用setData,合并更新
  3. 列表渲染使用wx:key提高diff效率
// 不好的做法
this.setData({ 'array[0].text': 'new text' })

// 好的做法
const newArray = this.data.array.slice()
newArray[0].text = 'new text'
this.setData({ array: newArray })
图片优化
  1. 使用合适的图片格式和压缩
  2. 按需加载图片,使用lazy-load
  3. 使用雪碧图减少请求
代码包优化
  1. 合理分包加载
  2. 移除无用代码和资源
  3. 使用小程序提供的按需注入和用时注入

6.3 安全最佳实践

  1. 接口请求使用HTTPS
  2. 敏感数据不存储在本地
  3. 用户输入内容进行过滤和转义
  4. 使用微信提供的登录态管理
  5. 重要操作添加二次确认

6.4 跨平台开发方案

Taro框架

Taro是一套遵循React语法规范的多端开发解决方案。

import Taro, { Component } from '@tarojs/taro'
import { View, Text } from '@tarojs/components'

class Home extends Component {
  render() {
    return (
      <View className='index'>
        <Text>Hello world!</Text>
      </View>
    )
  }
}
uni-app框架

uni-app是一个使用Vue.js开发所有前端应用的框架。

<template>
  <view class="content">
    <image class="logo" src="/static/logo.png"></image>
    <button @click="gotoPage">跳转页面</button>
  </view>
</template>

<script>
export default {
  methods: {
    gotoPage() {
      uni.navigateTo({
        url: '/pages/detail/detail'
      })
    }
  }
}
</script>

七、小程序发布与运营

7.1 代码审核与发布

上传代码
  1. 在开发者工具点击"上传"
  2. 填写版本号和项目备注
  3. 上传成功后,登录小程序管理后台
提交审核
  1. 在管理后台"开发管理"页面找到上传的版本
  2. 填写审核信息,包括测试账号等
  3. 提交审核,通常需要1-7个工作日
发布上线

审核通过后,开发者可手动点击"发布",新版本将全量发布

7.2 数据分析

微信提供了丰富的数据分析工具:

  1. 实时统计:查看实时访问数据
  2. 访问分析:用户来源、留存、画像等
  3. 性能分析:启动性能、运行性能数据
  4. 自定义分析:配置自定义事件跟踪
  5. AB测试:对不同用户展示不同内容

7.3 运营工具

小程序码
  1. 普通二维码:适用于线下场景
  2. 带参数二维码:可追踪不同渠道效果
  3. 小程序码:圆形二维码,辨识度高
模板消息

满足条件时可向用户发送模板消息:

  1. 支付成功后7天内可发送3条
  2. 提交表单后可发送1条
  3. 需要用户主动触发
客服消息

用户可在小程序内联系客服:

<button open-type="contact">联系客服</button>

7.4 推广策略

  1. 微信搜索优化:优化小程序名称、关键词
  2. 附近的小程序:开通位置展示
  3. 公众号关联:与公众号互相导流
  4. 社交分享:设计有吸引力的分享卡片
  5. 广告投放:使用微信广告平台推广

八、实战项目:电商小程序开发

8.1 项目需求分析

开发一个简易电商小程序,包含以下功能:

  • 首页商品展示
  • 商品分类浏览
  • 商品详情页
  • 购物车功能
  • 用户订单管理
  • 微信支付集成

8.2 项目结构设计

├── pages/
│   ├── home/              # 首页
│   ├── category/          # 分类页
│   ├── goods/             # 商品详情
│   ├── cart/              # 购物车
│   ├── order/             # 订单相关
│   └── user/              # 用户中心
├── components/
│   ├── goods-list/        # 商品列表组件
│   ├── cart-control/      # 购物车控件
│   └── tab-bar/           # 自定义tabBar
├── services/              # 服务层
│   ├── api.js             # 接口封装
│   └── cart.js            # 购物车逻辑
└── assets/                # 静态资源

8.3 核心功能实现

首页实现
<!-- home.wxml -->
<swiper indicator-dots autoplay>
  <swiper-item wx:for="{{banners}}" wx:key="id">
    <image src="{{item.image}}" mode="aspectFill"></image>
  </swiper-item>
</swiper>

<goods-list goods="{{hotGoods}}"></goods-list>
// home.js
Page({
  data: {
    banners: [],
    hotGoods: []
  },
  onLoad() {
    this.loadData()
  },
  loadData() {
    wx.request({
      url: 'https://api.example/home',
      success: (res) => {
        this.setData({
          banners: res.data.banners,
          hotGoods: res.data.hotGoods
        })
      }
    })
  }
})
购物车实现
// services/cart.js
const Cart = {
  add(goods) {
    let cart = wx.getStorageSync('cart') || []
    const index = cart.findIndex(item => item.id === goods.id)
    if (index >= 0) {
      cart[index].count++
    } else {
      goods.count = 1
      cart.push(goods)
    }
    wx.setStorageSync('cart', cart)
    return cart
  },
  get() {
    return wx.getStorageSync('cart') || []
  },
  clear() {
    wx.removeStorageSync('cart')
  }
}

export default Cart
微信支付集成
// services/order.js
const payOrder = (orderId) => {
  return new Promise((resolve, reject) => {
    wx.requestPayment({
      timeStamp: '',
      nonceStr: '',
      package: '',
      signType: 'MD5',
      paySign: '',
      success(res) { resolve(res) },
      fail(err) { reject(err) }
    })
  })
}

8.4 项目优化与发布

  1. 分包加载:将商品详情、订单等页面放入子包
  2. 缓存策略:合理使用缓存减少请求
  3. 性能监控:使用小程序后台分析工具
  4. 错误收集:实现错误上报机制
  5. 灰度发布:先小范围测试再全量

九、常见问题与解决方案

9.1 开发常见问题

页面白屏

可能原因:

  1. app.json中pages配置错误
  2. 页面路径不正确
  3. 页面JS报错导致初始化失败

解决方案:

  1. 检查pages配置和文件路径
  2. 查看调试器Console面板错误信息
  3. 使用开发者工具的"编译模式"调试
setData性能问题

优化建议:

  1. 避免频繁调用setData
  2. 只setData变化的数据
  3. 大数据列表使用虚拟列表
// 不好的做法
this.setData({ 'list[10].show': true })

// 好的做法
const newList = [...this.data.list]
newList[10].show = true
this.setData({ list: newList })

9.2 审核常见问题

审核被拒常见原因
  1. 功能不完整或无法使用
  2. 存在测试数据或测试账号
  3. 类目选择不正确
  4. 内容不符合规范
  5. 存在诱导分享行为
解决方案
  1. 确保所有功能可用
  2. 移除测试数据,提供测试账号
  3. 选择正确的服务类目
  4. 检查内容是否符合微信规范
  5. 避免强制用户分享

9.3 性能优化问题

启动加载慢

优化方案:

  1. 减少首屏请求和数据量
  2. 使用分包加载
  3. 启用"按需注入"或"用时注入"
  4. 预加载下一页数据
渲染卡顿

优化方案:

  1. 简化WXML结构,减少节点数量
  2. 避免过深的嵌套
  3. 使用wx:if替代hidden控制显示
  4. 图片使用合适的尺寸和压缩
发布评论

评论列表 (0)

  1. 暂无评论