@MishaXXL

Как избавиться от моргания блоков при их смене после подгрузок данных с сервера?

Есть компонент, который отображает внутри себя таблицы
Изначально он пустой и только при нажатии на кнопку, делает запрос и после рендерит таблицу
Но при смене таблиц, они начинают моргать
Как сделать так, чтобы при смене таблиц, они не моргали, а отображались моментально?

Вроде useLayoutEffect должен с этим бороться, но не понял, как в моем случае его применить

const btn_list = [
    { id: 1, link: 'Cities' },
    { id: 2, link: 'Countries' },
    { id: 3, link: 'Companies' },
]

function createTable(data: Rows[]) {
    return(
        <table className={style.table}>
            <thead>
                {createTableHeader(data)}
            </thead>

            <tbody>
                {data.map((item, i) => craeteTableRow(item, i))}
            </tbody>
        </table>
    )
}

export const Tables = () => {
    const tables = useRef(null)
    const [getTable, { data: table = [], isLoading }] = useGetTableMutation()

    function handleClick(link: string) {
        getTable(link)
    }

    return(
        <div className={'page'}>
            <section>
                <div className={style.submenu}>
                    {btn_list.map(item => <button onClick={() => handleClick(item.link)} key={item.id}>{item.link}</button> )}
                </div>
            </section>

            <section>
                {isLoading && <div className={style.noTable}></div> }
                <div ref={tables} className={style.tableWrapper}>
                    {Boolean(table.length) && createTable(table)}
                </div>
            </section>
        </div>
    )
}
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Моргает он потому, что в момент отрисовки старый уже удален, а новый еще не отрисован. Варианты решения:
- Убедиться точно, что новый контент загружен и лишь затем его выводить. Если контент будет слишком тяжелый для устройства клиента, то этот метод не сработает, т.к. устройству еще понадобится время для его рендера, т.е. моргание будет заметно.
- Добавить некий loading в место, где ожидается появление новых данных.

Как вариант, вместо пустого дива:
<section>
    <div ref={tables} className={style.tableWrapper}>
        {isLoading ? createTable(currentTable) : createTable(table)}
    </div>
</section>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы