如何在 React Native 中使用 switch 进行条件渲染?

Posted

技术标签:

【中文标题】如何在 React Native 中使用 switch 进行条件渲染?【英文标题】:How to do conditional rendering using switch in react native? 【发布时间】:2019-08-18 19:52:32 【问题描述】:

您好,我正在尝试在我的项目中执行 switch 语句。我有一个对象图像如下

export const images = [
  
    image: BASE.URL + 'Images/Plumber.png',

  ,
  
    image: BASE.URL + 'Images/electrician.png',


  ,
 
    image: BASE.URL + 'Images/ac.png',

  
]

我正在从服务器获取工作人员列表并将其呈现在 Card 中。因此服务器响应仅包含工作人员的名称。我正在尝试将图像与他们一起提供。所以我写了一个switch 语句,但图像没有与文本一起出现。以下是我的代码。

    import  images  from './data';
    renderImage() 
        const  workType  = this.state;
        switch (workType) 
          case 'Plumber':
            return (
              <Image style= height: 100, width: 100  source= uri: images[0].image  />
            );
          case 'Electrician':
            return (
              <Image style= height: 100, width: 100  source= uri: images[1].image  />
            );
     case 'AC'
            return (
              <Image style= height: 100, width: 100  source= uri: images[2].image  />
            );
        
      
   render()
    const  workers,workType  = this.state;
    return(
    workers.map((a, index) => (
                    <TouchableOpacity onPress=() => this.popUpDialog(a.id, a.work_type)>
                      <Card>
                        this.renderImage()
                        <Text>a.work_type</Text>
                      </Card>
                    </TouchableOpacity>
              ))
    )
    

我做错了什么,请帮助我找到解决方案。谢谢!

【问题讨论】:

将来你可以使用npmjs.com/package/react-floco 来以声明方式呈现 switch 语句 【参考方案1】:

尝试使用console.log 你的this.state.workType,因为它可能不是你认为应该的值。由于您没有 default 案例,因此该函数不返回任何内容。

此外,如果您将workType 作为renderImage 函数的参数,可能会更容易。我怀疑您的this.state.workTypeworkers.map 函数中的a.work_type 不同。你可以这样做

const renderImage = (workType) => 
  switch (workType) 
  ...
  


//and then
   workers.map((a, index) => (
                    <TouchableOpacity onPress=() => this.popUpDialog(a.id, a.work_type)>
                      <Card>
                        this.renderImage(a.work_type)
                        <Text>a.work_type</Text>
                      </Card>
                    </TouchableOpacity>
   ))

【讨论】:

【参考方案2】:

我想你忘了返回映射的组件。

例如:

render() 
    const  workers,workType  = this.state;
    return(
        workers.map((a, index) => 
            return(
                <TouchableOpacity onPress=() => this.popUpDialog(a.id, a.work_type)>
                    <Card>
                        this.renderImage()
                        <Text>a.work_type</Text>
                    </Card>
                </TouchableOpacity>
            )
        )
    )

【讨论】:

【参考方案3】:

我的建议是使用地图并以下列方式渲染图像。

const WORKTYPE_TO_IMAGE = 
  Plumber: BASE.URL + 'Images/Plumber.png',
  Electrician: BASE.URL + 'Images/electrician.png',
  AC: BASE.URL + 'Images/ac.png',
;

renderImage()
  return (
    <Image style= height: 100, width: 100  source=WORKTYPE_TO_IMAGE[this.state.workType] />
  )

您曾三次使用图像标签,但现在您只会使用一次(因此遵循不重复原则)。此外,我真的很讨厌我的代码中的 if/switch,因为这些需求经常发生,而不是更改代码中的逻辑,您应该只在一个地方进行更改(在您的情况下这是一个常量)。代码将非常干净和简短:)

【讨论】:

那我需要为WORKTYPE_TO_IMAGE 写一个map方法吗? 不,它只是您所有工作类型图像 url 的包装对象【参考方案4】:

我只是给主视图赋予样式,然后一切正常。

  renderImage(workType) 
    switch (workType) 
      case 0:
        return (
          <Image style= height: 100, width: 100, backgroundColor: 'green'  />
        );
      case 1:
        return (
          <Image style= height: 100, width: 100, backgroundColor: 'yellow'  />
        );
      case 2:
        return (
          <Image style= height: 100, width: 100, backgroundColor: 'blue'  />
        );
    
  

  //source= uri: require('./1.jpg') 
  render() 
    let workers = [ work_type: 'Plumber' ,  work_type: 'Electrician' ,  work_type: 'AC' ];
    return (
      <View style= width: '100%', height: '100%', backgroundColor: 'red' >
        
          workers.map((a, index) => (
            <TouchableOpacity onPress=() => this.popUpDialog(a.id, a.work_type)>
              <View>
                this.renderImage(index)
                <Text>a.work_type</Text>
              </View>
            </TouchableOpacity>
          ))
        
      </View>
    )
  

我已经设置了颜色,因为我没有图像。

【讨论】:

以上是关于如何在 React Native 中使用 switch 进行条件渲染?的主要内容,如果未能解决你的问题,请参考以下文章

如何在React Native中使用CreateBottomTabNavigator?

如何在 React Native 中的循环中查找

如何在 react-native 中使用 FormData?

如何使用 React-Native 在 iOS 中禁用屏幕截图

React Native:如何使用 expo 在 webview 中制作全屏 youtube 嵌入视频(没有 react-native 链接)

如何在组件 React / React-native 的单独页面中使用动态 graphql(字符串)