React Hooks setTimeout и clearTimeout

Я прочитал документ «Использование хука эффектов», но мне все еще трудно избавиться от побочных эффектов от хука useEffect. В частности, у меня есть этот компонент класса, и я хотел бы узнать, как его можно преобразовать в функциональный компонент с помощью хука useEffect.

class Alert extends PureComponent {
  componentDidMount() {
    this.handleSetTimeout()
  }

  componentDidUpdate() {
    this.handleClearTimeout()
    this.handleSetTimeout()
  }

  componentWillUnmount() {
    this.handleClearTimeout()
  }

  handleSetTimeout = () => {
    const { alert: { id, ttl }, handlePopAlert } = this.props
    if (!ttl) return
    this.timeout = setTimeout(() => handlePopAlert(id), ttl)
  }

  handleClearTimeout = () => {
    if (!this.timeout) return
    clearTimeout(this.timeout)
    this.timeout = null
  }

  render() { return (...) }
}

Дэн Абрамов недавно опубликовал статью в блоге именно об этом: overreacted.io/making-setinterval-declarative-with-react-hoo‌​ks

skyboyer 07.02.2019 16:51

Спасибо! Я проверю это.

cocacrave 07.02.2019 16:54

Кстати, вы знаете, что вам не нужно очищать this.timeout, поскольку clearTimeout позволяет вам передать идентификатор уже остановленного таймера.

skyboyer 07.02.2019 16:54

Оооо попался :)

cocacrave 07.02.2019 17:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
6
4
11 485
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Функция, переданная useEffect, может возвращать функцию очистки. Функция очистки запускается перед удалением компонента из пользовательского интерфейса, чтобы предотвратить утечку памяти. Кроме того, если компонент визуализируется несколько раз (что обычно и происходит), предыдущий эффект очищается перед выполнением следующего эффекта.

В вашем случае, поскольку функцию handlePopAlert необходимо вызывать на основе идентификатора, переданного из реквизита, эффект должен запускаться всякий раз, когда изменяется id, ttl, для которого вы передаете второй аргумент useEffect как идентификатор и ttl

const Alert = (props) => {
  const { alert: { id, ttl }, handlePopAlert } = this.props
  useEffect(() => {
    const timeout = setTimeout(() => {
       handlePopAlert(id)
    }, ttl)
    return () => {
       clearTimeout(timeout);
    }
  }, [id, ttl]);

  return (...)
}

Спасибо. Документы великолепны, но мне нужно было увидеть больше примеров.

cocacrave 09.02.2019 00:58

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