Как Front-End инженер, 4 React ловушки и советы, о которых вы должны знать

RedDeveloper
13.02.2023 11:50
Как Front-End инженер, 4 React ловушки и советы, о которых вы должны знать

4 очень полезных совета по React.

1. Не забудьте удалить слушателя, когда компонент размонтируется.

Нам часто нужно слушать события клавиатуры, мыши и т.д. в useEffect React. Но мы часто забываем удалить их.

const windowScroll = () => {
  console.info('scroll')
}

useEffect(() => {
  window.addEventListener("scroll", windowScroll, false)
}, [])

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

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

Пожалуйста, не забудьте удалить слушателя при размонтировании компонента.

const windowScroll = () => {
  console.info('scroll')
}

useEffect(() => {
  window.addEventListener("scroll", windowScroll, false)
  return () => {
    window.removeEventListener('scroll', windowScroll, false)
  }
}, [])

2. Пожалуйста, используйте 0 осторожно, это дьявол.

Возможно, вы написали код, подобный приведенному ниже, что он отображает? Или он вообще ничего не отображает?

const App = () => {
  const [ list, setList ] = useState([])

  return (
    list.length && (
      <div className="list">
        {list.map((name) => {
          return <div className="item">{name}</div>
        })}
      </div>
    )
  )
}

Я не думаю, что с этим кодом что-то не так! Но он показывает 0. Может быть это ошибка React?

const i = 0
const b = 'fatfish'

console.info(i && b)
Я не думаю что с этим кодом что-то не так! Но он показывает 0 Может быть это ошибка

Я ошибся, это не баг в React, он полностью соответствует синтаксису JavaScript.

Чтобы избежать неправильного отображения 0, необходимо использовать следующие три способа решения этой проблемы.

// 1. Controlled by specific logic
list.length >= 1 && <Component list = {list} />
// 2. Convert list.length to boolean
!!list.length && <Component list = {list} />
// 3. Use ternary expressions and null
list.length ? <Component list = {list} /> : null

3. Как легко передать true дочерним элементам

Нам часто нужно передать булево значение компоненту при его вызове, например, явно передать true.

const Child = ({ showNav }) => {
  return !!showNav && <Nav />
}

const Parent = () => {
  return <Child showNav = { true } />
}

На самом деле, вам просто нужно передать свойство showNav. Они оба имеют совершенно одинаковый эффект.

const Child = ({ showNav }) => {
  return !!showNav && <Nav />
}

const Parent = () => {
  return <Child showNav/>
}

4. Пожалуйста, больше не используйте props.children

Каков результат этого кода, пожалуйста? Пустой ли он?

const Container = ({ children }) => {
  if (children) {
    return (
      <div className="children-container">
        <p>Children is:</p>
        { children }
      </div>
    ) 
  } else {
    return (
      <div className="empty">empty</div>
    )
  }
}

const App = () => {
  const [ list, setList ] = useState([])
  
  return (
    <Container>
      {
        list.map((name) => {
          return <div className="item">{ name }</div>  
        })
      }
    </Container>
  )
}

К сожалению, ответ: "Children is:". Боже мой! Почему так?

На самом деле, children - это пустой массив в данный момент, поэтому "Children is:" обязательно будет выведено. Как нам решить эту проблему? React.Children.toArray спасет нас.

const Container = ({ children }) => {
  if (React.Children.toArray(children).length) {  
    return (
      <div className="children-container">
        <p>children is:</p>
        { children }
      </div>
    ) 
  } else {
    return (
      <div className="empty">empty</div>
    )
  }
}

Подпишитесь на нашу бесплатную еженедельную рассылку . Следите за нами в Twitter , LinkedIn , YouTube , и Discord .

Заинтересованы в масштабировании вашего программного стартапа? Посмотрите Circuit.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.