Как удалить прослушиватель событий, чтобы он не пытался обновлять состояние при отключении компонента?

Я установил несколько динамических стилей, и все работает нормально, кроме случаев, когда компонент отключен. Затем возникает ошибка: невозможно вызвать setState (или forceUpdate) на отключенном компоненте.

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

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

Кроме того, я пробовал использовать этот подход this.props.navigation.isFocused (), и снова он работает нормально, но затем, если я нахожусь на третьем экране и вращаю устройство и возвращаюсь назад, прослушиватель событий Dimensions не видит изменений и стиля бардак.

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

Заранее спасибо.

constructor(props) {
    super(props);
    Dimensions.addEventListener("change", dims => {
      // this.props.navigation.isFocused() ?
      this.setState({
        resStyles: {
          imageFlex: Dimensions.get("window").height > 500 ? "column" : "row",
          imageHeight: Dimensions.get("window").height > 500 ? "50%" : "100%",
          infoHeight: Dimensions.get("window").height > 500 ? "50%" : "100%",
          infoWidth: Dimensions.get("window").height > 500 ? "100%" : "50%"
        }
      });
      // : null;
    });
  }

componentWillUnmount

componentWillUnmount() {
    console.info("Unmounted");

    Dimensions.removeEventListener("change", dims => {
      // this.props.navigation.isFocused() ?
      this.setState({
        resStyles: {
          imageFlex: Dimensions.get("window").height > 500 ? "column" : "row",
          imageHeight: Dimensions.get("window").height > 500 ? "50%" : "100%",
          infoHeight: Dimensions.get("window").height > 500 ? "50%" : "100%",
          infoWidth: Dimensions.get("window").height > 500 ? "100%" : "50%"
        }
      });
      // : null;
    });
  }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
7 912
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы должны создать именованную функцию (если быть точным, Methode), подобную этой

fun_name(){
      // this.props.navigation.isFocused() ?
  this.setState({
    resStyles: {
      imageFlex: Dimensions.get("window").height > 500 ? "column" : "row",
      imageHeight: Dimensions.get("window").height > 500 ? "50%" : "100%",
      infoHeight: Dimensions.get("window").height > 500 ? "50%" : "100%",
      infoWidth: Dimensions.get("window").height > 500 ? "100%" : "50%"
    }
  });
  // : null;
}

constructor(props) {
    super(props);
    Dimensions.addEventListener("change", this.fun_name);
  }

componentWillUnmount() {
    console.info("Unmounted");

    Dimensions.removeEventListener("change", this.fun_name);
  }

PS: не забудьте привязать функцию

Браво! Это то, что мне нужно! Это действительно решает мою проблему! Спасибо evgeni fotia !!! Но я до сих пор не до конца понимаю ... Ваш код почти такой же, как мой ... Почему тогда мой код не работает, а ваш - нет? Tnx снова.

FatBoyGebajzla 10.10.2018 18:04

@FatBoyGebajzla проверьте здесь w3schools.com/jsref/met_element_removeeventlistener.asp прочтите примечание в разделе «Определение и использование», и вы поймете

evgeni fotia 10.10.2018 18:09

Спасибо, я этого не знал.

FatBoyGebajzla 10.10.2018 18:11

Определите функцию отдельно, чтобы добавить / удалить слушателя для этой конкретной функции. также добавить слушателей после того, как компонент был смонтирован, чтобы избежать установки состояния на размонтированном компоненте

componentDidMount () {
    Dimensions.addEventListener('change', updateDimensions)
}
componentWillUnmount() {
    Dimensions.removeEventListener('change', updateDimensions)
}
updateDimensions() {
  this.props.navigation.isFocused() ?
  this.setState({
    resStyles: {
      imageFlex: Dimensions.get('window').height > 500 ? 'column' : 'row',
      imageHeight: Dimensions.get('window').height > 500 ? '50%' : '100%',
      infoHeight: Dimensions.get('window').height > 500 ? '50%" : '100%',
      infoWidth: Dimensions.get('window').height > 500 ? '100%' : '50%'
    }
  });
  : null;
}

Другие вопросы по теме