Taro支持将web框架直接运行在各个平台,开发者使用的大多数是react,vue。但是在taro中使用react开发和我们熟悉的web端还是存在一些差异,以下我们将差异详细列出。
taro3中,开发者使用真实的react,而react中的api包括Component、useState、useEffect都需要从react包中获取。
// 从 'react' 包中获取 React API
import React, { Component, useState, useEffect } from 'react'
taro引入了人口组件app,和页面组件page。一个taro应用必须有一个入口组件app和最少一个页面组件page。
每个taro应用都需要一个入口组件来注册应用,入口文件默认是src目录下的app.js。在入口组件中我们可以设置全局状态或访问小程序入口实例的生命周期。
入口组件除了支持所有的React的生命周期外,还支持以下几个钩子函数:
每一个taro页面都至少包含一个页面组件,页面组件可以通过taro路由进行跳转,也可以访问小程序的生命周期。
跟入口组件生命周期差不太多,所有react中的生命周期都可以使用。还有以下生命周期
onAddToFavorites (res) {
// webview 页面返回 webviewUrl
console.log('WebviewUrl: ', res?.webviewUrl)
return {
title: '自定义标题',
imageUrl: 'https://demo.png',
query: 'name=xxx&age=xxx',
}
}
export default class Index extends Component {
onShareAppMessage (res) {
if (res.from === 'button') {
// 来自页面内转发按钮
console.log(res.target)
}
return {
title: '自定义转发标题',
path: '/page/user?id=123'
}
}
}
class Index extends Component {
onShareAppMessage () {}
onShareTimeline () {
console.log('onShareTimeline')
return {}
}
}
onResize (Object),小程序屏幕旋转时触发。详见 响应显示区域变化。
onTitleClick (),只有支付宝小程序支持,点击标题触发
onOptionMenuClick (),只有支付宝小程序支持,点击导航栏额外图标触发
onPopMenuClick (),只有支付宝小程序支持,点击右上角通用菜单中的自定义菜单按钮触发。
onPullIntercept (),只有支付宝小程序支持,下拉截断时触发。
taro中可以使用小程序规范的内置组件进行开发,比如
<View>、<Text>、<Button>....
事件和web端是一样的,在事件的回调函数中,第一个参数是事件对象,回调中调用stopProgapation阻止冒泡。
方式一:样式
Taro next自定义遮罩如何防止击穿
方式二:catchMove
地图组件本身就是可以滚动的,即使固定了它的宽高。所以第一种办法处理不了冒泡到地图组件上的滚动事件。
// 这个 View 组件会绑定 catchtouchmove 事件而不是 bindtouchmove
<View catchMove></View>
dataset是特别的模板属性,主要作用是可以在事件回调的event对象中获取到dataset相关数据。
在事件回调对象中可以通过 event.target.dataset 或 event.currentTarget.dataset 获取到。
react中的所有生命周期函数都可以在taro中使用。
有两个稍微有些不同:
在 Taro 中 ref 的用法和 React 完全一致,但是获取到的 “DOM” 和浏览器环境还有小程序环境都有不同。
使用react ref获取到的是taro的虚拟dom,和浏览器的dom相似,可以操作它的style,调用它的api等。
但是taro的虚拟dom运行在小程序的逻辑层,并不是真实的小程序渲染层节点。
import React, { createRef } from 'react'
import { View } from '@tarojs/components'
export default class Test extends React.Component {
el = createRef()
componentDidMount () {
// 获取到的 DOM 具有类似 HTMLElement 或 Text 等对象的 API
console.log(this.el.current)
}
render () {
return (
<View id='only' ref={this.el} />
)
}
}
获取真实的小程序渲染层节点,需要在 onReady 生命周期中,调用小程序中用于获取 DOM 的 API。
import React from 'react'
import { View } from '@tarojs/components'
import Taro from '@tarojs/taro'
export default class Test extends React.Component {
onReady () {
// onReady 触发后才能获取小程序渲染层的节点
Taro.createSelectorQuery().select('#only')
.boundingClientRect()
.exec(res => console.log(res))
}
render () {
return (
<View id='only' />
)
}
}
因为 development 版本的 React 体积较大,为了减少小程序体积,方便开发时真机预览。Taro 在构建小程序时默认使用 production 版本的 React 相关依赖。
但是 production 版本的 React 出错时不会展示报错堆栈的信息。因此当你遇到类似这种报错时:【Error: Minified React error #152】。可以修改编译配置中的 mini.debugReact 选项,然后重新开启编译。这样 Taro 会使用 development 版本的 React,从而输出报错堆栈。