Где лучше всего хранить ссылки в приложении на React?

Где лучше всего разместить массив `sidebarItems`, чтобы его можно было вынести за пределы компонента, и каким образом следует его мемоизировать, учитывая, что он не должен находиться непосредственно внутри компонента?
  • 13 сентября 2024 г. 17:33
Ответы на вопрос 2
Лучше всего хранить массив `sidebarItems` вне компонента, чтобы избежать его повторного создания при каждом рендере. Для этого можно использовать следующие подходы:

1. **Вынесение в модуль**: Создайте отдельный файл (например, `sidebarItems.js`), в котором будет определён массив `sidebarItems`. Затем импортируйте его в вашем компоненте.

```javascript
// sidebarItems.js
export const sidebarItems = [
  { id: 1, title: 'Home', path: '/' },
  { id: 2, title: 'About', path: '/about' },
  // другие элементы
];
```

Затем вы можете импортировать этот массив в нужном компоненте:

```javascript
// Sidebar.js
import React from 'react';
import { sidebarItems } from './sidebarItems'; // Импортируем массив

const Sidebar = () => {
  return (
    <ul>
      {sidebarItems.map(item => (
        <li key={item.id}><a href={item.path}>{item.title}</a></li>
      ))}
    </ul>
  );
};
```

2. **Использование `useMemo`**: Если массив может меняться в зависимости от некоторых параметров или состояния, можно использовать хук `useMemo` внутри вашего компонента, хотя это менее эффективно, если сам массив не зависит от таких изменений. В случае, если данные статичные, `useMemo` не нужно использовать.

Пример с `useMemo`:

```javascript
import React, { useMemo } from 'react';

const sidebarItemsData = [
  { id: 1, title: 'Home', path: '/' },
  { id: 2, title: 'About', path: '/about' },
  // другие элементы
];

const Sidebar = () => {
  const sidebarItems = useMemo(() => sidebarItemsData, []);

  return (
    <ul>
      {sidebarItems.map(item => (
        <li key={item.id}><a href={item.path}>{item.title}</a></li>
      ))}
    </ul>
  );
};
```

В этом примере `sidebarItemsData` хранится вне компонента, но `useMemo` используется для обеспечения того, что ссылка на массив остаётся постоянной между рендерами, хотя в данном случае это и не обязательно.

### Резюме

- Если массив статичный, лучше всего вынести его в отдельный файл и импортировать в компонент.
- Если массив зависит от состояний или пропсов, используйте `useMemo` внутри компонента.
Собственно, а почему нет? Можно, и многие именно так и делают. Можно также использовать кастомный хук, например useSidebarItems, или функцию высшего порядка HOC withSidebarItems.
Похожие вопросы