Условный рендеринг реагирует на родной: работает только другая часть

Я сделал оператор условного рендеринга в реакции. Условие, которое я проверяю, основано на ответе сервера. Если условие выполнено, я должен отобразить некоторые компоненты пользовательского интерфейса, иначе другой пользовательский интерфейс. Итак, проблема в том, что я когда-либо получаю от сервера, работает только другая часть. Я также дважды проверил response.

обновлен код

export default class ViewStatus extends Component {
  constructor(props) {
        super(props);
        this.initialState = {
        progressData: [],
        };
        this.state = this.initialState;
    }
    componentWillMount(){
       fetch('http://192.168.1.2:3000/api/progress',{
         method:'POST',
         headers:{
           'Accept': 'application/json',
           'Content-Type':'application/json'
         },
         body:JSON.stringify({
           work_type:this.props.work_type
         })
       })
      .then(response => response.json())
      .then((responseData) => {
         this.setState({
      progressData:responseData[0]
      });
    });
  }
render() {
const isResponseData = this.state.progressData == '1' ? this.renderDone() : this.renderInProgress()
 console.log(this.state.progressData);
  return(
     <View>
        {isResponseData}
      </View>
    );
  }
  renderInProgress(){
    return(
        <View>
          <Text>In Progress</Text>
          <Text>Worker will approach you within 24 hrs.</Text>
       </View>
     );
  }
  renderDone(){
    return(
       <View>
        <Text>Successfull</Text>
        <Text>Are you satisfied with the work .If yes please mark done.</Text>
       </View>
     );
  }

person Linu Sherin    schedule 17.10.2018    source источник
comment
Можете ли вы проверить, что вы получаете от сервера? Иметь там точку останова или console.log   -  person Ajay Gaur    schedule 17.10.2018
comment
вы обновляете состояние, когда получаете ответ?   -  person Guruparan Giritharan    schedule 17.10.2018
comment
сначала проверьте тип значения this.state.progressData в консоли, если его целое число, используйте === 1 или если его строка использует === '1'. или если значения будут только 0 или 1, тогда нет необходимости использовать оператор сравнения, вы можете применить его напрямую. (это.состояние.прогрессДанные)? «истинный случай»: «ложный случай»;   -  person Vivek Chaudhari    schedule 17.10.2018
comment
Да, я утешил progressData в рендере. Сначала я получаю пустой массив, но затем получаю ответ. Почему так, пожалуйста, проверьте это i.stack.imgur.com/p7Xgi.png . Также обновил мой код выше   -  person Linu Sherin    schedule 17.10.2018
comment
Также у меня есть еще одно условие, чтобы написать, как мне написать здесь с условным рендерингом?   -  person Linu Sherin    schedule 17.10.2018
comment
попробуйте использовать componentDidMount вместо componentwillmount   -  person Guruparan Giritharan    schedule 17.10.2018
comment
Связанный вопрос stackoverflow.com/questions/40199151/   -  person Guruparan Giritharan    schedule 17.10.2018
comment
Но я пробовал с componentDidMount, хотя получаю то же самое. Первоначально массив будет пустым, но затем я получу значение. Есть ли проблема с установкой состояния в виде массива при запуске моего кода?   -  person Linu Sherin    schedule 17.10.2018
comment
Если progressData - это массив, ваше условие должно быть this.state.progressData.length > 0   -  person Ravi    schedule 17.10.2018
comment
ProgressData имеет статус участника, разве вы не должны проверить progressData.status?   -  person Alex G    schedule 17.10.2018
comment
@AlexG Вот почему я устанавливаю progressData:responseData[0] в обещании получения.   -  person Linu Sherin    schedule 17.10.2018
comment
@RaviRupareliya Хорошо, я проверю это, но что делать, если у меня есть еще одно условие, которое означает status=3?   -  person Linu Sherin    schedule 17.10.2018
comment
@anu вы можете использовать && для и условия this.state.progressData.length>0 && status==3   -  person Ravi    schedule 17.10.2018
comment
Нет, я имел в виду условие else if . if (status === '1){ render some ui } else if(status === '2'){ render som ui} else { render some ui}. Я пытаюсь сделать что-то вроде этого. Но здесь, когда я проверил только условие if else, другая часть работает. Я думаю, что это может быть проблемой с установкой progressData в качестве состояния. Потому что, как я сказал ранее Сначала я получаю пустой массив, затем получает только значение. В чем может быть проблема?   -  person Linu Sherin    schedule 17.10.2018


Ответы (1)


  1. Вам нужно вызвать responseData[0].status, чтобы получить значение из API.
  2. Вызовы API должны происходить только в componentDidMount
  3. componentWillMount устарел, поэтому забудьте об этом методе
  4. Просто используйте тернарный оператор для рендеринга контента вместо нескольких функций.

Попробуйте с кодом ниже.

export default class ViewStatus extends Component {
  constructor(props) {
        super(props);
        this.state = {progressData: ""};
    }
    componentDidMount(){
       fetch('http://192.168.1.2:3000/api/progress',{
         method:'POST',
         headers:{
           'Accept': 'application/json',
           'Content-Type':'application/json'
         },
         body:JSON.stringify({
           work_type:this.props.work_type
         })
       })
      .then(response => response.json())
      .then(responseData => {
         this.setState({
      progressData:responseData[0].status
      });
    });
  }
render() {
const { progressData }= this.state;
  return(
     <View>
        {progressData == "1" &&
         (<View><Text>Successfull</Text>
        <Text>Are you satisfied with the work .If yes please mark done.</Text></View>)}
    {progressData == "2" &&
         (<View><Text>Successfull</Text>
        <Text>Are you satisfied with the work .If yes please mark done.</Text></View>)}
         {progressData == "" &&(<View><Text>In Progress</Text>
          <Text>Worker will approach you within 24 hrs.</Text></View>)}
      </View>
    );
  }

}
person Hemadri Dasari    schedule 17.10.2018
comment
Да, пробовал этот код, но ничего не отображается. У меня есть сомнения, есть ли проблема с установкой состояния в виде массива в моем коде? Я объясню вам ясно, я буду направлять на этот экран при нажатии на кнопку на предыдущей странице. Итак, как мне управлять выборкой здесь, на этой странице? Должен ли я использовать для этого ComponentDidMount? Потому что, когда я получаю консольный ответ от сервера, первоначальный ответ будет пустым массивом. Только тогда я получу ответ. Итак, как мне с этим справиться здесь? Потому что я думаю, что при проверке условия он возьмет этот пустой массив. Пожалуйста, помогите мне.. - person Linu Sherin; 17.10.2018
comment
@anu, что вы получаете в ответе API? массив или объект с ключом состояния? сделайте журнал консоли и поделитесь ответом API - person Hemadri Dasari; 17.10.2018
comment
@anu выглядит так, как будто вы получаете объект - person Hemadri Dasari; 17.10.2018
comment
Это ответ, который я получаю, когда утешаюсь перед i.stack.imgur.com/alffv. png - person Linu Sherin; 17.10.2018
comment
Но в этом коде есть синтаксическая ошибка adjacent jsx elements must be wrapped - person Linu Sherin; 17.10.2018
comment
@anu Извините, плохо, я пропустил это. Обновлен мой ответ - person Hemadri Dasari; 17.10.2018
comment
Вау.. отлично.. Это сработало, большое спасибо... Как мне проверить еще одно условие здесь? Это означает, что сейчас я проверяю, status == 1 или еще. Как проверить еще, если условие? Потому что я пытаюсь отобразить некоторый пользовательский интерфейс. В случае Pending, Inprogress и, наконец, done - person Linu Sherin; 17.10.2018
comment
@anu Добро пожаловать. Я обновил свой ответ, пожалуйста, посмотрите - person Hemadri Dasari; 17.10.2018
comment
Я пытаюсь отобразить другой пользовательский интерфейс для каждого ответа status. Будет ли это работать? Вот так if(status == '1') {renderPending()} else if(status=2){render some ui} else {rendr some ui}. Не могли бы вы помочь? - person Linu Sherin; 17.10.2018
comment
Да, но есть синтаксическая ошибка, пожалуйста, проверьте это i.stack.imgur.com/s5L87.png< /а> - person Linu Sherin; 17.10.2018
comment
На скриншоте родитель ‹View› отсутствует после возврата(‹View› - person Hemadri Dasari; 17.10.2018
comment
Ой .. извините, это была моя опечатка .. Большое спасибо. :) - person Linu Sherin; 17.10.2018
comment
@ThinkTwice Извините, у меня есть сомнения. Если ответ, который я получаю, содержит еще одни данные, кроме status, скажем, user_id, поэтому мне нужно сопоставить его, верно? И будет ли это так в рендеринге? (a.status == "2" ) && (a.user_id == this.state.responseData) &&( render some ui).Поскольку в будущем расширении моего проекта есть возможность взять user_id также, поэтому, пожалуйста, не думайте, что я продолжаю задавать сомнения снова и снова.Пожалуйста, помогите - person Linu Sherin; 18.10.2018
comment
Это один объект с ключами статуса и user_id или два разных объекта? - person Hemadri Dasari; 18.10.2018
comment
Я имею в виду один объект со статусом ключей и user_id. Потому что теперь, после условного рендеринга, я показываю некоторый текст, а также не хочу отображать uer_id. - person Linu Sherin; 19.10.2018