🤔 Зачем нам разбивать приложение отдельно на backend и frontend?
Разделение на Frontend (клиент) и Backend (сервер) – это стандартный подход в современной веб-разработке. Это делает приложение гибче, масштабируемее и удобнее в разработке.
🚩Почему лучше разделять?
🟠Гибкость и масштабируемость
Можно менять Frontend и Backend независимо.
Можно использовать разные технологии (например, Vue.js + Django).
Можно легко разделить команды разработчиков.
🟠Повышенная безопасность
Frontend не имеет доступа к базе данных.
Все важные вычисления, авторизация, хранение данных происходят на сервере.
API можно защитить токенами (JWT, OAuth).
🟠Уменьшение нагрузки на клиент
Логика обработки данных выполняется на сервере.
Клиент получает уже готовые данные, а не загружает огромные файлы.
🟠Легче разрабатывать и тестировать
Можно разрабатывать Frontend и Backend независимо.
Можно подменять сервер на mock-данные во время разработки.
🚩Как они общаются? (REST API & GraphQL)
Разделённые приложения общаются через API:
REST API (
GraphQL API (запросы только нужных данных)
WebSockets (реальное время, чаты, онлайн-игры)
Ответ от Backend
Ставь 👍 и забирай 📚 Базу знаний
Разделение на Frontend (клиент) и Backend (сервер) – это стандартный подход в современной веб-разработке. Это делает приложение гибче, масштабируемее и удобнее в разработке.
🚩Почему лучше разделять?
🟠Гибкость и масштабируемость
Можно менять Frontend и Backend независимо.
Можно использовать разные технологии (например, Vue.js + Django).
Можно легко разделить команды разработчиков.
🟠Повышенная безопасность
Frontend не имеет доступа к базе данных.
Все важные вычисления, авторизация, хранение данных происходят на сервере.
API можно защитить токенами (JWT, OAuth).
🟠Уменьшение нагрузки на клиент
Логика обработки данных выполняется на сервере.
Клиент получает уже готовые данные, а не загружает огромные файлы.
🟠Легче разрабатывать и тестировать
Можно разрабатывать Frontend и Backend независимо.
Можно подменять сервер на mock-данные во время разработки.
🚩Как они общаются? (REST API & GraphQL)
Разделённые приложения общаются через API:
REST API (
GET, POST, PUT, DELETE) GraphQL API (запросы только нужных данных)
WebSockets (реальное время, чаты, онлайн-игры)
GET https://api.example.com/users
Ответ от Backend
[
{ "id": 1, "name": "Alice" },
{ "id": 2, "name": "Bob" }
]
Ставь 👍 и забирай 📚 Базу знаний
👍2💊2
🤔 Что известно о внедрении зависимостей?
Dependency Injection (внедрение зависимостей) — это передача внешних зависимостей объекту вместо создания их внутри. Это позволяет легче тестировать, заменять реализации, повышает модульность и снижает связанность компонентов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Dependency Injection (внедрение зависимостей) — это передача внешних зависимостей объекту вместо создания их внутри. Это позволяет легче тестировать, заменять реализации, повышает модульность и снижает связанность компонентов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥1🤔1💊1
🤔 Что такое usecontext?
Это один из встроенных хуков, который позволяет компонентам подписываться на контекст и получать доступ к данным контекста. Используется для передачи данных через дерево компонентов без необходимости передавать пропсы на каждом уровне. Это особенно полезно для глобальных данных, таких как текущий авторизованный пользователь, тема (светлая/темная) или настройки локализации.
🚩Как он работает
🟠Создание контекста
Для создания контекста используется функция
🟠Provider
Компонент
🟠useContext
Используется для подписки на контекст в функциональных компонентах. Он принимает объект контекста, возвращаемый из
Полный пример
Ставь 👍 и забирай 📚 Базу знаний
Это один из встроенных хуков, который позволяет компонентам подписываться на контекст и получать доступ к данным контекста. Используется для передачи данных через дерево компонентов без необходимости передавать пропсы на каждом уровне. Это особенно полезно для глобальных данных, таких как текущий авторизованный пользователь, тема (светлая/темная) или настройки локализации.
🚩Как он работает
🟠Создание контекста
Для создания контекста используется функция
createContext. Она возвращает объект контекста, который содержит два компонента: Provider и Consumer. import React, { createContext, useState } from 'react';
const MyContext = createContext();
🟠Provider
Компонент
Provider используется для предоставления значения контекста всем дочерним компонентам. Все компоненты внутри Provider могут получить доступ к значениям, переданным в value. const MyProvider = ({ children }) => {
const [state, setState] = useState('Hello World');
return (
<MyContext.Provider value={{ state, setState }}>
{children}
</MyContext.Provider>
);
};
🟠useContext
Используется для подписки на контекст в функциональных компонентах. Он принимает объект контекста, возвращаемый из
createContext, и возвращает текущее значение контекста. import React, { useContext } from 'react';
const MyComponent = () => {
const { state, setState } = useContext(MyContext);
return (
<div>
<p>{state}</p>
<button onClick={() => setState('New Value')}>Change Value</button>
</div>
);
};
Полный пример
import React, { createContext, useState, useContext } from 'react';
// Создание контекста
const MyContext = createContext();
const MyProvider = ({ children }) => {
const [state, setState] = useState('Hello World');
return (
<MyContext.Provider value={{ state, setState }}>
{children}
</MyContext.Provider>
);
};
const MyComponent = () => {
const { state, setState } = useContext(MyContext);
return (
<div>
<p>{state}</p>
<button onClick={() => setState('New Value')}>Change Value</button>
</div>
);
};
const App = () => (
<MyProvider>
<MyComponent />
</MyProvider>
);
export default App;Ставь 👍 и забирай 📚 Базу знаний
👍3🤔1
🤔 Как увеличить в размере при наведении элемент, не сдвигая соседние?
Чтобы увеличить элемент в размере при наведении, не сдвигая при этом соседние элементы, можно использовать CSS свойство
🚩Почему это важно?
🟠Эффективность пользовательского интерфейса
Увеличение элементов при наведении может служить для привлечения внимания пользователя или для улучшения взаимодействия, например, при работе с интерактивными элементами.
🟠Стабильность макета
Применение трансформации с
🟠Плавные анимации
Использование
Ставь 👍 и забирай 📚 Базу знаний
Чтобы увеличить элемент в размере при наведении, не сдвигая при этом соседние элементы, можно использовать CSS свойство
transform с функцией scale. Это позволяет изменять размер элемента, не влияя на его положение и соседние элементы, так как трансформация происходит в контексте самого элемента и не меняет его фактические размеры в документе.<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Увеличение при наведении</title>
<style>
.container {
display: flex;
gap: 10px;
}
.item {
width: 100px;
height: 100px;
background-color: lightblue;
text-align: center;
line-height: 100px;
transition: transform 0.3s;
}
.item:hover {
transform: scale(1.2); /* Увеличение размера при наведении */
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
🚩Почему это важно?
🟠Эффективность пользовательского интерфейса
Увеличение элементов при наведении может служить для привлечения внимания пользователя или для улучшения взаимодействия, например, при работе с интерактивными элементами.
🟠Стабильность макета
Применение трансформации с
transform: scale позволяет изменять размер элемента без изменения его фактического размера и расположения в документе, что сохраняет стабильность макета и не нарушает расположение соседних элементов.🟠Плавные анимации
Использование
transition делает анимацию плавной и приятной для глаз, улучшая общее восприятие интерфейса.Ставь 👍 и забирай 📚 Базу знаний
👍4🤔1
🤔 Как отменить обтекание картинки текстом?
Когда мы добавляем картинку в HTML, текст по умолчанию может обтекать её, если используется
🚩Отмена обтекания с `clear: both;`
Если изображение обтекается текстом из-за
🚩Сделать изображение блочным (`display: block;`)
По умолчанию
🚩Использовать `overflow: hidden;` для предотвращения наложений
Если у родителя есть
Ставь 👍 и забирай 📚 Базу знаний
Когда мы добавляем картинку в HTML, текст по умолчанию может обтекать её, если используется
float. 🚩Отмена обтекания с `clear: both;`
Если изображение обтекается текстом из-за
float, нужно очистить обтекание с помощью clear: both;. <img src="image.jpg" class="float-img">
<p class="clear-text">Этот текст не будет обтекать картинку.</p>
.float-img {
float: left; /* Изображение обтекается текстом */
margin-right: 10px;
}
.clear-text {
clear: both; /* Останавливает обтекание */
}🚩Сделать изображение блочным (`display: block;`)
По умолчанию
img – inline-block элемент, поэтому текст может располагаться рядом. Если сделать его display: block;, текст уйдёт вниз. img {
display: block;
margin: 10px auto; /* Центрирование */
}🚩Использовать `overflow: hidden;` для предотвращения наложений
Если у родителя есть
float, можно использовать overflow: hidden; для очистки потока. .container {
overflow: hidden; /* Очищает обтекание */
}Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Как работает React?
Это библиотека для построения пользовательских интерфейсов, основанная на компонентной архитектуре. Она использует Virtual DOM для оптимизации обновлений: изменения сначала вносятся в виртуальный DOM, а затем синхронизируются с реальным DOM минимальными операциями. React поддерживает однонаправленный поток данных, что упрощает управление состоянием приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это библиотека для построения пользовательских интерфейсов, основанная на компонентной архитектуре. Она использует Virtual DOM для оптимизации обновлений: изменения сначала вносятся в виртуальный DOM, а затем синхронизируются с реальным DOM минимальными операциями. React поддерживает однонаправленный поток данных, что упрощает управление состоянием приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥2
🤔 Где писать запросы к серверу?
Запросы к серверу в React можно выполнять в нескольких местах в зависимости от архитектуры вашего приложения и используемого подхода.
🚩Использование хуков
🚩Методы жизненного цикла в классовых компонентах
Метод
🟠Сервисы или утилиты
Запросы к серверу можно изолировать в отдельные файлы сервисов или утилит, что помогает сделать код более модульным и переиспользуемым.
service.js
DataFetchingComponent.js
🟠Управление состоянием
Для крупных приложений, где важно централизованное управление состоянием, запросы к серверу можно выполнять в рамках таких библиотек, как Redux или MobX.
Ставь 👍 и забирай 📚 Базу знаний
Запросы к серверу в React можно выполнять в нескольких местах в зависимости от архитектуры вашего приложения и используемого подхода.
🚩Использование хуков
useEffect позволяет выполнять побочные эффекты, такие как запросы к серверу, в функциональных компонентах.import React, { useState, useEffect } from 'react';
function DataFetchingComponent() {
const [data, setData] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch('https://api.example.com/data');
const result = await response.json();
setData(result);
} catch (error) {
console.error('Error fetching data:', error);
}
};
fetchData();
}, []); // Пустой массив означает, что эффект выполнится только при монтировании компонента
return (
<div>
{data ? (
<pre>{JSON.stringify(data, null, 2)}</pre>
) : (
<p>Loading data...</p>
)}
</div>
);
}
export default DataFetchingComponent;🚩Методы жизненного цикла в классовых компонентах
Метод
componentDidMount используется для выполнения запросов к серверу в классовых компонентах после монтирования компонента.import React, { Component } from 'react';
class DataFetchingComponent extends Component {
constructor(props) {
super(props);
this.state = {
data: null,
};
}
componentDidMount() {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
this.setState({ data });
})
.catch(error => {
console.error('Error fetching data:', error);
});
}
render() {
const { data } = this.state;
return (
<div>
{data ? (
<pre>{JSON.stringify(data, null, 2)}</pre>
) : (
<p>Loading data...</p>
)}
</div>
);
}
}
export default DataFetchingComponent;🟠Сервисы или утилиты
Запросы к серверу можно изолировать в отдельные файлы сервисов или утилит, что помогает сделать код более модульным и переиспользуемым.
service.js
export async function fetchData() {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
}DataFetchingComponent.js
import React, { useState, useEffect } from 'react';
import { fetchData } from './service';
function DataFetchingComponent() {
const [data, setData] = useState(null);
useEffect(() => {
fetchData()
.then(data => setData(data))
.catch(error => console.error('Error fetching data:', error));
}, []);
return (
<div>
{data ? (
<pre>{JSON.stringify(data, null, 2)}</pre>
) : (
<p>Loading data...</p>
)}
</div>
);
}
export default DataFetchingComponent;🟠Управление состоянием
Для крупных приложений, где важно централизованное управление состоянием, запросы к серверу можно выполнять в рамках таких библиотек, как Redux или MobX.
Ставь 👍 и забирай 📚 Базу знаний
👍4💊3
🤔 Как происходит tostring?
Метод
🟠
Числа, строки, булевы значения,
Для примитивных типов
Но
Поэтому для них лучше использовать
🟠
Для массивов
🟠`toString()` у объектов
По умолчанию метод
Если нужно другое поведение, можно переопределить
🟠`toString()` у классов
Можно переопределять метод
🟠`toString()` у функций
Функции тоже имеют метод
Для стрелочных функций
🟠Использование `String()` вместо `.toString()`
Лучше использовать
Ставь 👍 и забирай 📚 Базу знаний
Метод
.toString() используется для преобразования значения в строку. Он есть у всех объектов в JavaScript, потому что наследуется от Object.prototype. Однако, его поведение зависит от типа данных. 🟠
toString() у примитивов Числа, строки, булевы значения,
null, undefinedДля примитивных типов
toString() работает просто — возвращает строковое представление значения:console.log((123).toString()); // "123"
console.log(true.toString()); // "true"
console.log(false.toString()); // "false"
console.log((3.14).toString()); // "3.14"
Но
null и undefined не имеют метода toString() и вызов приведёт к ошибкеconsole.log(null.toString()); // ❌ Ошибка: Cannot read properties of null
console.log(undefined.toString()); // ❌ Ошибка
Поэтому для них лучше использовать
String()console.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"
🟠
toString() у массивов Для массивов
toString() преобразует их в строку, разделяя элементы запятойconsole.log([1, 2, 3].toString()); // "1,2,3"
console.log(["яблоко", "банан"].toString()); // "яблоко,банан"
console.log([].toString()); // "" (пустая строка)
🟠`toString()` у объектов
По умолчанию метод
toString() у объекта возвращает строку вида [object Object]const obj = { a: 1, b: 2 };
console.log(obj.toString()); // "[object Object]"Если нужно другое поведение, можно переопределить
toString() в объектеconst user = {
name: "Иван",
age: 30,
toString() {
return `Имя: ${this.name}, Возраст: ${this.age}`;
}
};
console.log(user.toString()); // "Имя: Иван, Возраст: 30"🟠`toString()` у классов
Можно переопределять метод
toString() в классахclass Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
toString() {
return `${this.name} (${this.age} лет)`;
}
}
const person = new Person("Анна", 25);
console.log(person.toString()); // "Анна (25 лет)"🟠`toString()` у функций
Функции тоже имеют метод
toString(), но он возвращает их исходный кодfunction hello() {
return "Привет!";
}
console.log(hello.toString());
// "function hello() { return 'Привет!'; }"Для стрелочных функций
const sum = (a, b) => a + b;
console.log(sum.toString());
// "(a, b) => a + b"
🟠Использование `String()` вместо `.toString()`
Лучше использовать
String(значение), потому что toString() не работает на null и undefinedconsole.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"
console.log(String(42)); // "42"
console.log(String({ a: 1 })); // "[object Object]"
Ставь 👍 и забирай 📚 Базу знаний
👍3🤔2
🤔 В чём разница между макро- и микро-задачами?
Макро-задачи (например, setTimeout, setInterval) выполняются в основном цикле событий после выполнения текущего стека. Микро-задачи (например, Promise, queueMicrotask) имеют более высокий приоритет и выполняются сразу после текущего выполнения кода, до обработки макро-задач. Микро-задачи используются для обработки данных в реальном времени, а макро-задачи — для отложенных действий.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥3
🤔 Зачем нужен eslint?
ESLint – это инструмент для автоматического анализа и исправления кода в JavaScript и TypeScript. Он помогает разработчикам следовать единым стилям кодирования, находить ошибки и предотвращать баги ещё до запуска кода.
🚩Почему ESLint полезен?
Без линтера код может быть неаккуратным и содержать ошибки, которые сложно отловить.
🚩Проблемы без ESLint
Разные стили написания кода
Пропущенные точки с запятой или лишние пробелы
Неиспользуемые переменные
Ошибки, которые не выявляются во время компиляции (например,
🚩Решение с ESLint:
Автоматически находит ошибки и предупреждения
Подсказывает лучшие практики
Поддерживает кастомные правила
Работает в IDE и CI/CD (автоматическая проверка)
🟠Как ESLint работает?
ESLint использует набор правил, которые проверяют код. Если код нарушает эти правила – линтер выдаёт предупреждение или ошибку.
Пример исправленного кода (ESLint fix)
🟠Как установить и настроить ESLint?
Установка
Создание конфига
Пример
Запуск проверки кода
Автоматическое исправление ошибок
🟠ESLint в IDE (VS Code, WebStorm)
Чтобы ESLint работал в VS Code, установите расширение ESLint и включите
🟠ESLint в CI/CD (автоматическая проверка на сервере)
В проектах ESLint можно запускать в GitHub Actions, Jenkins, GitLab CI и других CI/CD системах, чтобы не допускать ошибок в
Теперь перед коммитом можно запускать:
Ставь 👍 и забирай 📚 Базу знаний
ESLint – это инструмент для автоматического анализа и исправления кода в JavaScript и TypeScript. Он помогает разработчикам следовать единым стилям кодирования, находить ошибки и предотвращать баги ещё до запуска кода.
🚩Почему ESLint полезен?
Без линтера код может быть неаккуратным и содержать ошибки, которые сложно отловить.
🚩Проблемы без ESLint
Разные стили написания кода
Пропущенные точки с запятой или лишние пробелы
Неиспользуемые переменные
Ошибки, которые не выявляются во время компиляции (например,
undefined переменные) 🚩Решение с ESLint:
Автоматически находит ошибки и предупреждения
Подсказывает лучшие практики
Поддерживает кастомные правила
Работает в IDE и CI/CD (автоматическая проверка)
🟠Как ESLint работает?
ESLint использует набор правил, которые проверяют код. Если код нарушает эти правила – линтер выдаёт предупреждение или ошибку.
function sayHello(name) {
console.log("Hello, " + name)
}
sayHello("John")Пример исправленного кода (ESLint fix)
function sayHello(name) {
console.log(`Hello, ${name}`);
}
sayHello("John");🟠Как установить и настроить ESLint?
Установка
npm install eslint --save-dev
Создание конфига
npx eslint --init
Пример
.eslintrc.js (настройки ESLint) module.exports = {
env: {
browser: true,
es6: true,
},
extends: [
"eslint:recommended", // Базовые рекомендации
"plugin:vue/vue3-recommended" // Рекомендации для Vue
],
rules: {
"no-unused-vars": "warn", // Предупреждать о неиспользуемых переменных
"semi": ["error", "always"], // Обязательные точки с запятой
"quotes": ["error", "double"], // Только двойные кавычки
},
};Запуск проверки кода
npx eslint myfile.js
Автоматическое исправление ошибок
npx eslint myfile.js --fix
🟠ESLint в IDE (VS Code, WebStorm)
Чтобы ESLint работал в VS Code, установите расширение ESLint и включите
"editor.codeActionsOnSave" "editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}🟠ESLint в CI/CD (автоматическая проверка на сервере)
В проектах ESLint можно запускать в GitHub Actions, Jenkins, GitLab CI и других CI/CD системах, чтобы не допускать ошибок в
main ветку. "scripts": {
"lint": "eslint src --fix"
}Теперь перед коммитом можно запускать:
npm run lint
Ставь 👍 и забирай 📚 Базу знаний
👍5🤔1
🤔 Что значит type="submit"?
Атрибут type="submit" у тега <button> или <input> указывает, что элемент при нажатии должен отправить форму. Он запускает действие, определенное в action формы, и передаёт данные, собранные с полей.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6
🤔 Какие преимущества у di?
Dependency Injection (DI) – это паттерн проектирования, который помогает разделять зависимости и делает код гибче, тестируемее и поддерживаемее. Вместо того чтобы создавать зависимости внутри класса, они передаются (инъектируются) извне.
🚩Почему DI полезен?
🟠Уменьшает связность кода (Loose Coupling)
Вместо того чтобы жестко привязывать один модуль к другому, DI передает зависимости снаружи.
С DI (гибкость)
🟠Улучшает тестируемость (Unit-тесты проще)
С DI можно подменять зависимости на заглушки (mock, fake, stub).
С DI (можно подменить зависимость)
🟠Улучшает расширяемость (легко менять зависимости)
Допустим, сначала использовали
С DI (добавляем новую зависимость без изменения кода UserService)
🟠Упрощает управление зависимостями (через DI-контейнеры)
В крупных приложениях удобно использовать DI-контейнер (например,
Ставь 👍 и забирай 📚 Базу знаний
Dependency Injection (DI) – это паттерн проектирования, который помогает разделять зависимости и делает код гибче, тестируемее и поддерживаемее. Вместо того чтобы создавать зависимости внутри класса, они передаются (инъектируются) извне.
🚩Почему DI полезен?
🟠Уменьшает связность кода (Loose Coupling)
Вместо того чтобы жестко привязывать один модуль к другому, DI передает зависимости снаружи.
class UserService {
constructor() {
this.db = new Database(); // Прямо создаем зависимость
}
getUser(id) {
return this.db.findUserById(id);
}
}С DI (гибкость)
class UserService {
constructor(db) {
this.db = db; // DI передает зависимость извне
}
getUser(id) {
return this.db.findUserById(id);
}
}
// Передаем нужную зависимость
const database = new Database();
const userService = new UserService(database);🟠Улучшает тестируемость (Unit-тесты проще)
С DI можно подменять зависимости на заглушки (mock, fake, stub).
const userService = new UserService(); // Всегда использует реальную Database
userService.getUser(1); // Как протестировать без реальной БД? 🤔
С DI (можно подменить зависимость)
class FakeDatabase {
findUserById(id) {
return { id, name: "Тестовый пользователь" };
}
}
const fakeDb = new FakeDatabase();
const userService = new UserService(fakeDb);
console.log(userService.getUser(1)); // ✅ Тест без реальной БД🟠Улучшает расширяемость (легко менять зависимости)
Допустим, сначала использовали
MySQLDatabase, но решили перейти на MongoDatabase. class UserService {
constructor() {
this.db = new MySQLDatabase(); // Нужно менять здесь
}
}С DI (добавляем новую зависимость без изменения кода UserService)
const db = new MongoDatabase(); // Просто передаем другую зависимость
const userService = new UserService(db);
🟠Упрощает управление зависимостями (через DI-контейнеры)
В крупных приложениях удобно использовать DI-контейнер (например,
InversifyJS для JavaScript/TypeScript). import "reflect-metadata";
import { Container, injectable, inject } from "inversify";
@injectable()
class Database {
findUserById(id) {
return { id, name: "База данных" };
}
}
@injectable()
class UserService {
constructor(@inject(Database) db) {
this.db = db;
}
getUser(id) {
return this.db.findUserById(id);
}
}
// Настраиваем DI-контейнер
const container = new Container();
container.bind(Database).toSelf();
container.bind(UserService).toSelf();
// Получаем объект с нужными зависимостями
const userService = container.get(UserService);
console.log(userService.getUser(1));
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что делает omit?
В JavaScript нет встроенного
Реализация
Реализация
Если используете Lodash, можно просто вызвать
Ставь 👍 и забирай 📚 Базу знаний
omit – это функция, которая удаляет указанные ключи из объекта и возвращает новый объект без этих ключей. В JavaScript нет встроенного
omit, но его можно реализовать с помощью деструктуризации и методов Object.fromEntries() или reduce(). Реализация
omit с Object.fromEntries() (современный способ)function omit(obj, keys) {
return Object.fromEntries(
Object.entries(obj).filter(([key]) => !keys.includes(key))
);
}
const user = { name: "Alice", age: 25, password: "123456" };
const safeUser = omit(user, ["password"]);
console.log(safeUser); // { name: "Alice", age: 25 }Реализация
omit с reduce() (альтернативный способ)function omit(obj, keys) {
return Object.keys(obj).reduce((acc, key) => {
if (!keys.includes(key)) acc[key] = obj[key];
return acc;
}, {});
}
const data = { a: 1, b: 2, c: 3 };
console.log(omit(data, ["b"])); // { a: 1, c: 3 }Если используете Lodash, можно просто вызвать
import { omit } from "lodash";
const user = { name: "Alice", age: 25, password: "123456" };
const safeUser = omit(user, ["password"]);
console.log(safeUser); // { name: "Alice", age: 25 }Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Как изменить стили кнопок с атрибутом disabled?
C атрибутом
🚩Пример использования
🟠Селектора [disabled]
Этот селектор выбирает все элементы, у которых присутствует атрибут
🟠Псевдокласса :disabled
Этот селектор выбирает все элементы, которые находятся в состоянии
🚩Полные примеры
С HTML
С CSS
🟠Комбинированный подход
Вы можете комбинировать селекторы атрибутов с другими селекторами для более точного применения стилей.
Ставь 👍 и забирай 📚 Базу знаний
C атрибутом
disabled, используя селекторы атрибутов. Селектор [disabled] позволяет выбрать все элементы, которые имеют этот атрибут, а селектор :disabled позволяет выбрать все элементы, которые находятся в состоянии disabled.🚩Пример использования
🟠Селектора [disabled]
Этот селектор выбирает все элементы, у которых присутствует атрибут
disabled.button[disabled] {
background-color: gray;
color: white;
border: 1px solid #ccc;
cursor: not-allowed; /* Указывает, что элемент недоступен для взаимодействия */
opacity: 0.6; /* Уменьшает непрозрачность */
}🟠Псевдокласса :disabled
Этот селектор выбирает все элементы, которые находятся в состоянии
disabled.button:disabled {
background-color: gray;
color: white;
border: 1px solid #ccc;
cursor: not-allowed;
opacity: 0.6;
}🚩Полные примеры
С HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Disabled Button Styling</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<button>Active Button</button>
<button disabled>Disabled Button</button>
</body>
</html>
С CSS
/* Стили для активных кнопок */
button {
background-color: blue;
color: white;
border: 1px solid #000;
padding: 10px 20px;
cursor: pointer;
}
/* Стили для кнопок с атрибутом disabled */
button[disabled] {
background-color: gray;
color: white;
border: 1px solid #ccc;
cursor: not-allowed;
opacity: 0.6;
}
/* Альтернативный способ с использованием псевдокласса :disabled */
button:disabled {
background-color: gray;
color: white;
border: 1px solid #ccc;
cursor: not-allowed;
opacity: 0.6;
}
🟠Комбинированный подход
Вы можете комбинировать селекторы атрибутов с другими селекторами для более точного применения стилей.
/* Стили для кнопок с классом .special, которые имеют атрибут disabled */
button.special[disabled] {
background-color: darkgray;
color: black;
border: 1px dashed #999;
cursor: not-allowed;
opacity: 0.7;
}
Ставь 👍 и забирай 📚 Базу знаний
👍3🤔1
🤔 Зачем нужен Docker?
Docker позволяет упаковать приложение и все его зависимости в контейнер, обеспечивая одинаковую среду для разработки, тестирования и продакшна.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Docker позволяет упаковать приложение и все его зависимости в контейнер, обеспечивая одинаковую среду для разработки, тестирования и продакшна.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥1