Оптимизировать массив компонентов, у которых есть прослушиватели оконных событий

У меня есть массив данных, который нужен для рендеринга массива одного и того же компонента, у которого есть прослушиватель событий окна. Но если у нас есть 20 слушателей событий на странице, тогда у нас будет суперзамораживание на странице. Как иметь один слушатель событий на массиве из одного и того же компонента?

Оптимизировать массив компонентов, у которых есть прослушиватели оконных событий

class BmResponsiveMenuButton extends PureComponent {
  lastWidth = 0
  resizeStep = 0
  state = {
    hidden: false
  }

  componentDidMount() {
  //HERE ADDING EVENT LISTENERS (TOTALLY WE HAVE 15-20 LISTENERS ON PAGE)
    window.addEventListener('resize', this.handleResize)
    window.addEventListener('scroll', this.handleScroll, false)
    this.anchorMenuButton = document.getElementById(this.props.moreMenuButtonId)
  }

  handleResize = () => {
    this.handleHiddenOrNot()
  }

  componentDidUpdate() {
    this.lastWidth = document.documentElement.clientWidth
  }

  handleHiddenOrNot = () => {
    this.resizeStep = Math.abs(this.lastWidth - document.documentElement.clientWidth)

    let boundingMenu = this.anchorMenuButton.getBoundingClientRect()
    let boundingButton = this.anchorEl.getBoundingClientRect()
    if (boundingButton.right > boundingMenu.left - 10) {
      this.setState({
        hidden: true
      })
      this.props.onHide(this.props.id)
    } else {
      this.setState({
        hidden: false
      })
      this.props.onUnHide(this.props.id)
    }
  }

  handleScroll = () => {
    this.handleResize()
  }

  componentWillUnmount() {
    window.removeEventListener('resize', this.handleResize)
    window.removeEventListener('scroll', this.handleScroll, false)
  }

  handleExited = () => {
    let elem = this.anchorEl
    elem.style.opacity = '0'
    elem.style.visibility = 'hidden'
  }

  handleEnter = () => {
    let elem = this.anchorEl
    elem.style.opacity = '1'
    elem.style.visibility = 'visible'
    elem.style.position = 'sticky'
  }
  render() {
    const {
      title,
      url,
      classes,
      target,
      effects,
      effectType,
      index,
      active,
      currentModule,
      module
    } = this.props
    const transitionProps = {
      key: title,
      in: !this.state.hidden,
      enter: true,
      exit: true,
      timeout: !effects ?
        0 : {
          enter: this.resizeStep > 200 ? index * 100 : 300,
          exit: 200
        },
      onEnter: () => this.handleEnter(),
      onExited: () => this.handleExited()
    }
    let activeModule
    if (module && currentModule === module) {
      activeModule = true
    } else if (active) {
      activeModule = active
    } else {
      activeModule = url.includes(window.location.pathname + window.location.search + window.location.hash)
    }
    const ButtonComponent = ( <
      Link to = {
        url
      }
      target = {
        target
      }
      innerRef = {
        (node) => (this.anchorEl = node)
      } >
      <
      Button className = {
        classNames(classes.topNavigationButton, activeModule ? classes.selected : '')
      } > {
        title
      } <
      /Button> < /
      Link >
    )
    switch (effectType) {
      case 'slide':
        return ( <
          Slide direction = {
            'left'
          } { ...transitionProps
          } > {
            ButtonComponent
          } <
          /Slide>
        )

      case 'fade':
        return <BmFade { ...transitionProps
        } > {
          ButtonComponent
        } < /BmFade>

      case 'grow':
        return <BmGrow { ...transitionProps
        } > {
          ButtonComponent
        } < /BmGrow>

      default:
        break
    }
  }
}

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

Покажите нам тоже код. Трудно сказать, в чем дело сейчас.

AKX 27.12.2018 12:37

@AKX готов. добавлен

Marty 27.12.2018 12:46

Похоже, вы могли бы просто немного поработать. davidwalsh.name/javascript-debounce-function

AKX 27.12.2018 12:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
38
0

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