小程序开发文档说明

小程序开发说明文档

一、 目录结构:

  • pages目录 (小程序页面的集合)

    • index 目录(index页面)

      • index.js (页面的私有程序)

        存在一个Page对象, 其指定页面的初始数据、生命周期回调、事件处理函数等

        参数示例:
        data: 页面的初始数据
        onLoad: 监听页面加载
        onShow: 监听页面显示
        onReady: 监听页面初次渲染完成
        onHide: 监听页面隐藏
        onUnload: 监听页面卸载
        onPullDownRefresh: 监听用户下拉动作
        onReachBottom: 页面上拉触底事件的处理函数
        onShareAppMessage: 用户点击右上角转发


      • index.json (页面的私有配置)

        权重高于全局配置,在页面有特殊需求时,可以覆盖全局配置
        基本参数与全局配置相同(部分特殊的全局参数除外)

      • index.wxml (页面的dom结构)

        WXML(WeiXin Markup Language)是框架设计的一套标签语言
        - 基本标签:
        view 与div等价,都是无意义的盒子容器,但在浏览器中还是会以dv渲染


        - 数据绑定:
        > 小程序的基本语法与vue相似,数据绑定也是类似

        1. 通过 {{ }} 来定义,会直接绑定 page 对象中, data 里面的值.也可以叫做文本插值
        2. 在属性中,即便是 ''"" 内的 {{ }},也是可以进行数据绑定的.
        3. 小程序定义了关键字 truefalse,可以在 {{ }} 内直接使用该布尔值
        4. 可以在 {{ }} 中进行运算,包括:三元运算 算术运算 逻辑判断 字符串运算 操作数组 操作对象

          示例代码:
        // .wxml
        <view> {{message}} </view>
        <view id="item-{{id}}"> </view>
        <checkbox checked="{{false}}"> </checkbox>
        <view hidden="{{flag ? true : false}}"> Hidden </view>
        
        // .js
        Page({
          data: {
            message: 'Hello MINA!',
            id: 0
          }
        })
        


        • 列表渲染:

          在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。

          示例代码:

          // .wxml 文件
          
          // block是一个无意义的盒子,可以承载wx:for等指令,区别于view,该标签不会在页面中显示
          <block wx:for="{{array}}">
            // index是小程序返回的当前循环的索引值, item为当前值
            <view>{{index}}: {{item.message}}</view>
          </block>
          
          // .js 文件
          Page({
              data: {
                array: [
                  {message: 'foo'}, 
                  {message: 'bar'}
                ]
              }
            })
          //------------------------------------------------
          // .wxml 文件
          
          // wx:for 也可以嵌套,下边是一个九九乘法表:
          // 循环嵌套会导致 item名 或 index名 的重复,可以手动修改: wx:for-item wx:for-index
          <view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i">
            <view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j">
              <view wx:if="{{i <= j}}">
                {{i}} * {{j}} = {{i * j}}
              </view>
            </view>
          </view>
          


        • 条件渲染:

          • wx:if(新增或删除)

            wx:if 来判断是否需要渲染该代码块,具体表现为新增和删除 dom 结构

            示例代码:

            <view wx:if="{{true}}}"> True </view>
            
            // wx:if 有额外的 wx:else,和 js里的 if elseif else 一样
            <view wx:if="{{length == 1}}"> 1 </view>
            <view wx:elif="{{length == 2}}"> 2 </view>
            <view wx:else> 3 </view>
              
            
          • hidden(显示或隐藏)

            hidden 来判断是否需要显示该代码块,具体表现为显示或隐藏 dom 结构

            示例代码:

            <view hidden="{{false}}}"> False </view>
            


        • 模板(template):

          WXML提供模板功能,可以在模板中定义代码片段,然后在不同的地方调用。
          模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 <wxs /> 模块。

          示例代码:

          // 定义模板
          // 使用 name 属性,作为模板的名字,然后在<template/>内定义代码片段
          // .wxml
          <template name="msgItem">
            <view>
              <text> {{index}}: {{msg}} </text>
              <text> Time: {{time}} </text>
            </view>
          </template>
          
          // 使用模板
          // 使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入
          // .wxml
          <template is="msgItem" data="{{...item}}"/>
          
          // .js
          Page({
            data: {
              item: {
                index: 0,
                msg: 'this is a template',
                time: '2016-09-15'
              }
            }
          })
          


        • 引用文件:

          WXML 提供两种文件引用方式 importinclude

          • import:

            import可以将整个文件引入,同时也就可以在该文件中使用被引入文件定义的模板
            但是只能使用被引入文件的模板,如果被引入文件也同时引入了其他文件及模板,该文件不可以使用

            示例代码:

            <import src="item.wxml"/>
            <template is="item" data="{{text: 'forbar'}}"/>
            
          • include:

            include 可以将被引入文件的 dom 直接渲染在 include 标签内,但是不包括 模板和样式

            示例代码:

            // header.wxml
            <view> header </view>
            // footer.wxml
            <view> footer </view>
            
            // index.html
            <include src="header.wxml"/>
            <view> body </view>
            <include src="footer.wxml"/>
            
            // 渲染后
            <view> header </view>
            <view> body </view>
            <view> footer </view>
            


      • index.wxss 页面的私有样式表

        和css无区别


  • utils 公共函数目录(相当于公共组件,方法)

    • utils.js 公共函数文件

      常用的公共函数封装,例如: date


  • app.js 小程序主体程序(也可以当做启动程序)

    • App(注册小程序)

    App 对象指定小程序的生命周期回调等,必须在 app.js 中调用,必须调用且只能调用一次。不然会出现无法预期的后果。

    示例代码

    App({
      onLaunch (options) {
        // 生命周期回调——监听小程序初始化
      },
      onShow (options) {
        // 生命周期回调——监听小程序启动或切前台
      },
      onHide () {
        // 生命周期回调——监听小程序切后台
      },
      onError (msg) {
        // 错误监听函数
        console.log(msg)
      }
    })
    


  • app.json 小程序主体配置(全局配置,权重低于私有页面配置)

    小程序根目录下的 app.json 文件用来对微信小程序进行全局配置
    app.json中不能有注释,会报错

    • 配置项:
      • pages

        小程序页面的集合数组,数组的第一项代表小程序的初始页面。
        小程序中新增/减少页面, 都需要对 pages 数组进行修改。

      • window

        用于设置小程序的状态栏、导航条、标题、窗口背景色。

        navigationBarBackgroundColor: 导航栏背景颜色
        navigationBarTextStyle: 导航栏标题颜色, 仅支持 black white
        navigationBarTitleText: 导航栏标题文字内容
        navigationStyle: 导航栏样式, custom 为自定义样式
        backgroundColor: 窗口的背景色
        backgroundTextStyle: 下拉 loading 的样式,仅支持 dark light:
        onReachBottomDistance: 页面上拉触底事件触发时距页面底部距离,单位为 px

      • tabBar

        配置项指定 tab 栏的表现, 以及 tab 切换时显示的对应页面

        color: 按钮上的文字默认颜色, 仅支持十六进制颜色
        selectedColor: 按钮上的文字选中时的颜色, 仅支持十六进制颜色
        backgroundColor: 按钮的背景色,仅支持十六进制颜色
        borderStyle: 按钮边框的颜色, 仅支持 black white

        • list (tab的列表)

          接受一个数组,只能配置最少 2 个、最多 5 个 tab, 每个项都是一个对象

          pagePath: 页面路径, 必须在 pages 中先定义
          text: 按钮内容
          iconPath: 图片路径, icon 大小限制为40kb,建议尺寸为 81px * 81px,不支持网络图片。
          selectedIconPath: 选中时的图片路径
          position: tabBar 的位置, 仅支持 bottom / top
          position: 为 top 时, tabicon 不显示
          custom: 自定义 tabBar

      • networkTimeout

        各类网络请求的超时时间,单位均为毫秒。
        - plugins
        > 声明小程序需要使用的插件。

      • navigateToMiniProgramAppIdList:

        当小程序需要使用 wx.navigateToMiniProgram 接口跳转到其他小程序时
        需要先在配置文件中声明需要跳转的小程序 appId 列表,最多允许填写 10 个。

      • usingComponents:

        在此处声明的自定义组件视为全局自定义组件,
        在小程序内的页面或自定义组件中可以直接使用而无需再声明。

      • PermissionObject:

        小程序获取权限时展示的接口用途说明。最长 30 个字符

      • style:

        app.json 中配置 "style": "v2"可表明启用新版的组件样式。


  • app.wxss 小程序公共样式表

    全局样式表,可以设置全局的初始样式

  • package.json 项目描述文件

    项目的相关描述,例如: 项目名称,版本号,作者等

  • project.config.json 项目配置文件(微信开发者工具配置文件)

    用来配置小程序及其页面是否允许被微信索引。


二、 数据请求(wx.request)

小程序有自带的请求方法,使用也很简单

示例代码:

// .js
wx.request({
  url: 'test.php', //请求地址, 仅为示例,并非真实的接口地址
  data: { //请求参数
    x: '',
    y: ''
  },
  header: { //请求头
    'content-type': 'application/json' // 默认值
  },
  success (res) {
    // 成功回调
    console.log(res.data)
  },
  fail (res) {
    // 失败回调
    console.log(res.data)
  },
  complete () {
    // 接口调用结束的回调函数(只要请求就会触发,无论请求的结果是成功还是失败)
    // todo...
  }
})

三、请求封装

  • 封装 wx.request 请求
    思路:

    1. utils 中,新建 request.js文件,用于封装 wx.request
    2. 封装 request 方法,通过传参的方式,改变请求的 地址:url 方法:method 参数:data 来满足不同的请求需求
    3. 对请求的 成功回调:success 失败回调:fail 进行 Promise 操作
    4. 抛出封装后的请求,让 api.js 调用
    5. utils 中,新建 api.js文件,所有的请求都在该文件下执行
    6. api.js 中引入 request.js文件
      调用 request.js 抛出的封装方法,传入对应的参数
      return 出请求,将请求抛出给需求页面
    7. 在需求页面中引入 api.js 文件,以及 api.js 抛出的方法,进行后续的逻辑处理

    示例代码(request.js):

    //封装请求: 统一调用request方法,并且将所有api请求放在 api.js 中完成,方便后续接口维护.
    
    //第一步: 定义 baseUrl(项目服务器域名)
    const baseUrl = "http://127.0.0.1:7300/mock/5de5fb2e027f08151b7ad1c8/example"
    
    //优化2: 单次请求未完成,避免用户再次请求,此处定义一个 变量
    var hasClick = false;
    
    //第二步: 抛出 封装的请求,传入基本参数: api(地址), method(请求方式), data(请求参数)
    export default function request(api, method, data) {
    
      //第三步: return Promise 异步对象
      //Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
      //所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
      return new Promise((reslove, reject) => {
        
        //优化2: 用户第一次操作时,变量为 false,继续进行
        if (hasClick) {
          return
        }
    
        //优化2: 此时将变量改写为 true,如果此时用户再次操作,那么此时变量为 true,上面的操作会终止此次请求
        hasClick = true
    
        //优化1: 发起请求时,弹出 加载框,在请求完成后关闭
        wx.showLoading({
          title: '加载中...',
          mask: true
        })
        
        //第四步: 调用小程序内置api进行数据请求
        wx.request({
          
          //第五步: 传入所需参数
          url: baseUrl + '/' + api,
          method: method || 'GET',
          header: {
            'content-type': 'application/json'
            // 'token': wx.getStorageSync("token")
          },
          data: data || {},
          success: (res) => {
            //第六步: 成功回调:将现有对象转为 Promise 对象
            reslove(res.data, res)
          },
          fail: (msg) => {
            //第七步: 失败回调:返回一个新的 Promise 实例
            reject('请求失败');
          },
          complete: info => {
            //优化1: 请求完成后,关闭 加载框
            wx.hideLoading();
    
            //优化2: 当请求完成后,将变量还原为 false,使下次可以继续请求
            hasClick = false
          }
        })
      });
    }
    
    //第八步: 根据请求方式的不同,改变参数 method ,使之对应
    ['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => {
      request[method] = (api, data, opt) => request(api, method, data, opt || {})
    });
    

    示例代码(api.js):

    import request from 'request.js'
    //获取首页初始化数据
    export function getIndexData() {
      return request.get("index", {});
    }
    

    示例代码(index.js):

    // 引入 api.js 中的 getIndexData, other1, other2 方法
    import { getIndexData, other1, other2 } from '../../utils/api.js'
    
    // 调用这些方法
    getIndexData().then(res => {
      // 成功回调
      console.log(res)
    }).catch((e) => {
      // 失败回调
      console.log(e) 
    })
    

四、公共方法库的完善

公共方法库主要是在根目录下 utils 目录中的 utils.js 文件中完成

  • date时间戳处理
// date时间戳处理 开始
const formatTime = date => {
  var date = new Date(date)
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}
// date时间戳处理 结束


  • 表单正则验证
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 微信小程序在无论在功能、文档及相关支持方面,都是优于前面几种微信账号类型,它提供了很多原生程序才有的接口,使得我们...
    未央大佬阅读 2,289评论 0 12
  • 小程序面试题 小程序授权登录流程 0、如何获得用户信息...
    X秀秀阅读 1,805评论 0 8
  • 每天的学习记录,可能有的地方写的不对,因为刚学,以后发现错的话会回来改掉整体流程 https://develope...
    有点健忘阅读 4,623评论 0 7
  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,312评论 0 9
  • 让我写文章实在文笔匮乏,于是决定先从翻译古文打基础,也可从内里提升文学素养。现做史记翻译开头附原文 原文 黄帝者,...
    璞玉_阅读 316评论 1 1