React — это мощная библиотека JavaScript, которую часто хвалят за гибкость и эффективность. Однако, когда дело доходит до работы с большими списками и сетками, даже React может начать прогибаться под тяжестью. В этом посте мы рассмотрим концепцию виртуализации React — технику, которая может помочь нам более эффективно отображать большие списки и сетки. Кроме того, мы углубимся в то, как получать большие списки из базы данных Firebase в реальном времени.
Но прежде чем мы начнем, если вам понравился этот пост и вы хотели бы узнать больше о моих взглядах на программирование и технологии, я приглашаю вас подписаться на меня в Medium и Twitter для получения регулярных обновлений.
Что такое React-виртуализация?
Виртуализация React — это метод, используемый для оптимизации рендеринга больших списков и сеток в приложениях React. Идея состоит в том, чтобы отображать только те элементы, которые в данный момент видны в области просмотра пользователя, тем самым уменьшая количество узлов DOM, которыми должен управлять React.
Основной концепцией виртуализации является работа с окнами. Вместо рендеринга всего списка или сетки виртуализация React создает «окно» с видимым контентом и отображает только компоненты в этом окне. Когда пользователь прокручивает, окно перемещается, и React интеллектуально отключает компоненты, которые прокручиваются вне поля зрения, и монтирует те, которые прокручиваются в поле зрения.
Рефакторинг для повышения производительности
Давайте рассмотрим распространенный пример неоптимизированного кода, где мы пытаемся отобразить большой список пользователей, полученный из базы данных Firebase.
import React from 'react'; import { db } from './firebase'; class UserList extends React.Component { state = { users: [] }; componentDidMount() { db.ref('users').on('value', snapshot => { let users = []; snapshot.forEach(snap => { users.push(snap.val()); }); this.setState({ users: users }); }); } render() { return ( <div> {this.state.users.map((user, index) => ( <div key={index}>{user.name}</div> ))} </div> ); } } export default UserList;
Хотя этот код отлично работает для небольшого списка пользователей, он начнет замедляться по мере роста списка. Чтобы реорганизовать это, мы можем использовать виртуализацию React с помощью библиотеки react-window
.
import React from 'react'; import { db } from './firebase'; import { FixedSizeList as List } from 'react-window'; class UserList extends React.Component { state = { users: [] }; componentDidMount() { db.ref('users').on('value', snapshot => { let users = []; snapshot.forEach(snap => { users.push(snap.val()); }); this.setState({ users: users }); }); } Row = ({ index, style }) => ( <div style={style}>{this.state.users[index].name}</div> ); render() { return ( <List height={500} itemCount={this.state.users.length} itemSize={35} width={300} > {this.Row} </List> ); } } export default UserList;
Получение больших списков из базы данных Firebase в реальном времени
Извлечение больших наборов данных в режиме реального времени также может привести к проблемам с производительностью. Один из способов справиться с этим — разбить данные из Firebase на страницы.
Это включает в себя установку ограничения на количество записей, извлекаемых за раз, а затем выборку большего количества записей по мере необходимости. Чтобы получить данные из Firebase на страницах, вы можете использовать методы limitToFirst
или limitToLast
в сочетании с startAt
, endAt
или equalTo
.
componentDidMount() { let ref = db.ref('users').orderByKey(); ref.limitToFirst(50).once('value', snapshot => { let users = []; snapshot.forEach(snap => { users.push(snap.val()); }); this.setState({ users: users }); }); }
В этом коде мы используем orderByKey()
для упорядочения записей и limitToFirst(50)
для получения первых 50 записей.
Когда пользователи прокручивают страницу, мы можем получить следующий набор данных.
loadMoreUsers() { let lastKey = this.state.users[this.state.users.length - 1].key; let ref = db.ref('users').orderByKey().startAt(lastKey); ref.limitToFirst(50).once('value', snapshot => { let users = [...this.state.users]; let newUsers = []; snapshot.forEach(snap => { newUsers.push(snap.val()); }); // Remove first user because it's duplicate newUsers.shift(); this.setState({ users: [...users, ...newUsers] }); }); }
В loadMoreUsers()
мы получаем следующие 50 записей, начиная с последнего ключа в нашем списке текущих пользователей.
Помните, что это базовая реализация, и вам может потребоваться добавить дополнительные функции, такие как индикатор загрузки или обработка ошибок, в зависимости от ваших конкретных потребностей.
Заключение
Виртуализация React — незаменимый инструмент, когда дело доходит до работы с большими списками и сетками в React. Это не только повышает производительность вашего приложения, но и улучшает взаимодействие с пользователем, обеспечивая более быструю и плавную прокрутку.
Помните, что секрет обработки больших наборов данных в React заключается не только в оптимизации того, что видно пользователю, но и в эффективном управлении тем, что происходит за кулисами.
Если вы нашли этот пост полезным и хотите узнать больше о React или других темах в области технологий, подпишитесь на меня в Medium и Twitter, чтобы получить больше информации, советов и руководств. Ваша поддержка очень много значит, и она помогает мне продолжать создавать такой контент.
В конце концов, путь к тому, чтобы стать лучшим разработчиком, заключается в постоянном обучении и совершенствовании, и я здесь, чтобы поддержать вас на этом пути. Удачного кодирования!