Pull to refresh

Comments 16

constclass App extends Component В первом примере наверное так нужно. Или я не знаю чего то?
исправил, спасибо!

Очень понравился канал на ютубе. Видно, что делаешь качественно и с душой. Желаю успехов!

Заходя в статью, ожидал увидеть какую-нибудь тонкую разницу между useLayoutEffect и componentDidMount, но "чуда не произошло")


А то что классы не будут развиваться — это не кажется, так прямо написано где-то в официальных доках.

Sin9k, спасибо за статью. Столкнулся с такой проблемой, не могу найти ответ. В отличии от вашего примера, элементы отрисовываются динамически в цикле и я собираю их ref-ы и потом в useEffect пытаюсь прочитать размеры.
image
Таймаут поставил для эксперимента. Если большой таймаут, 1000 например, то размер выдается норм
{x: 2, y: 2359.09375, width: 316, height: 48, top: 2359.09375, …}
а если маленький таймаут, то
{x: 0, y: 0, width: 0, height: 0, top: 0, …}
useLayoutEffect тоже пробовал.
2 часа гуглил. Много где пишут, что useEffect срабатывает когда дом готов )
Кто-то уточняет — что дом готов, но еще не отрисован до конца.
В общем, не могу поймать момент, когда размеры есть у элементов… Есть идеи?
Тут конечно надо видеть весь код и иметь возможность с ним поэксперементировать. Для начала я бы рекомендовал не передавать функцию в ref. Т.к. на каждый рендер вы отправляете новую функцию
а как ещё можно массив элементов засунуть в реф?
я пытался без функции, не работает.
ну тут разные подходы есть. Первый и самый просто это вынести item в отдельный компонент и в нем сделать классический useRef() и таким образом оно создаст для каждого компонента свой ref и все будет работать ок. Я думаю этого варианта будет достаточно

Но если вдруг тебе надо более сложную конструкцию, тогда я рекомендую сразу это видео посмотреть, чтобы хорошо понимать исходники как они работают: youtu.be/hoQz95Fh84c

И когда ты будешь осознавать, почему создается объект и зачем нужен current внутри него, ты сможешь улучшить реализацию
у меня есть реф, куда я массив элементов записываю
const phraseRefs = useRef<HTMLDivElement[]>([])
записываю вот так
<div ref={el => {phraseRefs.current[index] = el!}}>
Как создание отдельного компонента, поможет избавиться от функции? Ну будет:
<Item ref={el => {phraseRefs.current[index] = el!}}>
Функция же тут используется чтобы в 1 реф много компонентов записать в цикле.
Скинь пожалуйста пример, что ты предлагаешь, пару строк. А то не понятно.

чет не получается нормально отформатировать :(
`
const Item = ({ index, text }) => {
const ref = useRef()


useEffect(() => {
const size = ref.current.getBoundingClientRect()
// тут делай все что надо тебе с size, можешь родителю прокинуть sendToParent(size)
}, [])


return (
div ref={ref} className="phraseWrapper"{index + ' ' + text} div
)
}
}
`

спасибо. теперь понятно ;-)

На момент первого рендера уже есть готовый массив phrases? Или он добывается асинхронно?

да фразы сразу есть. я нашёл решение тут (у меня тоже ionic 5 кстати, не стал углубляться, вообще по другому сделал в итоге).

@Sin9k

Давайте теперь сравним с тем как работает useEffect...

Мы увидим сначала значение ноль, а только через 3 секунды цифра обновится до ширины блока

React 17-18. Я так понимаю, это уже не актуально?

У меня сначала 3 секунды ожидания, потом появляется блок с шириной 0 и тут же обновляется на новую ширину блока.

Sign up to leave a comment.

Articles