微信小程序wepy框架学习和使用心得详解


Posted in Javascript onMay 24, 2019

一、微信小程序wepy框架简介:

微信小程序WePY框架是腾讯官方推出来的框架,类似的框架还有美团的mpvue,京东的Taro等; 目前公司开发小程序主要用到的是微信原生方法和官方的wepy框架; wepy框架在开发过程中参考了 Vue 等现有框架的一些语法风格和功能特性,对原生小程序的开发模式进行了再次封装,更贴近于 MVVM 架构模式, 并支持ES6/7的一些新特性。相对更容易上手,提高开发效率;

二、WePY项目的创建与目录结构

WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具

npm install wepy-cli -g

在开发目录中生成Demo开发项目

wepy new myproject

切换至项目目录

cd myproject

安装依赖

npm install

开启实时编译

wepy build --watch

WePY项目的目录结构如下

├── dist          小程序运行代码目录(该目录由WePY的build指令自动编译生成,请不要直接修改该目录下的文件)
 ├── node_modules      
 ├── src          代码编写的目录(该目录为使用WePY后的开发目录)
 |  ├── components     WePY组件目录(组件不属于完整页面,仅供完整页面或其他组件引用)
 |  |  ├── com_a.wpy   可复用的WePY组件a
 |  |  └── com_b.wpy   可复用的WePY组件b
 |  ├── pages       WePY页面目录(属于完整页面)
 |  |  ├── index.wpy   index页面(经build后,会在dist目录下的pages目录生成index.js、index.json、index.wxml和index.wxss文件)
 |  |  └── other.wpy   other页面(经build后,会在dist目录下的pages目录生成other.js、other.json、other.wxml和other.wxss文件)
 |  └── app.wpy      小程序配置项(全局数据、样式、声明钩子等;经build后,会在dist目录下生成app.js、app.json和app.wxss文件)
 └ ── package.json      项目的package配置

搭建好项目后,IDE需配置代码高亮,文件后缀为.wpy,可共用Vue的高亮规则,但需要手动设置,具体配置大家可参考wepy官方文档

三、wepy使用心得总结:

1.wepy代码风格类似Vue,如computed,data,methods等用法差不多,熟悉vue开发的同学看看文档可以轻松上手,不过还是有很多地方写法容易混淆,我工作中遇到的总结几个,如列表循环,条件渲染,父子组件值传递等,下面举例说明:

1). wepy和vue列表循环对比:

// wepy 列表循环,外面可套一层repeat标签,注意和vue写法的区别
  <repeat for="{{list}}" key="index>
    <view>{{item}}</view>
  </repeat>
  
  // vue 列表循环,外面可套一层template标签
  <template v-for="(item,index) in list" :key="index"> // 不推荐key直接用索引index
    <div>{{item}}<div>
  </template>

2). wepy和vue条件渲染中,wepy需要加{{}},vue不需要,里面都可以写表达式进行判断:

<view wx:if="{{show}}"></view>
<div v-if="show"></div>

3). 父子组件值传递两者都在子组件中用props接收, props中可以定义能接收的数据类型,如果不符合会报错,wepy可以通过使用.sync修饰符来达到父组件数据绑定至子组件的效果,也可以通过设置子组件props的twoWay:true来达到子组件数据绑定至父组件的效果。那如果既使用.sync修饰符,同时子组件props中添加的twoWay: true时,就可以实现数据的双向绑定了;

// parent.wpy
    
    <child :title="parentTitle" :syncTitle.sync="parentTitle" :twoWayTitle="parentTitle"></child>
    
    data = {
      parentTitle: 'p-title'
    };
    
    
    // child.wpy
    
    props = {
      // 静态传值
      title: String,
    
      // 父向子单向动态传值
      syncTitle: {
        type: String,
        default: 'null'
      },
    
      twoWayTitle: {
        type: String,
        default: 'nothing',
        twoWay: true
      }
    };
    
    onLoad () {
      console.log(this.title); // p-title
      console.log(this.syncTitle); // p-title
      console.log(this.twoWayTitle); // p-title
    
      this.title = 'c-title';
      console.log(this.$parent.parentTitle); // p-title.
      this.twoWayTitle = 'two-way-title';
      this.$apply();
      console.log(this.$parent.parentTitle); // two-way-title. --- twoWay为true时,子组件props中的属性值改变时,会同时改变父组件对应的值
      this.$parent.parentTitle = 'p-title-changed';
      this.$parent.$apply();
      console.log(this.title); // 'c-title';
      console.log(this.syncTitle); // 'p-title-changed' --- 有.sync修饰符的props属性值,当在父组件中改变时,会同时改变子组件对应的值。

2.wepy支持自定义组件开发,实现组件复用,减少代码冗余,提高开发效率;

3.wepy支持引入npm包,拓展了很多方法;

4.支持Promise,ES2015+特性,如async await 等;

5.支持多种编译器,Less/Sass/Styus、Babel/Typescript、Pug;

6.支持多种插件处理,文件压缩,图片压缩,内容替换等;

7.支持 Sourcemap,ESLint代码规范管理等;

8.对小程序wx.request方法参数进行了修改,返回Promise对象,优化了事件参数传递,具体用法如下:

// wx.request原生代码:
wx.request({
  url: 'xxx',
  success: function (data) {
    console.log(data);
  }
});

// WePY 使用方式, 需要开启 Promise 支持,参考开发规范章节
wepy.request('xxxx').then((d) => console.log(d));

// async/await 的使用方式, 需要开启 Promise 和 async/await 支持,参考 WIKI
async function request () {
  let d = await wepy.request('xxxxx');
  console.log(d);

// 原生的事件传参方式:
<view data-id="{{index}}" data-title="wepy" data-other="otherparams" bindtap="tapName"> Click me! </view>
Page({
  tapName: function (event) {
    console.log(event.currentTarget.dataset.id)// output: 1
    console.log(event.currentTarget.dataset.title)// output: wepy
    console.log(event.currentTarget.dataset.other)// output: otherparams
  }
});

// WePY 1.1.8以后的版本,只允许传string。
<view @tap="tapName({{index}}, 'wepy', 'otherparams')"> Click me! </view>
methods: {
  tapName (id, title, other, event) {
    console.log(id, title, other)// output: 1, wepy, otherparams
  }
}

四 、最后一点点感悟:

本文总结的比较浅显,很多地方说的也不是太详细,如有错误的地方大家可以批评指正,欢迎大家留言一起交流探讨,坚持学习,不断探索总结,路漫漫其修远兮,吾将上下而求索!

参考资料:

wepy官方文档 ;

微信小程序官网开发文档 ;

 vue官方开发文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
限制文本字节数js代码
Mar 06 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
Aug 09 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
Jan 24 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 Javascript
JQuery实现倒计时按钮具体方法
Nov 14 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
初识 Vue.js 中的 *.Vue文件
Nov 22 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
webpack-url-loader 解决项目中图片打包路径问题
Feb 15 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 Javascript
WebWorker 封装 JavaScript 沙箱详情
Nov 02 Javascript
JS实现可切换图片的幻灯切换效果示例
May 24 #Javascript
微信小程序动态添加view组件的实例代码
May 23 #Javascript
Vue+Element实现动态生成新表单并添加验证功能
May 23 #Javascript
vue elementui el-form rules动态验证的实例代码详解
May 23 #Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
May 23 #Javascript
使用vue自定义指令开发表单验证插件validate.js
May 23 #Javascript
微信小程序开发实现消息推送
Nov 18 #Javascript
You might like
php学习笔记之 函数声明(二)
2011/06/09 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
jQuery简单实现网页选项卡特效
2014/11/24 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
python ip正则式
2009/05/07 Python
python算法学习之基数排序实例
2013/12/18 Python
python连接mysql调用存储过程示例
2014/03/05 Python
python单线程实现多个定时器示例
2014/03/30 Python
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
NumPy 数组使用大全
2019/04/25 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
基层党组织建设整改方案
2014/09/16 职场文书
齐云山导游词
2015/02/06 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python