Реагируйте на проблему с индивидуальным условным рендерингом стилизованной карты - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть два компонента:

  • homeScreen.js (родитель)

  • Card.js (ребенок)

Я отображаю компонент карты, когда поиск не переключается, и я посылаю через реквизит все данные, которые должна принять карта, без проблем с отображением.

Я попытался добавить строку поиска, мои данные - это массив объектов, поэтому я создал новый if для рендеринга, когда поиск переключается внутри, что, если я передаю ту же карту, я передаю if of search, не переключаемый со всемиданные, которые мне нужны как реквизиты, пока я просто вижу рейтинг, я понятия не имею, почему это происходит, я попытался добавить что-то статическое, ничего не должно в эмуляторе, я консоль зарегистрировал, что реквизиты, которые я посылаю из homeScreen.js в Card.js, и они посмотрелихорошо, они такие же, как и должны быть, поэтому я думаю, что это проблема стиля или что-то, потому что я не вижу ничего, только рейтинг, когда поиск переключается

homeScreen.js

import axios from 'axios';
import React from 'react';
import {
  ActivityIndicator,
  ScrollView,
  Text,
  View,
  TouchableOpacity,
  TextInput,
} from 'react-native';
import Card from '../Components/Card/card';
export default class HomeScreen extends React.Component {
  state = {
    shows: [],
    isLoading: true,
    search: false,
    title: 0,
    titleSaved: false,
  };

  componentDidMount() {
    this.getData();
  }
  toggleSearch = () => {
    this.setState({
      search: true,
    });
  };
  setSearchedTitle = searchedTitle => {
    this.state.shows.filter((currentValue, index) => {
      if (searchedTitle === this.state.shows[index].data.name) {
        this.setState({title: index, titleSaved: true});
      }
    });
  };

  getData = () => {
    const requestUrls = Array.from({length: 9}).map(
      (_, idx) => `http://api.tvmaze.com/shows/${idx + 1}`,
    );

    const handleResponse = data => {
      this.setState({
        isLoading: false,
        shows: data,
      });
    };
    const handleError = error => {
      console.log(error);
      this.setState({
        isLoading: false,
      });
    };

    Promise.all(requestUrls.map(url => axios.get(url)))
      .then(handleResponse)
      .catch(handleError);
  };

  render() {
    const {isLoading, shows, search, title} = this.state;
    if (isLoading) {
      return <ActivityIndicator size="large" color="#0000ff" />;
    } else if (!search) {
      return (
        <View>
          <View>
            <TouchableOpacity
              onPress={this.toggleSearch}
              style={{height: 50, width: 300}}>
              <Text style={{textAlign: 'center', fontSize: 40}}>
                Press to Search
              </Text>
            </TouchableOpacity>
          </View>
          <ScrollView style={{backgroundColor: '#E1E8E7'}}>
            {shows.length &&
              shows.map((show, index) => {
                return (
                  <Card
                    key={show.data.id}
                    title={show.data.name}
                    rating={show.data.rating.average}
                    source={show.data.image.medium}
                    genres={show.data.genres}
                    language={show.data.language}
                    network={show.data.network}
                    schedule={show.data.schedule}
                    summary={show.data.summary}
                    navigation={this.props.navigation}
                  />
                );
              })}
          </ScrollView>
        </View>
      );
    } else if (search && !isLoading) {
      return (
        <View>
          <View style={{flex: 2}}>
            <TextInput
              style={{
                height: 100,
                width: 100,
                borderColor: 'gray',
                borderWidth: 1,
              }}
              onChangeText={searchedTitle => {
                this.setSearchedTitle(searchedTitle);
              }}
            />

            <Text>Hello</Text>
          </View>
          {console.log(
            this.state.shows[this.state.title].data.schedule,
            'hello ttotot',
          )}
          {console.log(
            'hello world',
            this.state.shows[this.state.title].data.image.medium,
          )}
          <View style={{flex: 20}}>
            {this.state.titleSaved ? (
              <Card
                style={{height: 300, width: 300}}
                title={shows[title].data.name}
                source={shows[title].data.image.medium}
                genres={shows[title].data.genres}
                language={shows[title].data.language}
                network={shows[title].data.network}
                schedule={shows[title].data.schedule}
                summary={shows[title].data.summary}
              />
            ) : (
              <View>
                <Text>sadasd</Text>
              </View>
            )}
          </View>
        </View>
      );
    }
  }
}

Card.js

import React from 'react';
import {Image, View, Text, StyleSheet, TouchableOpacity} from 'react-native';
import {
  widthPercentageToDP as wp,
  heightPercentageToDP as hp,
} from 'react-native-responsive-screen';
import Icon from 'react-native-vector-icons/FontAwesome';

const Card = props => {
  return (
    <View style={styles.container}>
      <Image style={styles.Image} source={{uri: `${props.source}`}} />
      <Text style={styles.title}>{props.title}</Text>
      <View style={styles.ratingContainer}>
        <Text style={styles.rating}>Rating: {props.rating}</Text>
        <Icon name="star" size={30} color="grey" />
      </View>
      <TouchableOpacity
        style={styles.button}
        onPress={() => {
          props.navigation.navigate('Details', {
            title: props.title,
            rating: props.rating,
            source: props.source,
            genres: props.genres,
            language: props.language,
            network: props.network,
            schedule: props.schedule,
            summary: props.summary,
          });
        }}>
        <Text style={styles.buttonText}>Press for details </Text>
      </TouchableOpacity>
    </View>
  );
};

export default Card;

const styles = StyleSheet.create({
  container: {
    alignItems: 'center',
  },
  Image: {
    flex: -1,
    width: wp('90%'),
    height: hp('65%'),
  },
  title: {
    flex: 1,
    fontSize: 40,
    borderRadius: 10,
    color: '#3C948B',
    margin: 15,
    justifyContent: 'center',
    alignItems: 'center',
  },
  ratingContainer: {
    flexDirection: 'row',
    alignItems: 'center',
    backgroundColor: 'white',
    elevation: 6,
    justifyContent: 'space-between',
    borderWidth: 1,
    width: 300,
  },
  rating: {
    fontSize: 25,
    paddingLeft: 15,
  },
  button: {
    flex: 1,
    color: '#3C948B',
    backgroundColor: '#3C948B',
    height: hp('7%'),
    width: wp('70%'),
    margin: 20,
    alignItems: 'center',
    borderBottomLeftRadius: 10,
    borderTopRightRadius: 10,
  },
  buttonText: {
    flex: 1,
    fontSize: 25,
  },
});

1 Ответ

0 голосов
/ 21 сентября 2019

Не уверен насчет этого, но проблема может заключаться в том, что контейнер карты обладает свойством flex:20, поэтому оно занимает слишком много места (не уверен, работает ли он таким образом, но вы никогда не узнаете).Попробуйте изменить это значение на 1

...