微信小程序

一、微信小程序

微信小程序介绍

微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验

微信小程序开发文档、open in new window微信公众平台open in new window

微信公众平台:https://mp.weixin.qq.com/
微信小程序开发文档:https://developers.weixin.qq.com/miniprogram/dev/framework/

微信小程序开发者工具

使用技巧

1、配置开发者工具字体大小

路径:设置 -> 外观设置 -> 字号

2、修改文件时自动保存

路径:设置 -> 外观设置 -> 编辑 -> 文件保存

3、页面布局

左侧模拟器,右侧编辑器,右下方调试工具,使用的VS Code内核。

4、快捷新建页面

在app.josn中设置pages保存后,开发者工具会自动创建对应的文件夹和页面文件。

5、不校验合法域名

如果您使用的域名未进行SSL认证或者网址前缀不是https://,可以通过微信开发者工具右上角[详情] -> [项目设置]最下方勾选上 [不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书] 这个按钮

同时你也可以通过这个路径查看当前小程序的App ID和本地目录,可以直接通过此处修改项目的App ID

1 小程序介绍

1.1 小程序的应用

https://img-blog.csdnimg.cn/20201029211612254.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

  • 支付宝
  • 头条
  • qq
  • 百度
  • 字节跳动
  • 微信

1.2 小程序的介绍

  • 运行在某个APP里面,比如微信:没有跨平台限制
  • 微信小程序
    • Wechat Mini Program 是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一搜即可使用

1.3 市场分类

https://img-blog.csdnimg.cn/20201029212516334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

1.3.1 小程序

  • 运行在某个APP里面,比如微信

1.3.2 webapp

  • 运行在浏览器上,没有跨平台限制

1.3.3 混合app

  • 运行在终端上,有跨平台限制,内部运行的是webapp

1.3.4 原生app

  • 运行在终端上,有跨平台限制,内部运行的是机器码01

1 ios

  • object-c
  • js

2 android

3 react-native

  • 一套代码开发两套的应用
  • taro

2 开发

2.1 准备

1 官网注册登录

2 工具下载

  • 在个人主页中点击文档

  • 进入新页面后点击工具,点击微信开发者工具

  • 选择与自己电脑合适的版本进行下载

    https://img-blog.csdnimg.cn/20201029130028592.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

  • 进入新的页面

    https://img-blog.csdnimg.cn/20201029130123683.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

  • 进行下载

    https://img-blog.csdnimg.cn/202010291304163.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

2.2 入门小程序

1 创建

https://img-blog.csdnimg.cn/20201029130752792.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

2 创建成功

https://img-blog.csdnimg.cn/20201029131136221.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

3 开发

https://img-blog.csdnimg.cn/20201029214044382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

项目结构

https://img-blog.csdnimg.cn/20201029132003881.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

与vue对比

序号差异vue框架微信小程序
1样式style标签.wxss文件
2行为script标签.js文件
< wxs >标签
3结构template标签.wxml文件
4盒子divview
5文本spantext
6属性绑定
7流程分支v-forwx:for
8判断v-if()=''/v-elsewx:if=''/wx:else
9显示隐藏v-show=''hidden=''
10生命周期8种应用3种+页面5种+组件6种
11编程式路由v-show=''hidden=''
12组件式路由
13路由参数
14网络请求axioswx.request()
15绑定事件@clickbindtop=''
16双向绑定v-model=''bindinput=''
17获取data数据this.msgthis.data.msg
18设置data数据this.msg=''this.setdata({msg:''})
19创建方法methods:{test(){}}与data同级直接创建

4 基本创建结构

创建

  • app.js中新增一个页面(全局配置) ,会自动创建

  • 默认打开第一个位置的页面

    https://img-blog.csdnimg.cn/2020102917402576.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

  • 页面的结构

    https://img-blog.csdnimg.cn/20201029174538489.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

5 基本使用

  • 插值表达式(小胡子语法)的使用
  • 属性绑定
  • 事件使用
  • 流程语句
  • 循环语句
  • 显示隐藏语句
  • 属性的设置和获取
  • 路由的使用
  • tabbar的使用
  • 请求的使用和封装
  • 生命周期的使用

1 插值表达式

https://img-blog.csdnimg.cn/20201029174838918.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

2 属性绑定

https://img-blog.csdnimg.cn/20201029175152868.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

3 事件使用

  • 与vue中事件基本相同,没有参数时默认是event

点击事件

https://img-blog.csdnimg.cn/20201029191104183.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

输入框事件

  • 输入框默认边框为白色,需要自己设置home.wxss

    https://img-blog.csdnimg.cn/20201029191504281.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

4 流程语句

  • wx:if

  • wx:else

    https://img-blog.csdnimg.cn/20201029192255598.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

5 显示和隐藏

https://img-blog.csdnimg.cn/20201029192536274.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

6 循环语句

  • wx:for

  • wx:for-index

  • wx:for-item

  • wx:key

    https://img-blog.csdnimg.cn/20201029193227334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

7 属性设置和获取

  • 设置:this.setData()

  • 获取属性:this.data.flag

    https://img-blog.csdnimg.cn/20201029193450561.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

8 tabbar使用

  • 可参考官网的API文档设置tabber

    https://img-blog.csdnimg.cn/20201029194704863.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

  • 代码

  "tabBar": {
    "color": "#dddddd",
    "selectedColor": "#16f2e7",
    "backgroundColor": "#fff",
    "borderStyle": "black",
    "list": [
      {
        "pagePath": "pages/home/home",
        "text": "主页",
        "iconPath": "tabs/home.png",
        "selectedIconPath": "tabs/home-active.png"
      },
      {
        "pagePath": "pages/index/index",
        "text": "消息",
        "iconPath": "tabs/message.png",
        "selectedIconPath": "tabs/message-active.png"
      }
    ]
  },

9 路由的使用

组件式路由

  • 使用navigater

1 可返回

https://img-blog.csdnimg.cn/20201029194041816.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

https://img-blog.csdnimg.cn/20201029195315820.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

2 不能返回

https://img-blog.csdnimg.cn/20201029195349416.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

3 路由传参

https://img-blog.csdnimg.cn/20201029195901718.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

编程式路由

  • 只能跳转非tabbar 有返回 wx.navigateTo({url: '/pages/test/test'})

  • 只能跳转非tabbar 无返回wx.redirectTo({url: '/pages/test/test'})

  • 能跳转所有页面 无返回 关闭当前页面wx.switchTab({url: '/pages/index/index'})

  • 能跳转所有页面 无返回 关闭所有页面wx.reLaunch({url: '/pages/index/index'})

    https://img-blog.csdnimg.cn/20201029200922294.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

  • 传参

    https://img-blog.csdnimg.cn/20201029201601494.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

10 请求的使用

  • wx:request
  • 无跨域问题

请求成功时

https://img-blog.csdnimg.cn/20201029202413464.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

请求失败时

https://img-blog.csdnimg.cn/20201029202228378.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

11 请求的三种封装

  • 封装属于工具类,存放到utils文件夹下

1 简单式封装

  • base.js
const baseUrl='http://jsonplaceholder.typicode.com/'
module.exports=(url,data,method)=>{
   return new Promise((resolve,reject)=>{
     wx.showLoading({
       title: 'loading',
       mask: true,
       success: (res) => {},
       fail: (res) => {},
       complete: (res) => {
         wx.hideLoading()
       },
     })
     wx.request({
       url: baseUrl+url,
       data: data,
       method,
       success:resolve,
       fail:reject,
       complete: (res) => {},
     })
   })
}

https://img-blog.csdnimg.cn/20201029203136198.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center2 完全式封装

  • 有加载的效果

  const app = getApp()
  const request = (url, options) => {
     // 请求之前提示加载中
    wx.showLoading({title: '加载中...'})
    return new Promise((resolve, reject) => {
      wx.request({
        url: `${app.globalData.baseURL}${url}`,
        // url: host + url,
        method: options.method,
        data: options.method === 'GET' ? options.data : JSON.stringify(options.data),
        header: {
          'Content-Type': 'application/json; charset=UTF-8',
          'x-token': 'x-token'  // 看自己是否需要
        },
        success: resolve,
        fail: reject,
        // success(request) {
        //   // console.log(request)
        //   if (request.statusCode === 200) {
        //     resolve(request.data)
        //   } else {
        //     reject(request.data)
        //   }
        // },
        // fail(error) {
        //   reject(error.data)
        // }
        complete() {
        	wx.hideLoading()
      	}
      })
    })
  }

  const get = (url, options = {}) => {
    return request(url, { method: 'GET', data: options })
  }

  const post = (url, options) => {
    return request(url, { method: 'POST', data: options })
  }

  const put = (url, options) => {
    return request(url, { method: 'PUT', data: options })
  }

  // 不能声明DELETE(关键字)
  const remove = (url, options) => {
    return request(url, { method: 'DELETE', data: options })
  }

  module.exports = {
    get,
    post,
    put,
    remove
  }

https://img-blog.csdnimg.cn/20201029203601128.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

3 外部式封装

  • 第一步:在pages安装flyionpm i flyio -S
  • 第二步:将node_modules/flyio 复制到项目工程目录下
  • 第三步:严格按照前两步操作否则出现模块找不到错误
  • 封装文件如下:
import Fly from '../flyio/dist/npm/wx'
const fly = new Fly()
const host = 'http://jsonplaceholder.typicode.com/'
// 添加请求拦截器
fly.interceptors.request.use(
  (request) => {
    wx.showLoading({
      title: '加载中',
      mask: true
    })
    console.log(request)
    // request.headers["X-Tag"] = "flyio";
    // request.headers['content-type']= 'application/json';
    request.headers = {
      'X-Tag': 'flyio',
      'content-type': 'application/json'
    }
    let authParams = {
    // 公共参数
      'categoryType': 'SaleGoodsType@sim',
      'streamNo': 'wxapp153570682909641893',
      'reqSource': 'MALL_H5',
      'appid': 'string',
      'timestamp': new Date().getTime(),
      'sign': 'string'
    }

    request.body && Object.keys(request.body).forEach((val) => {
      if (request.body[val] === '') {
        delete request.body[val]
      };
    })
    request.body = {
      ...request.body,
      ...authParams
    }
    return request
  })

// 添加响应拦截器
fly.interceptors.response.use((response) => {
  wx.hideLoading()
  return response.data// 请求成功之后将返回值返回
},
(err) => {
  // 请求出错,根据返回状态码判断出错原因
  console.log(err)
  wx.hideLoading()
  if (err) {
    return '请求失败'
  };
}
)

fly.config.baseURL = host

export default fly

常规写法

https://img-blog.csdnimg.cn/20201029204904798.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

ES7写法

https://img-blog.csdnimg.cn/20201029205334885.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

11 wxs使用

  • 类似< script >标签
  • 使用较少
  • 缺点:
    • 不易操作

    • 不能在里面写注释

    • 语法过于严谨

      https://img-blog.csdnimg.cn/20201029205702834.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

12 组件的抽离

https://img-blog.csdnimg.cn/20201029210459858.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xheXhpbmcyNw==,size_16,color_FFFFFF,t_70#pic_center

13 生命周期

总结

参考

源码地址open in new window

  • 码云地址: https://gitee.com/lakerzhang/wx.git

本文参考:微信小程序入门开发超详细笔记(一)open in new window