# Методическое пособие по JavaScript и React
## Оглавление
1. [Введение](#введение)
2. [Часть I: JavaScript](#часть-i-javascript)
- [Основы синтаксиса](#основы-синтаксиса)
- [Функции](#функции)
- [Объекты и массивы](#объекты-и-массивы)
- [Асинхронность](#асинхронность)
- [Примеры взаимодействия с DOM](#примеры-взаимодействия-с-dom)
3. [Часть II: React](#часть-ii-react)
- [Введение в React](#введение-в-react)
- [Компоненты](#компоненты)
- [Хуки](#хуки)
- [Роутинг](#роутинг)
4. [Практические задания](#практические-задания)
5. [Дополнительные ресурсы](#дополнительные-ресурсы)
6. [Сборщик VIte](#сборщик-vite)
---
## Введение
Это методическое пособие предназначено для изучения основ JavaScript и библиотеки React. Предполагается, что читатель знаком с базовыми понятиями веб-разработки (HTML, CSS).
---
## Часть I: JavaScript
### Основы синтаксиса
#### Переменные
```javascript
// Объявление переменных
let name = "John"; // может быть изменено
const age = 25; // не может быть изменено
var oldWay = "value"; // устаревший способ
```
#### Типы данных
```javascript
// Примитивные типы
const string = "Hello";
const number = 42;
const boolean = true;
const nullValue = null;
const undefinedValue = undefined;
const symbol = Symbol("id");
// Объекты
const object = { key: "value" };
const array = [1, 2, 3];
```
#### Операторы
```javascript
// Арифметические
let sum = 5 + 3; // 8
let difference = 5 - 3; // 2
// Сравнение
console.log(5 == "5"); // true (нестрогое)
console.log(5 === "5"); // false (строгое)
// Логические
console.log(true && false); // false
console.log(true || false); // true
```
### Основы синтаксиса
#### Function Declaration
```javascript
function greet(name) {
return `Hello, ${name}!`;
}
```
#### Function Expression
```javascript
const greet = function (name) {
return `Hello, ${name}!`;
};
```
#### Стрелочные функции
```javascript
const greet = (name) => {
return `Hello, ${name}!`;
};
// Сокращенная форма
const square = (x) => x * x;
```
Главные отличия:
1. Function Declaration
```javascript
// Можно вызвать ДО объявления
console.log(greet("Alice")); // "Hello, Alice!"
function greet(name) {
return `Hello, ${name}!`;
}
```
2. Function Expression
```javascript
// Вызов ДО объявления вызовет ошибку
console.log(greet("Alice")); // ReferenceError: Cannot access 'greet' before initialization
const greet = function (name) {
return `Hello, ${name}!`;
};
```
3. Стрелочные функции
```javascript
// Тоже ошибка - ведут себя как const
console.log(greet("Alice")); // ReferenceError
const greet = (name) => {
return `Hello, ${name}!`;
};
```
Также есть различия в контексте (this), в аргументах и в использовании в качестве конструктора, если интересно про это можете сами почитать подробнее.
### Объекты и массивы
#### Работа с объектами
```javascript
const person = {
name: "Alice",
age: 30,
greet() {
console.log(`Hello, I'm ${this.name}`);
},
};
// Деструктуризация
const { name, age } = person;
// Spread оператор
const updatedPerson = { ...person, city: "Moscow" };
```
Как работает деструктуризация
1. JavaScript смотрит на объект person
2. Ищет свойства с именами name и age
3. Создает новые переменные name и age
4. Копирует значения из соответствующих свойств объекта
Что происходит в spread операторе
1. ...person - "распаковывает" все свойства объекта person
2. Создается новый объект, куда копируются все свойства из person
3. Добавляется новое свойство city: "Moscow"
4. Если бы в person уже было свойство city, оно бы перезаписалось
#### Работа с массивами
```javascript
const numbers = [1, 2, 3, 4, 5];
// Методы массивов
const doubled = numbers.map((num) => num * 2);
const even = numbers.filter((num) => num % 2 === 0);
const sum = numbers.reduce((acc, num) => acc + num, 0);
```
1. Метод map() - Создает новый массив, применяя функцию к каждому элементу исходного массива.
```javascript
// Пример
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map((num) => num * 2);
// Пошагово что происходит:
// 1. num = 1 → return 1 * 2 = 2
// 2. num = 2 → return 2 * 2 = 4
// 3. num = 3 → return 3 * 2 = 6
// 4. num = 4 → return 4 * 2 = 8
// 5. num = 5 → return 5 * 2 = 10
console.log(doubled); // [2, 4, 6, 8, 10]
console.log(numbers); // [1, 2, 3, 4, 5] - исходный массив не изменился!
```
2. Метод filter() - Создает новый массив с элементами, которые прошли проверку (вернули true).
```javascript
// Пример
const numbers = [1, 2, 3, 4, 5];
const even = numbers.filter((num) => num % 2 === 0);
// Пошагово что происходит:
// 1. num = 1 → 1 % 2 === 0? false → исключаем
// 2. num = 2 → 2 % 2 === 0? true → оставляем
// 3. num = 3 → 3 % 2 === 0? false → исключаем
// 4. num = 4 → 4 % 2 === 0? true → оставляем
// 5. num = 5 → 5 % 2 === 0? false → исключаем
console.log(even); // [2, 4]
console.log(numbers); // [1, 2, 3, 4, 5] - исходный массив не изменился!
```
3. Метод reduce() - Преобразует массив в единственное значение, последовательно обрабатывая каждый элемент.
```javascript
// Пример
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, num) => acc + num, 0);
// Пошагово что происходит:
// Начальное значение acc = 0
// 1. acc = 0, num = 1 → return 0 + 1 = 1
// 2. acc = 1, num = 2 → return 1 + 2 = 3
// 3. acc = 3, num = 3 → return 3 + 3 = 6
// 4. acc = 6, num = 4 → return 6 + 4 = 10
// 5. acc = 10, num = 5 → return 10 + 5 = 15
console.log(sum); // 15
```
### Асинхронность
#### Callbacks
```javascript
function fetchData(callback) {
setTimeout(() => {
callback("Data received");
}, 1000);
}
fetchData((data) => {
console.log(data);
});
```
Callback (функция обратного вызова) - это функция, которая передается в другую функцию как аргумент и выполняется после завершения какой-либо операции.
#### Promises
```javascript
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Data received");
// или reject("Error message");
}, 1000);
});
}
fetchData()
.then((data) => console.log(data))
.catch((error) => console.error(error));
```
Promise - это объект, который представляет результат асинхронной операции. У него есть 3 состояния:
1. pending (ожидание)
2. fulfilled (выполнено успешно)
3. rejected (выполнено с ошибкой)
#### Async/await
```javascript
async function getData() {
try {
const data = await fetchData();
console.log(data);
} catch (error) {
console.error(error);
}
}
```
Async/await - это синтаксический сахар над Promises, который позволяет писать асинхронный код так, как будто он синхронный.
Про Promise и Async/await можно написать очень много, если интересно, то можно изучить самим
#### Примеры взаимодействия с DOM
```javascript
// Получение элементов
const element = document.getElementById("myId");
const elements = document.querySelectorAll(".myClass");
// Создание элементов
const newDiv = document.createElement("div");
newDiv.textContent = "Hello World";
// Добавление в DOM
document.body.appendChild(newDiv);
// Обработка событий
element.addEventListener("click", function () {
console.log("Element clicked!");
});
```
DOM (Document Object Model) - это программный интерфейс для HTML и XML документов. Он представляет структуру документа в виде дерева объектов, которые можно изменять с помощью JavaScript.
#### Как устроен DOM (дерево):
```
text
Document (корень)
↓
├──
│ ├──
│ └── ...
└──
├──
Click on the Vite and React logos to learn more
>
);
}
export default App;
```
### 4. Скрипты Package.json
```javascript
{
"scripts": {
"dev": "vite", // Сервер разработки
"build": "vite build", // Сборка для production
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview" // Предпросмотр production сборки
}
}
```
### 5. Настройка Vite (vite.config.js)
```javascript
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
server: {
port: 3000, // Порт разработки
open: true, // Автоматически открывать браузер
},
build: {
outDir: "dist", // Папка для сборки
sourcemap: true, // Карты исходного кода
},
});
```