Taro 自身限制规范
不能在包含 JSX 元素的 map 循环中使用 if 表达式
以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:
numbers.map((number) => {
let element = null
const isOdd = number % 2
if (isOdd) {
element = <Custom />
}
return element
})
以下代码不会被警告,也应当在 Taro 任意端中能够运行:
numbers.map((number) => {
let isOdd = false
if (number % 2) {
isOdd = true
}
return isOdd && <Custom />
})
解决方案
尽量在 map 循环中使用条件表达式或逻辑表达式
numbers.map((number) => {
const isOdd = number % 2
return isOdd ? <Custom /> : null
})
numbers.map((number) => {
const isOdd = number % 2
return isOdd && <Custom />
})
不能使用 Array#map 之外的方法操作 JSX 数组
Taro 在小程序端实际上把 JSX 转换成了字符串模板,而一个原生 JSX 表达式实际上是一个 React/Nerv 元素(react-element)的构造器,因此在原生 JSX 中你可以随意地对一组 React 元素进行操作。但在 Taro 中你只能使用
map
方法,Taro 转换成小程序中wx:for
以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:
test.push(<View />)
numbers.forEach(number => {
if (someCase) {
a = <View />
}
})
test.shift(<View />)
components.find(component => {
return component === <View />
})
components.some(component => component.constructor.__proto__ === <View />.constructor)
以下代码不会被警告,也应当在 Taro 任意端中能够运行:
numbers.filter(Boolean).map((number) => {
const element = <View />
return <View />
})
解决方案
先处理好需要遍历的数组,然后再用处理好的数组调用 map
方法。
numbers.filter(isOdd).map((number) => <View />)
for (let index = 0; index < array.length; index++) {
// do you thing with array
}
const element = array.map(item => {
return <View />
})
不能在 JSX 参数中使用匿名函数
以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:
<View onClick={() => this.handleClick()} />
<View onClick={(e) => this.handleClick(e)} />
<View onClick={() => ({})} />
<View onClick={function () {}} />
<View onClick={function (e) {this.handleClick(e)}} />
以下代码不会被警告,也应当在 Taro 任意端中能够运行:
<View onClick={this.handleClick} />
<View onClick={this.props.handleClick} />
<View onClick={this.handleClick.bind(this)} />
<View onClick={this.props.handleClick.bind(this)} />
解决方案
<View onClick={this.props.handleClick.bind(this)} />
不允许在 JSX 参数(props)中传入 JSX 元素
以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:
<Custom child={<View />} />
<Custom child={() => <View />} />
<Custom child={function () { <View /> }} />
<Custom child={ary.map(a => <View />)} />
解决方案
通过 props 传值在 JSX 模板中预先判定显示内容
不能在 JSX 参数中使用对象展开符
以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:
<View {...this.props} />
<View {...props} />
<Custom {...props} />
以下代码不会被警告,也应当在 Taro 任意端中能够运行:
const { id, ...rest } = obj
const [ head, ...tail] = array
const obj = { id, ...rest }
解决方案
除非微信小程序开放更多能力,目前看不到能支持该特性的可能性
不支持无状态组件
以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:
function Test () {
return <View />
}
function Test (ary) {
return ary.map(() => <View />)
}
const Test = () => {
return <View />
}
const Test = function () {
return <View />
}
以下代码不会被警告,也应当在 Taro 任意端中能够运行:
class App extends Component {
render () {
return (
<View />
)
}
}
解决方案
使用 class
定义组件