zoukankan      html  css  js  c++  java
  • 如何在taro的map循环中使用if条件渲染

    在taro的jsx中,鉴于编译的机制,官方明确的表示了不能在map循环中使用if循环,

    但是呢,官方也给出了解决办法,那就是提取变量或者是用三目运算嵌套的方法:

    链接奉上:https://github.com/NervJS/taro/blob/master/packages/eslint-plugin-taro/docs/if-statement-in-map-loop.md

    但是我再想,如果我有多个条件去判断呢,难道我只能去进行三目套三目吗?

    如下(使用的简单的ts):

    import Taro, {Component} from '@tarojs/taro'
    import {View, Text, Button} from '@tarojs/components'
    import connect from "../../containers/counter"
    import {ComponentClass} from "react";
    
    
    type PageOwnProps = {
    
    }
    type PageStateProps = {}
    type PageState = {
      listArr: string[]
    }
    type IProps = PageOwnProps & PageStateProps
    
    
    interface List {
      props: IProps,
      state: PageState
    }
    
    @connect
    class List extends Component {
    
      constructor() {
        super(...arguments);
        this.state = ({
          listArr: ["one", "two", "three"]
        })
      }
    
     
    
      public render() {
        return (
          <View className={'index'}>
            {
              this.state.listArr.map((item, index) => {
                return index === 0 ?
                  <View>index =0 item is {item}</View> :
                  index === 1 ?
                    <View>index = 1 item is {item}</View> :
                    null
              })
            }
          </View>)
      }
    }
    
    export default List as ComponentClass<PageOwnProps, PageState>
    

     确实可以达到效果,但是这样写起来层级嵌套的很深了,很不好看,在咨询了taro作者隔壁老李以后,把循环的内容抽出来做子组件,把index和item,当作参数传递给子组件,在子组件里面使用if即可:

    import Taro, {Component} from '@tarojs/taro'
    import {View, Text, Button} from '@tarojs/components'
    import connect from "../../containers/counter"
    import {ComponentClass} from "react";
    
    import ListItem from './listItem'
    
    type PageOwnProps = {
    
    }
    type PageStateProps = {}
    type PageState = {
      listArr: string[]
    }
    type IProps = PageOwnProps & PageStateProps
    
    
    interface List {
      props: IProps,
      state: PageState
    }
    
    @connect
    class List extends Component {
    
    
      constructor() {
        super(...arguments);
        this.state = ({
          listArr: ["one", "two", "three"]
        })
      }
    
    
    
    
      public render() {
        return (
          <View className={'index'}>
            {this.state.listArr.map((item, index) => {
              return <ListItem propIndex={index} propItem={item}>
              </ListItem>
            })}
          </View>)
      }
    }
    
    export default List as ComponentClass<PageOwnProps, PageState>
    

    子组件listItem.tsx:

    import {ComponentClass} from 'react'
    import {Component} from '@tarojs/taro'
    import {View} from '@tarojs/components'
    
    
    type PageStateProps = {
      counter: {}
    }
    
    type PageDispatchProps = {}
    
    type PageOwnProps = {
      propIndex: number,
      propItem: any
    }
    
    type PageState = {}
    
    type IProps = PageStateProps & PageDispatchProps & PageOwnProps
    
    
    interface ListItem {
      props: IProps;
      state: PageState
    }
    
    
    class ListItem extends Component implements ListItem {
      render() {
        let resultDom: any = null;
        if (this.props.propIndex === 2) {
          resultDom = <View>
            prop is 2 ,item is {this.props.propItem}
          </View>
        }else{
          resultDom = <View>
            prop is no 2 ,item is {this.props.propItem}
          </View>
        }
        return (
          <View>
            {resultDom}
          </View>
        )
      }
    }
    
    export default ListItem as ComponentClass<PageOwnProps, PageState>
    

     完美解决

  • 相关阅读:
    dedecms中如何去掉文章页面的广告
    织梦新建顶级栏目打不开,解决办法
    织梦dede模板中广告的去除方法?
    php 转码
    安卓插件
    计时器的实现
    json剥离
    安卓解析json
    安卓 读取网页源码
    java不用jni,也可以获得当前系统性能信息
  • 原文地址:https://www.cnblogs.com/mmykdbc/p/10097610.html
Copyright © 2011-2022 走看看