Taro 自身限制规范

不能在包含 JSX 元素的 map 循环中使用 if 表达式

以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:

  1. numbers.map((number) => {
  2. let element = null
  3. const isOdd = number % 2
  4. if (isOdd) {
  5. element = <Custom />
  6. }
  7. return element
  8. })

以下代码不会被警告,也应当在 Taro 任意端中能够运行:

  1. numbers.map((number) => {
  2. let isOdd = false
  3. if (number % 2) {
  4. isOdd = true
  5. }
  6. return isOdd && <Custom />
  7. })

解决方案

尽量在 map 循环中使用条件表达式或逻辑表达式

  1. numbers.map((number) => {
  2. const isOdd = number % 2
  3. return isOdd ? <Custom /> : null
  4. })
  5. numbers.map((number) => {
  6. const isOdd = number % 2
  7. return isOdd && <Custom />
  8. })

不能使用 Array#map 之外的方法操作 JSX 数组

Taro 在小程序端实际上把 JSX 转换成了字符串模板,而一个原生 JSX 表达式实际上是一个 React/Nerv 元素(react-element)的构造器,因此在原生 JSX 中你可以随意地对一组 React 元素进行操作。但在 Taro 中你只能使用 map 方法,Taro 转换成小程序中 wx:for

以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:

  1. test.push(<View />)
  2. numbers.forEach(number => {
  3. if (someCase) {
  4. a = <View />
  5. }
  6. })
  7. test.shift(<View />)
  8. components.find(component => {
  9. return component === <View />
  10. })
  11. components.some(component => component.constructor.__proto__ === <View />.constructor)

以下代码不会被警告,也应当在 Taro 任意端中能够运行:

  1. numbers.filter(Boolean).map((number) => {
  2. const element = <View />
  3. return <View />
  4. })

解决方案

先处理好需要遍历的数组,然后再用处理好的数组调用 map 方法。

  1. numbers.filter(isOdd).map((number) => <View />)
  2. for (let index = 0; index < array.length; index++) {
  3. // do you thing with array
  4. }
  5. const element = array.map(item => {
  6. return <View />
  7. })

不能在 JSX 参数中使用匿名函数

以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:

  1. <View onClick={() => this.handleClick()} />
  2. <View onClick={(e) => this.handleClick(e)} />
  3. <View onClick={() => ({})} />
  4. <View onClick={function () {}} />
  5. <View onClick={function (e) {this.handleClick(e)}} />

以下代码不会被警告,也应当在 Taro 任意端中能够运行:

  1. <View onClick={this.handleClick} />
  2. <View onClick={this.props.handleClick} />
  3. <View onClick={this.handleClick.bind(this)} />
  4. <View onClick={this.props.handleClick.bind(this)} />

解决方案

使用 bind类参数绑定函数

  1. <View onClick={this.props.handleClick.bind(this)} />

不允许在 JSX 参数(props)中传入 JSX 元素

以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:

  1. <Custom child={<View />} />
  2. <Custom child={() => <View />} />
  3. <Custom child={function () { <View /> }} />
  4. <Custom child={ary.map(a => <View />)} />

解决方案

通过 props 传值在 JSX 模板中预先判定显示内容

不能在 JSX 参数中使用对象展开符

以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:

  1. <View {...this.props} />
  2. <View {...props} />
  3. <Custom {...props} />

以下代码不会被警告,也应当在 Taro 任意端中能够运行:

  1. const { id, ...rest } = obj
  2. const [ head, ...tail] = array
  3. const obj = { id, ...rest }

解决方案

除非微信小程序开放更多能力,目前看不到能支持该特性的可能性

不支持无状态组件

以下代码会被 ESLint 提示警告,同时在 Taro(小程序端)也不会有效:

  1. function Test () {
  2. return <View />
  3. }
  4. function Test (ary) {
  5. return ary.map(() => <View />)
  6. }
  7. const Test = () => {
  8. return <View />
  9. }
  10. const Test = function () {
  11. return <View />
  12. }

以下代码不会被警告,也应当在 Taro 任意端中能够运行:

  1. class App extends Component {
  2. render () {
  3. return (
  4. <View />
  5. )
  6. }
  7. }

解决方案

使用 class 定义组件