Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.12.2022, 16:03
Новичок на форуме
Отправить личное сообщение для PereCC Посмотреть профиль Найти все сообщения от PereCC
 
Регистрация: 10.05.2016
Сообщений: 5

Reactjs сохранение данных объекта при обновлении состояния
Всем привет.

Помогите разобраться в задаче:
Есть большой массив с данными, его нужно постепенно выводить пользователю при скроллинге страницы.

Необходимо из большого массива отбирать по частям данные и добавлять их в дополнительный массив, который записан в state.

Проблема:
Не могу сохранить данные в дополнительном массиве в момент добавления новых.

import { useEffect, useState, useContext } from 'react'
import { Link } from 'react-router-dom'
import { IconArray } from '@services/context'
 
const ICONS_PER_PAGE = 5
 
const IconsList = () => {
    const { iconArray, setIconArray } = useContext(IconArray)
 
    const [triggerToLoad, setTriggerToLoad] = useState(true)
    const [iconArrayLazy, setIconArrayLazy] = useState([])
 
    const scrollHandler = (e) => {
        let scrollGalleryValue = document.querySelector('.list__container').getBoundingClientRect().y + document.querySelector('.list__container').clientHeight - window.innerHeight
        if (scrollGalleryValue <= 0 ) {
            setTriggerToLoad(!triggerToLoad)
            console.log(iconArrayLazy); // ? Тут дополнительный массив всегда пустой, как сохранять предыдущие данные?
        }
    }
 
    useEffect(() => {
        // ? добавляем следующие порции, когда срабатывает триггер
        setIconArrayLazy(iconArrayLazy => [...iconArrayLazy, ...iconArray.slice(iconArrayLazy.length, iconArrayLazy.length + ICONS_PER_PAGE)])
    }, [triggerToLoad])
 
    useEffect(() => {
        // ? добавляем первую порцию данных от 0 до ICONS_PER_PAGE
        setIconArrayLazy(iconArrayLazy => [...iconArrayLazy, ...iconArray.slice(iconArrayLazy.length, iconArrayLazy.length + ICONS_PER_PAGE)])
        document.addEventListener('scroll', scrollHandler)
        return function () {
            document.removeEventListener('scroll', scrollHandler)
        }
    }, [])
 
    return (
        <>
            <ul className="list__container">
 
                {iconArrayLazy.map(({id, title, img}) =>
 
                    <li className="icon_container" key={id}>
                        <Link to={`/icon-${id}`}>
                            <img className="icon_container__image" src={img} alt={title} />
                        </Link>
                    </li>
                )}
 
            </ul>
        </>
    )
}
 
export default IconsList
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохраннение измененных данных при клике на кнопку Tanya51 Общие вопросы Javascript 0 10.08.2017 11:35
Сохранение таба при перезагрузке Darell Events/DOM/Window 1 12.05.2017 22:14
AJAX меняет символы при отправке данных fenix_63 AJAX и COMET 6 17.11.2015 14:20
Вывод данных единожды, при открытии окна? Ggorsh Events/DOM/Window 1 28.04.2009 01:04
Сохранение данных на стороне клиента средствами Javascript baal1988 Events/DOM/Window 4 24.08.2008 21:32