← Назад к вопросам

Что такое React?

1.0 Junior🔥 31 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

React: фреймворк для построения пользовательских интерфейсов

React — это JavaScript библиотека (часто называемая фреймворком) для создания пользовательских интерфейсов с помощью компонентов и реактивного программирования. Разработана компанией Facebook в 2013 году и стала стандартом в frontend разработке.

Основная идея

React основан на declarative подходе (описываем ЧТО хотим видеть), а не imperative подходе (описываем КАК это сделать):

// ❌ Imperative подход (старый способ, jQuery style)
const userElement = document.getElementById('user');
const user = { name: 'John', age: 30 };

const htmlString = '<div>';
htmlString += '<h1>' + user.name + '</h1>';
htmlString += '<p>Age: ' + user.age + '</p>';
htmlString += '</div>';

userElement.innerHTML = htmlString;

// ❌ Проблемы:
// - Сложно отследить, когда и что обновилось
// - Легко создать bugs при обновлении DOM
// - Код хрупкий и сложно поддерживать

// ✅ Declarative подход (React way)
function UserCard({ user }) {
  return (
    <div>
      <h1>{user.name}</h1>
      <p>Age: {user.age}</p>
    </div>
  );
}

// React сам разберётся, как обновить DOM
// Мы только описываем, как это должно выглядеть

Ключевые концепции

1. Компоненты (Components)

// Функциональный компонент (современный подход)
function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

// Компонент с состоянием
function Counter() {
  const [count, setCount] = React.useState(0);
  
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Increment
      </button>
    </div>
  );
}

// Использование компонентов
export default function App() {
  return (
    <div>
      <Greeting name="Alice" />
      <Counter />
    </div>
  );
}

2. JSX синтаксис

// JSX - это синтаксис, похожий на HTML, внутри JavaScript
// На самом деле это просто синтаксический сахар для функции React.createElement()

// JSX:
const element = <h1 className="greeting">Hello, World!</h1>;

// Компилируется в:
const element = React.createElement(
  'h1',
  { className: 'greeting' },
  'Hello, World!'
);

// JSX позволяет вставлять выражения JavaScript в фигурные скобки
const name = 'Alice';
const element = <h1>Hello, {name}!</h1>;

const user = { firstName: 'John', lastName: 'Doe' };
const greeting = <h1>Hello, {user.firstName} {user.lastName}!</h1>;

3. Props (свойства компонента)

// Props - это способ передать данные от родителя к потомку

function UserProfile({ user, onFollow }) {
  return (
    <div>
      <h2>{user.name}</h2>
      <p>Email: {user.email}</p>
      <button onClick={onFollow}>Follow</button>
    </div>
  );
}

// Использование:
const user = { name: 'Alice', email: 'alice@example.com' };

<UserProfile 
  user={user} 
  onFollow={() => console.log('Followed!')}
/>

4. State (состояние компонента)

// State - это данные, которые могут меняться внутри компонента
// Когда state меняется, компонент автоматически перерисовывается

function TodoList() {
  const [todos, setTodos] = React.useState([]);
  const [input, setInput] = React.useState('');
  
  const addTodo = () => {
    setTodos([...todos, { id: Date.now(), text: input }]);
    setInput('');  // очищаем input
  };
  
  const removeTodo = (id) => {
    setTodos(todos.filter(todo => todo.id !== id));
  };
  
  return (
    <div>
      <input 
        value={input} 
        onChange={(e) => setInput(e.target.value)} 
      />
      <button onClick={addTodo}>Add</button>
      
      <ul>
        {todos.map(todo => (
          <li key={todo.id}>
            {todo.text}
            <button onClick={() => removeTodo(todo.id)}>Remove</button>
          </li>
        ))}
      </ul>
    </div>
  );
}

// Ключевой момент: setTodos не изменяет todos напрямую
// Это создаёт НОВЫЙ массив, и React видит, что данные изменились

5. Hooks (современный способ управления состоянием)

// useState - управление состоянием
const [count, setCount] = React.useState(0);

// useEffect - побочные эффекты (API запросы, подписки и т.д.)
function UserData({ userId }) {
  const [user, setUser] = React.useState(null);
  const [loading, setLoading] = React.useState(true);
  
  React.useEffect(() => {
    // Этот код выполнится после рендеринга
    fetch(`/api/users/${userId}`)
      .then(r => r.json())
      .then(data => {
        setUser(data);
        setLoading(false);
      });
  }, [userId]);  // зависимость: перезапустить если userId изменился
  
  if (loading) return <p>Loading...</p>;
  return <div>{user.name}</div>;
}

// useContext - доступ к global state
const ThemeContext = React.createContext('light');

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Header />
    </ThemeContext.Provider>
  );
}

function Header() {
  const theme = React.useContext(ThemeContext);
  return <header className={theme}>...</header>;
}

// useMemo - оптимизация (мемоизация дорогих вычислений)
const expensiveValue = React.useMemo(
  () => fibonacci(50),
  []  // вычислить один раз при монтировании
);

// useCallback - стабилизировать функции для оптимизации
const handleClick = React.useCallback(() => {
  console.log('Clicked!');
}, []);  // одна и та же функция всегда

Жизненный цикл компонента

function Component() {
  // 1. Инициализация (первый рендер)
  console.log('Component created');
  
  // 2. Рендер (отправка JSX в virtual DOM)
  const [count, setCount] = React.useState(0);
  
  // 3. Побочные эффекты (useEffect)
  React.useEffect(() => {
    // Выполняется после рендера
    console.log('Component mounted or updated');
    
    // Cleanup функция (выполняется перед unmount или перед новым эффектом)
    return () => {
      console.log('Cleanup before unmount or new effect');
    };
  }, [count]);  // зависимости
  
  // 4. Рендер
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>+</button>
    </div>
  );
}

// Жизненный цикл:
// Component created (один раз)
// Рендер (JSX в virtual DOM)
// Component mounted or updated (после рендера)
// ... пользователь нажимает кнопку ...
// Cleanup before unmount or new effect (перед новым эффектом)
// Рендер (JSX в virtual DOM с новыми данными)
// Component mounted or updated (после рендера)

Virtual DOM и Reconciliation

// React использует Virtual DOM для оптимизации

// 1. При изменении state, React создаёт новый Virtual DOM
function App() {
  const [name, setName] = React.useState('Alice');
  
  // Virtual DOM (в памяти):
  // <div>
  //   <h1>Hello, Alice</h1>
  //   <button>Change name</button>
  // </div>
  
  return (
    <div>
      <h1>Hello, {name}</h1>
      <button onClick={() => setName('Bob')}>Change name</button>
    </div>
  );
}

// 2. React сравнивает старый Virtual DOM с новым (reconciliation)
// Нашёл различия: 'Alice' -> 'Bob'

// 3. React обновляет только изменившиеся части реального DOM
// Это намного быстрее, чем обновить весь DOM

// 4. Браузер перерисовывает только изменённые элементы

Пример: интеграция с Java Backend

// Frontend React компонент
function UsersList() {
  const [users, setUsers] = React.useState([]);
  const [loading, setLoading] = React.useState(false);
  const [error, setError] = React.useState(null);
  
  React.useEffect(() => {
    setLoading(true);
    
    // Запрос к Java API
    fetch('/api/v1/users')
      .then(response => {
        if (!response.ok) throw new Error('API error');
        return response.json();
      })
      .then(data => {
        setUsers(data);
        setError(null);
      })
      .catch(err => {
        setError(err.message);
        setUsers([]);
      })
      .finally(() => setLoading(false));
  }, []);
  
  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {error}</p>;
  
  return (
    <div>
      <h1>Users</h1>
      <ul>
        {users.map(user => (
          <li key={user.id}>
            <strong>{user.name}</strong> - {user.email}
          </li>
        ))}
      </ul>
    </div>
  );
}

Почему Java разработчику важно понимать React

1. Современные веб приложения имеют rich UI
   - Старые JSP/Thymeleaf - это прошлое
   - React/Vue/Angular - современный frontend

2. Full-stack разработка требует понимания обеих сторон
   - Backend (Java) предоставляет REST API
   - Frontend (React) потребляет этот API

3. Коммуникация между frontend и backend
   - JSON формат обмена данных
   - REST архитектура
   - асинхронные запросы

4. Performance и оптимизация
   - Как работает Virtual DOM
   - Когда компонент перерисовывается
   - Как оптимизировать запросы к API

Сравнение с другими фреймворками

// React: очень гибкий, экосистема, популярен
<div>
  <input value={state} onChange={setState} />
</div>

// Vue: проще для обучения, хорошая синтаксис
<div>
  <input v-model="state" />
</div>

// Angular: полнофункциональный фреймворк, enterprise
// Требует TypeScript, RxJS, Dependency Injection и т.д.

Заключение

React — это:

  • Declarative — описываем ЧТО, не КАК
  • Component-based — переиспользуемые компоненты
  • Virtual DOM — оптимизированное обновление UI
  • Unidirectional data flow — данные текут в одном направлении
  • Popular — самый популярный frontend фреймворк
  • Learn once, write anywhere — используется не только для веба

Для Java разработчика это важный skill, потому что:

  • Большинство современных веб приложений используют React
  • Frontend и backend должны хорошо интегрироваться
  • REST API должны быть спроектированы с учётом frontend потребностей