Как сделать условный рендеринг, используя переключатель в реагировать родной - PullRequest
1 голос
/ 28 марта 2019

Здравствуйте, я пытаюсь выполнить оператор 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>
              ))}
    )
    }

Что не так, я делаю, пожалуйста, помогите мне найти решение. Спасибо!

Ответы [ 4 ]

1 голос
/ 28 марта 2019

Попробуйте console.log ваш this.state.workType, потому что это может быть не то значение, которое, как вы думаете, должно быть. Поскольку у вас нет default регистра, функция ничего не возвращает.

Также было бы проще, если бы вы взяли workType в качестве параметра для вашей функции renderImage. Я подозреваю, что ваш this.state.workType не будет таким же, как ваш a.work_type в функции workers.map. Вы можете сделать это так

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>
   ))
1 голос
/ 28 марта 2019

Я думаю, вы забыли вернуть сопоставленный компонент.

Например:

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>
            )
        })}
    )
}
0 голосов
/ 28 марта 2019

Я просто задаю стиль главному виду, и тогда все работает нормально.

  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>
    )
  }

Я установил цвет, так как у меня нет изображения.

0 голосов
/ 28 марта 2019

Мой совет - пойти на карту и визуализировать изображение следующим образом.

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 в моем коде, потому что требования часто, вместо того, чтобы менять логику в вашем коде, вы должны изменить только в одном месте (что является константой в вашем случае).Код будет действительно чистым и коротким:)

...