wepy框架入门

安装 wepy 命令行工具。

npm install wepy-cli -g

在开发目录生成开发DEMO。

wepy new myproject

开发实时编译。

wepy build --watch

项目目录结构

    dist
    node_modules
    src
        components
            com_a.wpy
            com_b.wpy
        pages
            index.wpy
            page2.wpy
        app.wpy
    package.json

使用微信开发者工具新建项目,本地开发选择dist目录。
微信开发者工具 --> 项目 --> 关闭ES6转ES5。
本地项目根目录运行wepy build --watch,开启实时编译。

官方DEMO代码:

//index.js
//获取应用实例
var app = getApp()
Page({
  data: {
    motto: 'Hello World',
    userInfo: {}
  },
  //事件处理函数
  bindViewTap: function() {
    console.log('button clicked')
  },
  onLoad: function () {
    console.log('onLoad')
  }
})

基于wepy的实现:

import wepy from 'wepy';

export default class Index extends wepy.page {

    data = {
        motto: 'Hello World',
        userInfo: {}
    };
    methods = {
        bindViewTap () {
            console.log('button clicked');
        }
    };
    onLoad() {
        console.log('onLoad');
    };
}

wepy支持组件化开发
组件示例代码:

// index.wpy


官方DEMO:

project
    pages
        index
            index.json
            index.js
            index.wxml
            index.wxss
        log
            log.json
            log.wxml
            log.js
            log.wxss
    app.js
    app.json
    app.wxss

使用wepy框架后目录结构:

project
    src
        pages
            index.wpy
            log.wpy
        app.wpy

wepy默认使用babel编译,支持ES6 / 7的一些新特性

示例代码:

import wepy from 'wepy';

export default class Index extends wepy.page {

    getData() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve({data: 123});
            }, 3000);
        });
    };
    async onLoad() {
        let data = await this.getData();
        console.log(data.data);
    };
}

原有代码:

onLoad = function () {
    var self = this;
    wx.login({
        success: function (data) {
            wx.getUserInfo({
                success: function (userinfo) {
                    self.setData({userInfo: userinfo});
                }
            });
        }
    });
}

基于wepy实现代码:

async onLoad() {
    await wx.login();
    this.userInfo = await wx.getUserInfo();
}

执行wepy new demo后,会生成类似配置文件。

{
  "wpyExt": ".wpy",
  "sass": {},
  "less": {},
  "babel": {}
}



程序入口app.wpy



wepy页面index.wpy




wepy组件com.wpy




wepy 组件通信与交互

wepy.component基类提供三个方法$broadcast,$emit,$invoke

$this.$emit('some-event', 1, 2, 3, 4);
组件的事件监听需要写在events属性下,如:

import wepy form 'wepy';
export default class Com extends wepy.component {

    components = {};

    data = {};
    methods = {};

    events = {
        'some-event': ($event, ...args) {
               console.log(`${this.name} receive ${$event.name} from ${$event.source.name}`);
        }
    };
    // Other properties
}
$invoke$invoke是一个组件对另一个组件的直接调用,通过传入的组件路径找到相应组件,然后再调用其方法。
如果想在Page_Index中调用组件A的某个方法:

this.$invoke('ComA', 'someMethod', 'someArgs');
如果想在组件A中调用组件G的某个方法:

this.$invoke('./../ComB/ComG', 'someMethod', 'someArgs');

小程序通过Page提供的setData方法去绑定数据,如:

this.setData({title: 'this is title'});

wepy数据绑定方式

this.title = 'this is title';

在函数运行周期之外的函数里去修改数据需要手动调用$apply方法。如:

setTimeout(() => {
    this.title = 'this is title';
    this.$apply();
}, 3000);

// 官方

wx.request({
    url: 'xxx',
    success: function (data) {
        console.log(data);
    }
});

// wepy 使用方式
// request 接口从只接收Object变为可接收String

wx.request('xxxx').then((d) => console.log(d));

优化事件参数传递

// 官方
 Click me! 
Page({
  tapName: function(event) {
    console.log(event.currentTarget.hi)// output: WeChat
  }
});

// wepy 建议传参方式
 Click me! 

events: {
    tapName (event, id, title, other) {
        console.log(id, title, other)// output: 1, wepy, something
    }
}

改变数据绑定方式

// 官方
 {{ message }} 

onLoad: function () {
    this.setData({message: 'hello world'});
}


// wepy
 {{ message }} 

onLoad () {
    this.message = 'hello world';
}

组件代替模板和模块

// 官方