Нам часто нужно слушать события клавиатуры, мыши и т.д. в 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) } }, [])
Возможно, вы написали код, подобный приведенному ниже, что он отображает? Или он вообще ничего не отображает?
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)
Я ошибся, это не баг в 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
Нам часто нужно передать булево значение компоненту при его вызове, например, явно передать 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/> }
Каков результат этого кода, пожалуйста? Пустой ли он?
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.
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.