Есть ли способ обеспечить выполнение функции сверху вниз? - PullRequest
0 голосов
/ 12 июня 2019

Я создаю приложение для распознавания изображений и хочу использовать кнопки для изменения состояния. Я успешно изменил некоторые поля, но столкнулся со странной проблемой. У меня он настроен так, что поле выбирается с помощью колесика выбора, а его значение состояния устанавливается на текст самой последней нажатой кнопки. Однако только два из пяти полей обновляются, как и ожидалось, несмотря на то, что все пять кодовых блоков практически идентичны.

До сих пор я пытался переместить setState, переместить вызовы внутри каждого setState, сделать асинхронную функцию onPressHide и много журналов консоли.

this.state = {
      selectedItem : 4,
      itemList : ['Serial #', 'Manufacturer', 'Model', 'Model #', 'Manufacture Date'],
      uri : null,
      show : false,
      current : null,
      currentText: "",
      serial: "",
      manufac: "",
      model: "",
      modelNum: "",
      manuDate: "",
      assetId: "",
    };

onPickerSelect (index) {
    this.setState({
        selectedItem: index,
    })
  }

onPressHide() {
    if (this.state.selectedItem == 0) {
      this.setState((state) => ({
        serial: state.currentText,
        show: false,
      }));
      Alert.alert(
        'Update',
        "Serial number will be updated to: " + this.state.currentText,
        [
          {text: 'OK', onPress: () => console.log('OK Pressed')},
        ],
        {cancelable: false},
      );
    }
    if (this.state.selectedItem == 1) {
      this.setState((state) => ({
        manufac: state.currentText,
        show: false,
      }));
      Alert.alert(
        'Update',
        "Manufacturer will be updated to: " + this.state.currentText,
        [
          {text: 'OK', onPress: () => console.log('OK Pressed',)},
        ],
        {cancelable: false},
      );
    }

onPressSubmit() {
    var finalArr = {serial: this.state.serial, manufac: this.state.manufac, model: this.state.model, modelNum: this.state.modelNum, manuDate: this.state.manuDate};
    this.props.updateAll(finalArr);
  }
Data: {Serial: "", Manufacturer: "", Model: "Sonicare", ModelNumber: "", ManufactureDate: ""}

Последняя строка из журнала консоли сервера при попытке установить Philips в качестве производителя и Sonicare в качестве модели. Верхний оператор if в приведенном выше коде onPressHide является функциональным, а нижний - нет. Я предполагаю, что это как-то связано с асинхронной природой setState, но я не совсем понимаю, почему он будет обновлять некоторые поля, а не другие. Я не получаю никаких сообщений об ошибках, просто неверный вывод. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 12 июня 2019

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

Возможно, ваша проблема может заключаться в том, что setState выполняется асинхронно в ответ. Также есть система дозирования.

Мне раньше требовался синхронный setState для логического управления. Я использовал синхронный обратный вызов, чтобы сделать эти вещи ...

this.setState({ key: value }, function() {
    // Do Something Here After State is Updated
    yourFunction();
});

Узнайте больше о синхронном обратном вызове setState: Когда использовать React setState callback

Удачи!

...