TouchableOpacity中的三元操作

时间:2019-03-31 08:38:34

标签: react-native

我尝试像这样使用它,但是它给我一个“不嵌套三元表达式”的错误。我该如何解决?

<TouchableOpacity>
   {
     this.state.RefreshImage ? <Image source={require('../Images/add2.png')} style={{ height: 40, width: 40 }} /> :
    !this.state.RefreshImage && this.state.ButtonNumber === '1' ? <Image source={{ uri: imageUri }} style={{ height: 40, width: 40 }} />               
  }                      
</TouchableOpacity> 

2 个答案:

答案 0 :(得分:1)

该错误(可能是ESLint或某些其他linting工具提供的错误)意味着嵌套的三元运算符使代码变得难以理解。最好将JSX外部的逻辑分开,并使用“正常”条件语句,以使意图更清晰并且更易于阅读。例如:

let image = null;

if(this.state.RefreshImage) {
  image = <Image source={require('../Images/add2.png')} style={{ height: 40, width: 40 }} />;
}
else if(this.state.ButtonNumber === '1') {
  image = <Image source={{ uri: imageUri }} style={{ height: 40, width: 40 }} />;
}

// ...

<TouchableOpacity>
    {image}
</TouchableOpacity>

(请注意,在第二种情况下!this.state.RefreshImage && ..是不必要的,因为先前的条件已经保证该条件为true。)

答案 1 :(得分:0)

您需要使某些东西返回第二三元条件的错误条件:

 return(
      <TouchableOpacity>
      {
        RefreshImage ? <Image source={require('../Images/add2.png')} style={{ height: 40, width: 40 }} /> :
       !RefreshImage && ButtonNumber === '1' ? <Image source={{ uri: imageUri }} style={{ height: 40, width: 40 }} /> : null
     }                      
   </TouchableOpacity> 

我在本地测试过的代码:

renderUpdate(){
    let RefreshImage = false
    let ButtonNumber = '0'


    return(
      <TouchableOpacity>
      {
        RefreshImage ? <Image source={IC_LOGO} style={{ height: 40, width: 40, backgroundColor:'blue' }} /> :
       !RefreshImage && ButtonNumber === '1' ? <Image source={IC_CHECKBOX} style={{ height: 40, width: 40, backgroundColor:'green' }} /> : <View style={{width:40, height: 50 , backgroundColor:'red'}}/>
     }                      
   </TouchableOpacity> 
    )
  }

  render() {

    return(
      <View style={{
        flex: 1,
        backgroundColor: APP_COLOR,
      }}>
             {this.renderUpdate()}

        </View>
    );
}

没有附带条件的规则:

  renderUpdate(){
    let RefreshImage = false
    let ButtonNumber = '0'
    let imageLocal = null
    if(RefreshImage){
      imageLocal = <Image source={IC_LOGO} style={{ height: 40, width: 40, backgroundColor:'blue' }} />
    }else if(!RefreshImage && ButtonNumber === '1'){
      imageLocal = <Image source={IC_CHECKBOX} style={{ height: 40, width: 40, backgroundColor:'green' }} />
    }else{
      imageLocal = <Image source={IC_BACKGROUND_IMAGE} style={{ height: 40, width: 40, backgroundColor:'green' }} />
    }

    return(
      <TouchableOpacity>
     {imageLocal}
    </TouchableOpacity> 

    )

  }