WePY 2.0 新特性

栏目: JavaScript · 发布时间: 4年前

内容简介:作者 | 张鹏Android 程序员,关注大前端各种新兴技术。

作者 | 张鹏

WePY 2.0 新特性

Android 程序员,关注大前端各种新兴技术。

WePY 2.0 难产一年最近差不多可以使用了,目前最新版为 @wepy/core@2.0.0-alpha.7 ,不过社区还是不太友好,活跃度不高,感觉主要是脱了太久, mpvue  taro   去年都很火。文档更不用说了,不存在的。

现在通过项目模板去感受下都用哪些变化(等有官方文档后再做详细说明):

Node 包的变化

这个需要首先说明下,以前我们如果使用 wepy ,全局安装   wepy-cli@1.7.2 ,然后通过   wepy   命令执行   wepy init standard myproject 。会在当前目录下创建一个模板工程名为   myproject

现在 wepy 移动到了 @wepy   组下面,wepy 2.0 相关的包基本全部移动到了 @wepy   下面,这里有个问题,如果我不安装   @wepy/cli   我就不好用2.0 的 wepy 去创建模板,如果我全局升级了   wepy-cli ,我原来的项目就不能运行了,倒是有个方法,先创建一个npm空包,然后在里面安装   @wepy/cli   ,然后在这个空包目录下使用 wepy   命令去创建2.0的模板。

WePY 2.0 新特性

所以这里需要注意点就是如果有很多老项目,那个2.0的wepy就不要全局安装了,两个版本是不兼容的。执行下列命令创建一个2.0的模板:

./node_modules/.bin/wepy init standard myproject

代码中的 wepy 也从 import wepy from 'wepy'   变成了   import wepy from '@wepy/core'

更类似 vue 了

1.x 的 page   是这样定义的:

export default class extends wepy.page {
  config = {}
  components = {}
  data = {}
  computed = {}
  mixins = []
  methods = {}
  events = {}
  onLoad(options) {}
  onShow() {}
}

2.x 的 page   的定义如下:

wepy.page({
  hooks: {
    // Page 级别 hook, 只对当前 Page 的 setData 生效。
    'before-setData': function (dirty) {
      return true
    }
  },
  mixins: [],
  data: {},
  computed: {},
  methods: {},
  created () {}
})

这里多了一个 hooks,因为没有文档,暂时只看到了 before-setData   的 hook 方法,应该就是 hook 些系统方法的地方。给开发更多的控制能力。

*   before-setData   参数为变化的数据,返回修改后的变得的数据,如果返回 false ,那么将不会调用原生的   setData

同样地,app 和 component 分别改为了 wepy.app()    wepy.component ,内容和 page 类似。

模板支持方法了

这个特性真的是太必须了,虽然看起来应该没有 vue 的 filter 好用,但有总比没有好。

你都无法想象在 1.x 上如何实现这样的功能,那就是没有。试想一下后端给的数据你在渲染时不能修改(可做极其有限的修改,如加个字符串,数字运算等,这些有啥用?),在 vue 里面,你可以在模板中将这个对象传给一个 mehtods 中的方法,让其处理完返回处理后的结果,或者使用 filter 功能。但是在wepy 1.x 中不支持,也不能调用外部的方法。大概只能两种方法吧,一种 computed 加个包装方法,但是这种在循环中无法使用,另外还会出现冗余计算,数据一变,都会重新计算一次。

所以一般都那样做,一般都是请求到了后端数据,然后遍历一遍数据,自己处理,比如,后端返回的一个商品的价格对象:

{
    name: '袜子',
    price: 990,
    date: 1556346973000,
    type: 1
}

其实我需要的是:

{
    name: '袜子',
    price: '¥9.9元',
    date: '2019-04-27 14:36:13',
    type: '日常用品'
}

这个时候多么想后端返回我想要的数据,可是不可能的,有句话说了:别人给的永远不会 100% 是你想要的。

这时能做的只有自己动手进行数据转换。一般直接在原数据上处理:

{
    name: '袜子',
    price: 990,
    priceText: '¥9.9元',
    date: 1556346973000,
    dateText: '2019-04-27 14:36:13'
    type: 1
    typeText: '日常用品'
}

渲染时取自己想要的字段即可。那么现在的看看新功能如何使用:

<wxs module="m1" lang="babel">
  const getTime = (time) => {
    let date = getDate(time);
    let hour = date.getHours();
    let mins = date.getMinutes();
    let sec = date.getSeconds();
    let milli = date.getMilliseconds();
    return `${hour}:${mins}:${sec}.${milli}`;
  }
  module.exports.getTime = getTime;
</wxs>

.wpy  文件新增了   wxs   标签,与   template  style   以及   script   同级。看代码应该就明白了,就是导出方法,猜测应该是和微信原生小程序有关,这里可能是直接到原生 wxs 了。使用时在模板中直接调用: {{m1.getTime(currentTime)}}

新增 hooks

hooks 是 2.x 中新增的功能,目前来看示例中只 hook 了 before-setData   方法,可以返回 false 取消 setData 的调用,或者返回 data 对象,交由下一步继续处理。

app  和   page   都可以拦截,app 拦截全局方法,优先执行 page 的 hook 方法,将返回结果再交于app处理。示例中解释如下:

Page 级别 hook, 只对当前 Page 的 setData 生效。App 级别 hook,对整个 App 生效。同时存在 Page hook 和 App hook 时,优先执行 Page hook,返回值再交由 App hook 处。

新增 wepy   实例

wepy 可以创建一个实例使用,用法很简单,这个功能很不错,全局通信很方便。以前要自己去维护一些单实例去做通知,做事件处理。

import wepy from '@wepy/core';
let eventHub = new wepy();
export default eventHub;

在使用的地方,注册事件监听即可, 多次注册就回调多次,所以不要在 onShow 等会多次调用的方法中注册事件监听,除非你就是想回调多次

import eventHub from './common/eventHub';
eventHub.$on('app-launch', (...args) => {
  console.log('app-launch event emitted, the params are:');
  console.log(args);
});

发送事件很简单,如下:

eventHub.$emit('app-launch', {a: 1}, {b: 2});

组件的使用

在模板中可以看到新增 wxs    config ,wxs 如上面说的,应该是为了模板使用方法。config 应该是为了组件结构的改动,可以支持单独抽离出来了。

组件的引入改到了 <config>   中,如下:

usingComponents: {
    panel: '~@/components/panel',
    counter: '~counter',
    list: '../components/list',
    group: '../components/group',
    "slide-view": "module:miniprogram-slide-view"
}

wepy.config.js 中会配置一些 alias,如下:

alias: {
  counter: path.join(__dirname, 'src/components/counter'),
  '@': path.join(__dirname, 'src')
},

如果不加   ~ 那么   'counter'   会被当做 './counter' '@/components/panel'   会被当做 './@/components/panel'~   的作用就是区分其不是相对路径的。

另外你还可以使用小程序原生的组件,如 miniprogram-slide-view 引用方法为: "slide-view": "module:miniprogram-slide-view"

其他的变化

  • 编译速度有了提升,也不再输出一堆编译日志了。

  • 编译生成的目录不在是 dist ,改为   weapp ,这个可以自定义。

  • 脏检查机制改为了 vue 的 setter/getter 观察方式。

  • input 可以使用和 vue 一样的属性 v-model ,不用在监听事件来获取输入的内容了。

  • 模板方法可以直接写简单代码了和 vue 一样,如 @tap="currentTime = +new Date()"

  • 动态 class,如: <span class="count" :class="{red: num > 55, green: num < 45}"> {{num}} </span> ,和 vue 类似。

  • 可以使用 v-for   来做循环,也可以这样   <block wx:for-items="{{list}}" wx:for-index="index" wx:for-item="item" wx:key="id">

  • 应该已经达到了完全的组件,1.x 的组件是伪组件,不能 data,不能 computed,不能methods,用起来别提有多难受了,现在测试效果来看该支持的都支持了,和 vue 应该一样了。

  • props 中属性增加 coerce   方法,用于 prop 的修改。

结语

2.x 不兼容 1.x 这个是一个不好的地方,老 wepy 项目不好迁移,新项目又可能不再使用 wepy 了。虽然还没有使用 2.x,但是从示例来看, 2.x 解决了很多 1.x 比较头痛的一些问题。可以尝试下。

全文完

以下文章您可能也会感兴趣:

我们正在招聘 Java 工程师,欢迎有兴趣的同学投递简历到 rd-hr@xingren.com 。

WePY 2.0 新特性

杏仁技术站

长按左侧二维码关注我们,这里有一群热血青年期待着与您相会。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ASP.NET 2.0入门经典

ASP.NET 2.0入门经典

哈特 / 清华大学出版社 / 2006-8 / 78.00元

该书是Wrox红皮书中的畅销品种, 从初版、1.0版、1.1版到目前的2.0版,已经3次升级,不仅内容更加完善、实用,还展现了.NET 2.0的最新技术和ASP.NET 2.0最新编程知识,是各种初学者学习ASP.NET的优秀教程,也是Web开发人员了解ASP.NET 2.0新技术的优秀参考书。该书与《ASP.NET 2.0高级编程(第4版)》及其早期版本,曾影响到无数中国Web程序员。一起来看看 《ASP.NET 2.0入门经典》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具