基础问题

一、appleID的获取

    https://mp.weixin.qq.com/wxopen/basicprofile?action=index&token=767275273&lang=zh_CN

    在开发设置选项 => AppID(小程序ID)

二、文件类型

    1、app.js 脚本文件        2、app.json 配置文件        3、app.wxml 页面结构        4、app.wxss样式文件


三、app.json全局配置

    {
        // 页面路径
        "pages": [
            "pages/index/index",            // 初始显示的组件用
            "pages/logs/index"
        ],

        // 默认页面窗口表现
        "window": {
                "backgroundTextStyle": "light",
            "navigationBarBackgroundColor": "#0E77CA",
            "navigationBarTitleText": "小程序Example",
            "navigationBarTextStyle": "#fff",
            "enablePullDownRefresh": true,
        },

        // 底部tab的表现
        "tabBar": {
            "list": [
                {
                    "pagePath": "pages/index/index",
                    "text": "首页"
                }, 
                {
                    "pagePath": "pages/logs/logs",
                    "text": "日志"
                }
            ]
        },

        // 设置网络超时时间
        "networkTimeout": {
            "request": 10000,
            "downloadFile": 10000
        },

        // 是否开启debug模式
        "debug": true,

        "workers": '',                            // 多线程代码放置的目录
        "pageOrientation": "auto",    // 是否启用屏幕旋转
        "subpackages": {},                    // 分包结构配置
        "resizable": true,                    // iPad上是否启用屏幕旋转
    }

    https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html


五、sitemap.json配置

    文件用于配置小程序及其页面是否允许被微信索引

Page() 用来注册一个页面

指定页面的初始数据、生命周期、事件处理

一、生命周期

    /** 监听页面加载 **/
    onLoad: function (options) {
        console.log(options);
    },

    /** 监听页面初次渲染完成 **/
    onReady: function () {

    },

    /** 监听页面显示 **/
    onShow: function () {

    },

    /** 监听页面隐藏 **/
    onHide: function () {

    },

    /** 监听页面卸载 **/
    onUnload: function () {

    },

    /** 页面相关事件处理函数--监听用户下拉动作 **/
    onPullDownRefresh: function (e) {
        this.setData({
            updata: JSON.stringify(e)
        })
        console.log(e)
    },

    /** 页面上拉触底事件的处理函数 **/
    onReachBottom: function (e) {
        this.setData({
            updata: JSON.stringify(e)
        })
        console.log(e)
    },

    /** 用户点击右上角分享 **/
    onShareAppMessage: function () {

    }


二、属性、方法

    data - 页面初始数据, WXML中调用 {{test}}

    onload - 监听页面加载

    onReady - 监听页面初次渲染完成

    onShow - 监听页面显示

    onHide - 监听页面隐藏

    onUnload - 监听页面卸载

    onPullDowRefesh - 监听用户下拉动作

    onReachBottom - 上拉触底事件

    onShareAppMessage - 用户点击右上角转发

        onShareAppMessage: function () {
            return {
                title: '自定义转发标题',
                path: '/page/user?id=123'
            }
        }

    onPageScroll - 页面滚动触发


三、绑定事件

    <view bindTap="viewTap">click me</view>

    Page({
        data:{
            message: 'view tap'
        },
        viewTap: () => {
            console.log(this.message);
        }
    })

五、Page.prototype.route - 获取当前页面的路径

六、Page.prototype.setData() - 用于将数据从逻辑层发送到视图层,同时改变对应的this.data的值

    Page({
        data:{
            username: 'siguang'
        }
        login: ()=>{
            this.setData({
                username: 'lulu'
            })
        }
    })

路由

所有页面的路由全部由框架管理

一、页面栈

    1、初始化 - 新页面入栈

    2、打开新页面 - 新页面入栈。  调用 API wx.navigateTo 或使用组件 <navigator open-type="navigateTo"/>

    3、页面重定向 - 当前页面出栈,新页面入栈。  调用 API wx.redirectTo 或使用组件 <navigator open-type="redirectTo"/>

    4、页面返回 - 页面不断出栈,直到目标返回页,新页面入栈。 调用 API wx.navigateBack 或使用组件<navigator open-type="navigateBack">或用户按左上角返回按钮

    5、Tab - 切换    页面全部出栈,只留下新的 Tab 页面。 调用 API wx.switchTab 或使用组件 <navigator open-type="switchTab"/> 或用户切换 Tab

    6、重加载 - 页面全部出栈,只留下新的页面。 调用 API wx.reLaunch 或使用组件 <navigator open-type="reLaunch"/>

    Example:
        bindViewTap: function() {
            wx.navigateTo({
                url: '../logs/logs'
            })
        }

二、getCurrentPages() 获取当前页面的栈的实例

三、Tips

    navigateTo, redirectTo 只能打开非 tabBar 页面。
    switchTab 只能打开 tabBar 页面。
    reLaunch 可以打开任意页面。

模块化

一、全局变量和方法

    全局方法通过 getApp()获取全局的应用实例

    全局数据设置:

        App({
            globalData: 1
        })


二、模块化

    1、exports 导出

        module.exports 或 exports对外暴露接口, exports是module.exports的一个引用

        小程序不支持直接引入node_modules, 如果需要就将代码拷到目录中

        // common.js
        function sayHello(name){
            console.log(`Hello ${name}`);
        }

        module.exports.sayHello = sayHello;


    2、require 引用

        const conmmon = require('common.js');
        Page({
            helloMina: () =>{
                common.sayHello('mina');
            }
        })

视图层

一、WXML

    1、数据绑定

        普通绑定: <view>{{message}}</view>

        属性绑定: <view id="item-{{id}}"> </view>

        控制属性: <view wx:if="{{condition}}"> </view>


    2、循环渲染

        // 注意这里取到当前数据要用item
        <view wx:for="{{arr}}">{{item}}</view>

        数组下标:
            <view wx:for="{{arr}}">
                序号:{{index}} 姓名:{{item.name}} 年龄:{{item.age}} 
            </view>

            两者相同
            <view wx:for="{{arr}}" wx:for-index="idx" wx:for-item="itemName">
                姓名:{{itemName.name}} 年龄:{{itemName.age}} 序号:{{idx}}
            </view>


    3、条件渲染

        <view wx:if="{{view == 'webView'}}">web view</view>
        <view wx:elif="{{view == 'app'}}">app</view>
        <view wx:else="{{view == 'mina'}}">mina</view>

        Page({
            data: {
                view: 'app'
            }
        })


    4、模板

        name: 模板名    is: 所要调用的模板名    data: 传入的数据

        <template name="staffName">
            <view>
                FirstName: {{firstName}}, lastName: {{lastName}}
            </view>
        </template>

        <template is="staffName" data="{{...staffA}}"></template>
        <template is="staffName" data="{{...staffB}}"></template>

        Page({
            data: {
                staffName: {fristName: 'sigunag', lastName: 'haha'},
                staffName: {fristName: 'yuwan', lastName: 'lulu'},
            }
        })

WXSS 样式语言

尺寸单位: rex, 可以根据屏幕宽度自行自适应

一、样式导入

    @import 'common.wxss'
    .middle-p {
        padding: 15px;
    }


二、内联样式

    data: {
        color: '#ddd'
    }
    <view style="color: {{color}}">

    <view class="middle-p">        // 多个class使用空格分隔


三、全局、局部样式

    定义在app.wxss中的样式为全局, 每个页的wxss为局部样式


四、选择器

    .class, #id, element, element, element, ::after, ::before

WXS 脚本

小程序自己的一套脚本语言, 可以直接编写到WXML中, 也可以单独写成一个.wxs文件

一、写到wxml中

    <!-- index.wxml>
    <wxs module="m1">
        var msg = 'hello world';
        module.exports.message = msg
    </wxs>

    <view>
        {{m1.message}}
    </view>


二、写成一个.wxs文件

    // pages/comm.wxs
    // 如果comm.wxs文件中要引用其它的wxs文件使用require,  var tool = require('./tools.wxs');

    var foo = "'hello world' from comm.wxs";
    var bar = function(d) {
        return d;
    }
    module.exports = {
        foo: foo,
        bar: bar
    };

    // 页面引用
    <wxs src="./../tools.wxs" module="tools" />
    <view> {{tools.msg}} </view>

事件

<view bindtap="add">{{count}}</view>

Page({
    data: {
        count: 1
    },
    add: (event)=>{
        this.setData({
            count: this.data.count++
        })
    }
})

一、事件分类

    分为冒泡事件和非冒泡事件

    冒泡事件:  bindtouchstart 前面加bind

        touchstart    手指触摸动作开始    
        touchmove    手指触摸后移动    
        touchcancel    手指触摸动作被打断,如来电提醒,弹窗    
        touchend    手指触摸动作结束    
        tap    手指触摸后马上离开    
        longpress    手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发    1.5.0
        longtap    手指触摸后,超过350ms再离开(推荐使用longpress事件代替)    
        transitionend    会在 WXSS transition 或 wx.createAnimation 动画结束后触发    
        animationstart    会在一个 WXSS animation 动画开始时触发    
        animationiteration    会在一个 WXSS animation 一次迭代结束时触发    
        animationend    会在一个 WXSS animation 动画完成时触发

    事件绑定和冒泡:

        bind 不会阻止冒泡事件向上冒泡,bindtap
        catch 可以阻止冒泡事件向上冒泡。catchtap

    事件捕获:

        捕获阶段监听事件时,采用capture-bind、capture-catch关键字, 后者将中断捕获阶段和取消冒泡

    事件对象:

        baseEvent对象


二、view、block标签

    view 渲染单独一行类似块元素

    block 渲染成内联元素

引用

提供两种引用方法import 和 include

一、import 引用外部的<template>模板

    <!-- item.wxml -->
    <template name="item">
        <text>{{text}}</text>
    </template>

    <!--  index.wxml  -->
    <import src="item.wxml"/>
    <template is="item" data="{{text: 'forbar'}}"/>


二、include 引用非<template>模板的文件,公用的头尾等

    <!-- index.wxml -->
    <include src="header.wxml"/>
    <view> body </view>
    <include src="footer.wxml"/>

    <!-- header.wxml -->
    <view> header </view>

    <!-- footer.wxml -->
    <view> footer </view>

运行机制

小程序两种启动方式:

    冷启动: 用户首次打开或小程序被微信主动销毁后在次打开的情况,

    热启动: 用户已经打开某个小程序,在一定时间内在次打开,此时无需重新启动,只需将后台切换到前台

开发总结

1、小程序初始指定页面

    app.json中, 调整pages数组的顺序, 第一个就是最先被载入

    "pages":[
        "pages/my/my",
        "pages/index/index",
        "pages/logs/logs"    
    ]

2、当前页面使用修改标题

    在当前页面下的.json文件中加入

    goods-details.json
    {
        "navigationBarTitleText": "商品详情"
    }

3、获取元素上的自定义属性值

    1) evt.currentTarget.dataset.propertyindex;        

    2) evt.detail

    <view bindtap="labelItemTap" data-propertyindex="{{idx}}"></view>        // 注意这里自定义属性需要以"data-"开头,并且不能为大写,如果有大写取值时全部为小写

    js:

    labelItemTap: function(evt){
        let val = evt.currentTarget.dataset.propertyindex;
    }

4、在app.json中配置pages的路径会自动创建目录和基本文件这里

    这里注意创建js时候会将生命周期方法和上拉下拉刷新方法全部都创建好,不必重写 onPullDownRefresh()、onReachBottom();

问题

如果修改 checkbox 的样式

时间选择器只有时、分,没有秒

slider滑动组件拖动块不能改颜色

小程序下拉刷新不触发 onPullDownRefresh

小程序与RN相比

小程序布局写法简单,RN的布局比较麻烦

小程序的组件简单,RN组件麻烦,并且IOS和Android兼容

RN可以随意发起网络请求访问数据,小程序需要指定服务器并且需要https协议

RN需要与通过Xcode来进去打包、并且需要在appStor进行发布审核

RN做的app需要到商店下载使用,小程序发布后在微信就可以找到

API

1、getApp() 取App实例, 下面可以设置globalData来设置全局数据

    const app = getApp();
    app.globalData.userInfo;        // 获取当前用户信息

2、getCurrentPages(): 数组中第一个元素为首页,最后一个元素为当前页面

setTimeout、setInterval定时器


一、网络

    1、wx.request: 网络请求

        wx.request({
    url:url,
    data:data,
    header:{
        "Content-Type":"application/json"
    },
    success:function(res){
                console.log(res.data)
    },
    fail:function(err){
                console.log(err)
    }
    })

    2、wx.uploadFile: 上传文件

    3、wx.downloadFile: 下载文件

    4、wx.webSocket: 都需要设置指定的服务器

    app.json中通过networktimeout配置超时时间


二、存储

    1、wx.setStorage/wx.setStorageSync: 存储到Storage上

    2、wx.getStorage/wx.getStorageSync: 获取Storage的数据

    3、wx.clearStorage/wx.clearStorageSync: 清除

    4、wx.removeStorage/wx.removeStorageSync: 删除某一个


三、文件系统

    const fs = wx.getFileSystemManager()


四、多线程Worker

    app.json中配置 { "workers": "workers" }

    Worker.postMessage() 来发送数据

    Worker.onMessage() 来接收数据


五、服务端

    getAccessToken: 获取access_token,是小程序全局唯一后台接口调用凭据

    code2Session


六、硬件

    1、wx.openBluetoothAdapter: 打开蓝牙

    2、wx.closeBluetoothAdapter: 关闭蓝牙 或小程序被销毁为止


七、消息




wx.getSystemInfo 或者 wx.getSystemInfoSync 获取小程序的基本库版本

wx.canIUse 判断是否可以在该基础库版本下直接使用对应的API或者组件

####

一、input的双向绑定

    <input placeholder="这是一个可以自动聚焦的input" class="inp" bindinput="inpValue" />

    {

        inpValue(e){

        }
    }

| http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html // 公众服务平台所有的sdk
| https://mp.weixin.qq.com/debug/wxadoc/introduction/index.html?t=20171013 // 小程序
| https://www.w3cschool.cn/weixinapp/9wou1q8j.html
| http://203.195.235.76/jssdk/ 小程序demo
| https://github.com/gooking/awesome-wechat-weapp 微信小程序开发资源汇总