iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >微信小程序第三方框架对比之wepy、mpvue、taro的示例分析
  • 701
分享到

微信小程序第三方框架对比之wepy、mpvue、taro的示例分析

2024-04-02 19:04:59 701人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关微信小程序第三方框架对比之wepy、mpVue、taro的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。众所周知如今市面上端的形态多种

这篇文章将为大家详细讲解有关微信小程序第三方框架对比之wepy、mpVue、taro的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

微信小程序第三方框架对比之wepy、mpvue、taro的示例分析

众所周知如今市面上端的形态多种多样,手机WEBReactNative、微信小程序, 支付宝小程序, 快应用等,每一端都是巨大的流量入口,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。

 小程序开发有哪些痛点?

 •频繁调用 setData及 setData过程中页面跳闪
 •组件化支持能力太弱(几乎没有)
 •不能使用 less、sCSS 等预编译器
 •request 并发次数限制

 为什么使用第三方框架?

•只要熟悉vue或react即可快速上手,学习成本低
 •一套代码可在多端编译运行(微信,支付宝,h6,RN)  支付宝小程序暂不完善
•组件化开发,完美解决组件隔离,组件嵌套,组件通信等问题
•支持使用第三方 npm 资源
•使小程序可支持 Promise,解决回调烦恼
 •可使用 Generator Fu-nction / Class / Async Function 等特性,提升开发效率
•对小程序本身的优化,如生命周期的补充,性能的优化等等
 •支持样式编译器: Scss/Less,模板编译器,代码编译器:Babel/typescript

    第三方框架对比 wepy mpvue taro

  在这里我通过对目前已开源的三种常用小程序框架做一个综合对比, 还有一个叫nanchi的基于react的小程序转译框架,由于没来的及研究暂不做比较;

•WEPY https://tencent.GitHub.io/wepy/document.html

  腾讯团队开源的一款类vue语法规范的小程序框架,借鉴了Vue的语法风格和功能特性,支持了Vue的诸多特征,比如父子组件、组件之间的通信、computed属性计算、wathcer监听器、props传值、slot槽分发,还有很多高级的特征支持:Mixin混合、拦截器等;WePY发布的第一个版本是2016年12月份,也就是小程序刚刚推出的时候,到目前为止,WePY已经发布了52个版本, 最新版本为1.7.2;

•MpVue Http://mpvue.com/mpvue/#-html

  美团团队开源的一款使用 vue.js 开发微信小程序的前端框架。使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力。mpvue在发布后的几天间获得2.7k的star,上升速度飞起,截至目前为止已经有13.7k的star;

•Taro https://taro.aotu.io/

   京东凹凸实验室开源的一款使用 React.js 开发微信小程序的前端框架。它采用与 React 一致的组件化思想,组件生命周期与 React 保持一致,同时支持使用 JSX 语法,让代码具有更丰富的表现力,使用 Taro 进行开发可以获得和 React 一致的开发体验。,同时因为使用了react的原因所以除了能编译h6, 小程序外还可以编译为ReactNative;

Star

微信小程序第三方框架对比之wepy、mpvue、taro的示例分析

微信小程序第三方框架对比之wepy、mpvue、taro的示例分析

 生命周期

  同为vue规范的mpvue和wepy的生命周期和各种方法不尽相同

  wepy

  wepy生命周期基本与原生小程序相同,再此基础上糅合了一些vue的特性; 对于WePY中的methods属性,因为与Vue中的使用习惯不一致,非常容易造成误解,这里需要特别强调一下:WePY中的methods属性只能声明页面wxml标签的bind、catch事件,不能声明自定义方法,这与Vue中的用法是不一致的。  

import wepy from 'wepy';
export default class MyPage extends wepy.page {
// export default class MyComponent extends wepy.component {
  customData = {} // 自定义数据
  customFunction () {} //自定义方法
  onLoad () {} // 在Page和Component共用的生命周期函数
  onShow () {} // 只在Page中存在的页面生命周期函数
  config = {}; // 只在Page实例中存在的配置数据,对应于原生的page.JSON文件
  data = {}; // 页面所需数据均需在这里声明,可用于模板数据绑定
  components = {}; // 声明页面中所引用的组件,或声明组件中所引用的子组件
  mixins = []; // 声明页面所引用的Mixin实例
  computed = {}; // 声明计算属性(详见后文介绍)
  watch = {}; // 声明数据watcher(详见后文介绍)
  methods = {}; // 声明页面wxml中标签的事件处理函数。注意,此处只用于声明页面wxml中标签的bind、catch事件,自定义方法需以自定义方法的方式声明
  events = {}; // 声明组件之间的事件处理函数
}

  mpvue

  mpvue 除了 Vue 本身的生命周期外,还兼容了小程序生命周期,这部分生命周期钩子的来源于微信小程序的 Page, 除特殊情况外,不建议使用小程序的生命周期 钩子。

Vue
 beforeCreate
 created
 beforeMount
 mounted
 beforeUpdate
 updated
 activated
 deactivated
 beforeDestroy
 destroyed
 app 部分
 onLaunch,初始化
 onShow,当小程序启动,或从后台进入前台显示
 onHide,当小程序从前台进入后台
 page 部分
 onLoad,监听页面加载
 onShow,监听页面显示
 onReady,监听页面初次渲染完成
 onHide,监听页面隐藏
 onUnload,监听页面卸载
 onPullDownRefresh,监听用户下拉动作
 onReachBottom,页面上拉触底事件的处理函数
 onShareAppMessage,用户点击右上角分享
 onPageScroll,页面滚动
 onTabItemTap, 当前是 tab 页时,点击 tab 时触发 (mpvue 0.0.16 支持)

简单示例

new Vue({
 data: {
  a: 1
 },
 created () {
  // `this` 指向 vm 实例
  console.log('a is: ' + this.a)
 },
 onShow () {
  // `this` 指向 vm 实例
  console.log('a is: ' + this.a, '小程序触发的 onshow')
 }
})
// => "a is: 1"

 taro与react生命周期完全相同

class Clock extends Component {
 constructor (props) {
  super(props)
  this.state = { date: new Date() }
 }
 componentDidMount() {
 }
 componentWillUnmount() {
 }
 render () {
  return (
   <View>
    <Text>Hello, world!</Text>
    <Text>现在的时间是 {this.state.date.toLocaleTimeString()}.</Text>
   </View>
  )
 }
}

列表渲染

在列表渲染上三者也分别有不同的应用方法

wepy当需要循环渲染WePY组件时(类似于通过wx:for循环渲染原生的wxml标签),必须使用WePY定义的辅助标签<repeat>

<template>
  <!-- 注意,使用for属性,而不是使用wx:for属性 -->
  <repeat for="{{list}}" key="index" index="index" item="item">
    <!-- 插入<script>脚本部分所声明的child组件,同时传入item -->
    <child :item="item"></child>
  </repeat>
</template>
<script>
  import wepy from 'wepy';
  // 引入child组件文件
  import Child from '../components/child';
  export default class Index extends wepy.component {
    components = {
      // 声明页面中要使用到的Child组件的ID为child
      child: Child
    }
    data = {
      list: [{id: 1, title: 'title1'}, {id: 2, title: 'title2'}]
    }
  }
</script>

mpvue使用v-for与vue一致,只是需要注意一点,嵌套列表渲染,必须指定不同的索引

<!-- 在这种嵌套循环的时候, index 和 itemIndex 这种索引是必须指定,且别名不能相同,正确的写法如下 -->
<template>
  <ul v-for="(card, index) in list">
    <li v-for="(item, itemIndex) in card">
      {{item.value}}
    </li>
  </ul>
</template>

taro的列表循环用法基本与react相同,有一点需要注意,在 React 中,JSX 是会编译成普通的 JS 的执行,每一个 JSX 元素,其实会通过 createElement 函数创建成一个 javascript 对象(React Element),因此实际上你可以这样写代码 React 也是完全能渲染的:

const list = this.state.list.map(l => {
 if (l.selected) {
  return <li>{l.text}</li>
 }
}).filter(React.isValidElement)

但是 Taro 中,JSX 会编译成微信小程序模板字符串,因此你不能把 map 函数生成的模板当做一个数组来处理。当你需要这么做时,应该先处理需要循环的数组,再用处理好的数组来调用 map 函数。例如上例应该写成:

const list = this.state.list
 .filter(l => l.selected)
 .map(l => {
  return <li>{l.text}</li>
 })

事件处理

mpvue目前全支持小程序的事件处理器,引入了 Vue.js 的虚拟 DOM ,在前文模版中绑定的事件会被挂在到 vnode 上,同时 compiler 在 wxml 上绑定了小程序的事件,并做了相应的映射,所以你在真实点击的时候通过 runtime 中 handleProxy 通过事件类型分发到 vnode 的事件上,同 Vue 在 WEB 的机制一样,所以可以做到无损支持。同时还顺便支持了自定义事件和 $emit 机制

// 事件映射表,左侧为 WEB 事件,右侧为 小程序 对应事件
{
  click: 'tap',
  touchstart: 'touchstart',
  touchmove: 'touchmove',
  touchcancel: 'touchcancel',
  touchend: 'touchend',
  tap: 'tap',
  longtap: 'longtap',
  input: 'input',
  change: 'change',
  submit: 'submit',
  blur: 'blur',
  focus: 'focus',
  reset: 'reset',
  confirm: 'confirm',
  columnchange: 'columnchange',
  linechange: 'linechange',
  error: 'error',
  scrolltoupper: 'scrolltoupper',
  scrolltolower: 'scrolltolower',
  scroll: 'scroll'
}

踩坑注意(官方文档):

•列表中没有的原生事件也可以使用例如 bindregionchange 事件直接在 dom 上将bind改为@ @regionchange,同时这个事件也非常特殊,它的 event type 有 begin 和 end 两个,导致我们无法在handleProxy 中区分到底是什么事件,所以你在监听此类事件的时候同时监听事件名和事件类型既 <map @regionchange="functionName" @end="functionName" @begin="functionName"><map>
•小程序能力所致,bind 和 catch 事件同时绑定时候,只会触发 bind ,catch 不会被触发,要避免踩坑。
•事件修饰符 ◦.stop 的使用会阻止冒泡,但是同时绑定了一个非冒泡事件,会导致该元素上的 catchEventName 失效!
◦.prevent 可以直接干掉,因为小程序里没有什么默认事件,比如submit并不会跳转页面
◦.capture 支持 1.0.9
◦.self 没有可以判断的标识
◦.once 也不能做,因为小程序没有 removeEventListener, 虽然可以直接在 handleProxy 中处理,但非常的不优雅,违背了原意,暂不考虑

•其他 键值修饰符 等在小程序中压根没键盘,所以。。。

wepy事件绑定区别于vue,根据原生小程序事件提供了语法优化

绑定事件

 bindtap="click" 替换为 @tap="click",

取消冒泡

catchtap="click"替换为@tap.stop="click"。

捕获监听事件

 capture-bind:tap="click" 替换为 @tap.capture="click",

中断捕获监听

capture-catch:tap=“click"替换为 @tap.capture.stop="click"。

Taro 元素的事件处理和 DOM 元素的很相似。但是有一点语法上的不同:

Taro 事件绑定属性的命名采用驼峰式写法,而不是小写。 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串 (DOM 元素的写法)。 例如,传统的微信小程序模板:

<button onclick="activateLasers">
 Activate Lasers
</button>

Taro 中稍稍有点不同:

<button onClick={this.activateLasers}>
 Activate Lasers
</button>

在 Taro 中另一个不同是你不能使用 catchEvent 的方式阻止事件冒泡。你必须明确的使用 stopPropagation。例如,阻止事件冒泡你可以这样写:

class Toggle extends React.Component {
 constructor (props) {
  super(props)
  this.state = {isToggleOn: true}
 }
 onClick = (e) => {
  e.stopPropagation()
  this.setState(prevState => ({
   isToggleOn: !prevState.isToggleOn
  }))
 }
 render () {
  return (
   <button onClick={this.onClick}>
    {this.state.isToggleOn ? 'ON' : 'OFF'}
   </button>
  )
 }
}

 request请求

wepy对wx.request做了接受参数的修改,值得一提的是它提供了针对全局的intercapter拦截器

// 原生代码:
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);
}

拦截器

import wepy from 'wepy';
export default class extends wepy.app {
  constructor () {
    // this is not allowed before super()
    super();
    // 拦截request请求
    this.intercept('request', {
      // 发出请求时的回调函数
      config (p) {
        // 对所有request请求中的OBJECT参数对象统一附加时间戳属性
        p.timestamp = +new Date();
        console.log('config request: ', p);
        // 必须返回OBJECT参数对象,否则无法发送请求到服务端
        return p;
      },
      // 请求成功后的回调函数
      success (p) {
        // 可以在这里对收到的响应数据对象进行加工处理
        console.log('request success: ', p);
        // 必须返回响应数据对象,否则后续无法对响应数据进行处理
        return p;
      },
      //请求失败后的回调函数
      fail (p) {
        console.log('request fail: ', p);
        // 必须返回响应数据对象,否则后续无法对响应数据进行处理
        return p;
      },
      // 请求完成时的回调函数(请求成功或失败都会被执行)
      complete (p) {
        console.log('request complete: ', p);
      }
    });
  }
}

taro对request进行了二次封装,可以使用Taro.request(OBJECT)发起网络请求,支持 Promise 化使用。

微信小程序第三方框架对比之wepy、mpvue、taro的示例分析

微信小程序第三方框架对比之wepy、mpvue、taro的示例分析

import Taro from '@tarojs/taro'
Taro.request({
 url: 'http://localhost:8080/test',
 data: {
  foo: 'foo',
  bar: 10
 },
 header: {
  'content-type': 'application/json'
 }
})
 .then(res => console.log(res.data))

mpvue没有对request做特殊优化,与原生相同,可以自己根据需要进行封装

状态管理

wepy 可引用Redux和Mbox,目前wepy的脚手架内已经集成了redux,选择需要即可;

mpVue使用vuex

taro使用Redux

如何选择适合自己的项目

•如果只需要做一个微信小程序则根据自己的擅长框架选择mpvue或taro
•如果是当前老项目想像向程序迁移同时老项目又是使用vue开发,建议使用mpvue或wepy
•如果是老项目使用react开发且需要部分迁移小程序,建议使用taro
•如果是新项目且新项目需要同时支持微信小程序和支付宝小程序, 建议使用原生开发,因为目前框架的转译支付宝小程序支持并不是很好,且出了问题不好定位修改, 但如果是小demo不涉及太多逻辑的项目都可以使用框架作为尝鲜; 但如果是涉及太多交互逻辑的则不建议使用框架转译,由于支付宝小程序在视图层基本与小程序一致所以建议手动更改替换部分方法和全局替换一些属性或文件名,如wxml替换为axml这种, 手动转换时间比大概是四比一; 当然如果人手足够一端开发一个是最好的...

关于“微信小程序第三方框架对比之wepy、mpvue、taro的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 微信小程序第三方框架对比之wepy、mpvue、taro的示例分析

本文链接: https://www.lsjlt.com/news/73567.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 微信小程序第三方框架对比之wepy、mpvue、taro的示例分析
    这篇文章将为大家详细讲解有关微信小程序第三方框架对比之wepy、mpvue、taro的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。众所周知如今市面上端的形态多种...
    99+
    2024-04-02
  • 微信小程序框架wepy的示例分析
    这篇文章将为大家详细讲解有关微信小程序框架wepy的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。wepy框架借鉴了vue的语法风格和功能特性,但是在使用过程中还...
    99+
    2024-04-02
  • 微信第三方小程序代开发的示例分析
    这篇文章主要为大家展示了“微信第三方小程序代开发的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信第三方小程序代开发的示例分析”这篇文章吧。注意事项:...
    99+
    2024-04-02
  • 微信小程序开发框架MINA的示例分析
    这篇文章将为大家详细讲解有关微信小程序开发框架MINA的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。小程序MINA框架,及优点MINA框架:小程序使用的是MIN...
    99+
    2024-04-02
  • 微信小程序的示例分析
    这篇文章主要介绍微信小程序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!未来的发展趋势未来的发展趋势是一切触手可及。比如去餐馆吃饭,扫一扫二维码就可以看菜单、点菜、付款;到公交站台,扫一扫二维码就知道有哪些...
    99+
    2023-06-26
  • 微信小程序中线程架构的示例分析
    这篇文章主要介绍了微信小程序中线程架构的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。小程序的线程架构每个小程序包含一个描述整体程序...
    99+
    2024-04-02
  • 微信小程序开发之入门的示例分析
    这篇文章给大家分享的是有关微信小程序开发之入门的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、注册小程序账号1、进入微信公众平台(https://mp.weixin....
    99+
    2024-04-02
  • 基于mpvue微信小程序下载远程图片到本地的示例分析
    小编给大家分享一下基于mpvue微信小程序下载远程图片到本地的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果流程梳理获取图片远程地址数组-->遍历拿到图片缓存(临时地址)...
    99+
    2024-04-02
  • mpvue微信小程序中接口请求fly全局拦截的示例分析
    这篇文章主要介绍mpvue微信小程序中接口请求fly全局拦截的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!业务要求:  需要进入页面时就要游客登陆拿到token;  之后的...
    99+
    2024-04-02
  • 微信小程序中MD5方法的示例分析
    这篇文章给大家分享的是有关微信小程序中MD5方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。微信小程序 MD5的方法详解生成的文件可以放在  utils文件...
    99+
    2024-04-02
  • 微信小程序兼容方式的示例分析
    这篇文章主要介绍微信小程序兼容方式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容。文档会在组件,API等页面...
    99+
    2023-06-26
  • 微信小程序中wx.previewImage的示例分析
    这篇文章主要为大家展示了“微信小程序中wx.previewImage的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中wx.previewIm...
    99+
    2024-04-02
  • thinkphp5.1 easywechat4微信第三方开放平台的示例分析
    小编给大家分享一下thinkphp5.1 easywechat4微信第三方开放平台的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!thinkphp5.1 ...
    99+
    2023-06-20
  • 微信小程序WXS模块的示例分析
    这篇文章给大家分享的是有关微信小程序WXS模块的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。WXS 模块WXS 代码可以编写在 wxml 文件中的 <wxs> 标签内,或...
    99+
    2023-06-26
  • 微信小程序中wx.chooseAddress(OBJECT)的示例分析
    这篇文章给大家分享的是有关微信小程序中wx.chooseAddress(OBJECT)的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、wx.chooseAddress...
    99+
    2024-04-02
  • 微信小程序云开发的示例分析
    这篇文章主要介绍了微信小程序云开发的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下小程序云开发是微信最近推出的新的一项能...
    99+
    2024-04-02
  • 微信小程序模板之分页滑动栏的示例分析
    这篇文章给大家分享的是有关微信小程序模板之分页滑动栏的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下功能:1.分页栏与滑动视图绑定 2.点击分页栏自动滑动到对...
    99+
    2024-04-02
  • 微信小程序开发之全局配置的示例分析
    这篇文章给大家分享的是有关微信小程序开发之全局配置的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.app.json     使用app....
    99+
    2024-04-02
  • 微信小程序缓之缓存时效性的示例分析
    这篇文章将为大家详细讲解有关微信小程序缓之缓存时效性的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关于本地缓存1.wx.setStorage(wx.setSto...
    99+
    2024-04-02
  • nodejs开发企业微信第三方应用的示例分析
    小编给大家分享一下nodejs开发企业微信第三方应用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、注册第三发服务商...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作