Frontend | Вопросы собесов
Сайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+T0COHtFzCJkwMDUy Задачи t.me/+_tcX2w2EmvdmMTgy Вакансии t.me/+CgCAzIyGHHg0Nzky
Ko'proq ko'rsatish📈 Telegram kanali Frontend | Вопросы собесов analitikasi
Frontend | Вопросы собесов (@easy_javascript_ru) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 18 272 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 7 345-o'rinni va Rossiya mintaqasida 36 940-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 18 272 obunachiga ega bo‘ldi.
15 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -134 ga, so‘nggi 24 soatda esa -7 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 9.73% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 5.72% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 1 778 marta ko‘riladi; birinchi sutkada odatda 1 046 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 9 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent ставь, браузер, html, border, flex kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Тесты t.me/+T0COHtFzCJkwMDUy
Задачи t.me/+_tcX2w2EmvdmMTgy
Вакансии t.me/+CgCAzIyGHHg0Nzky”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 16 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
Upgrade, чтобы переключиться с HTTP на WebSocket.
🟠Открытие соединения
Если сервер принимает запрос, он отвечает с подтверждением, и соединение переключается на протокол WebSocket. С этого момента канал связи открыт и доступен для двусторонней передачи данных.
🟠Обмен данными
Клиент и сервер могут обмениваться данными в любом направлении. Сообщения отправляются в рамках установленного соединения без необходимости повторного рукопожатия.
🟠Закрытие соединения
Соединение может быть закрыто любой стороной (клиентом или сервером) в любое время. Это может быть сделано по желанию или в случае ошибки.
🚩Сервер на Node.js с использованием библиотеки `ws`
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (socket) => {
console.log('Client connected');
socket.on('message', (message) => {
console.log(`Received: ${message}`);
socket.send(`You said: ${message}`);
});
socket.on('close', () => {
console.log('Client disconnected');
});
});
console.log('WebSocket server is running on ws://localhost:8080');
Ставь 👍 и забирай 📚 Базу знанийmutations (мутации) и actions (действия) играют ключевые роли в управлении состоянием. Они помогают обеспечивать предсказуемость изменения состояния и организовывают логику приложения.
🚩Mutations (Мутации)
Это единственный способ изменить состояние в Vuex. Каждая мутация имеет тип и обработчик. Обработчик мутации получает состояние как первый аргумент, и дополнительный аргумент в качестве полезной нагрузки (payload), который можно использовать для передачи данных в мутацию. Мутации должны быть синхронными, чтобы изменения состояния можно было легко отслеживать. Это помогает делать отладку и логгирование более предсказуемыми.
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
},
incrementBy(state, payload) {
state.count += payload.amount;
}
}
});
🚩Actions (Действия)
Действия используются для выполнения асинхронных операций или сложной бизнес-логики перед вызовом мутаций. Действия могут содержать произвольную асинхронную логику, такие как API-запросы, и затем вызывать мутации для изменения состояния. Действия вызываются с помощью метода dispatch и могут возвращать промисы, что полезно для обработки цепочек асинхронных операций.
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment');
}, 1000);
},
incrementByAsync({ commit }, payload) {
setTimeout(() => {
commit('incrementBy', payload);
}, 1000);
}
}
});
🚩Взаимодействие между Mutations и Actions:
🟠Mutations
Синхронно изменяют состояние.
🟠Actions
Могут быть асинхронными и обычно вызывают мутации для изменения состояния.
Пример взаимодействия
// store.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
message: ''
},
mutations: {
setMessage(state, message) {
state.message = message;
}
},
actions: {
fetchMessage({ commit }) {
setTimeout(() => {
const message = 'Hello from async action!';
commit('setMessage', message);
}, 2000);
}
}
});
Компонент
<template>
<div>
<p>{{ message }}</p>
<button @click="loadMessage">Load Message</button>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
export default {
computed: {
...mapState(['message'])
},
methods: {
...mapActions(['fetchMessage']),
loadMessage() {
this.fetchMessage();
}
}
};
</script>
Ставь 👍 и забирай 📚 Базу знаний<template>
<div>
<form @submit.prevent="handleSubmit">
<label for="name">Имя:</label>
<input type="text" id="name" v-model="name" />
<label for="email">Email:</label>
<input type="email" id="email" v-model="email" />
<button type="submit">Отправить</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
name: '',
email: ''
};
},
methods: {
handleSubmit() {
this.$store.dispatch('submitForm', {
name: this.name,
email: this.email
});
}
}
};
</script>
2⃣Создание состояний, мутаций и действий в Vuex
Создайте состояние для хранения данных формы, мутации для обновления состояния и действия для обработки отправки формы.
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
formData: {
name: '',
email: ''
}
},
mutations: {
SET_FORM_DATA(state, payload) {
state.formData = payload;
}
},
actions: {
submitForm({ commit }, formData) {
// Здесь вы можете выполнить любые асинхронные операции, такие как отправка данных на сервер
// Например, с использованием axios:
// axios.post('/api/form', formData).then(response => {
// console.log(response.data);
// });
commit('SET_FORM_DATA', formData);
}
}
});
3⃣Связать значения формы с состоянием Vuex
Вы можете использовать mapState и mapMutations для связывания состояния и мутаций Vuex с вашим компонентом.
<template>
<div>
<form @submit.prevent="handleSubmit">
<label for="name">Имя:</label>
<input type="text" id="name" v-model="localName" />
<label for="email">Email:</label>
<input type="email" id="email" v-model="localEmail" />
<button type="submit">Отправить</button>
</form>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
export default {
computed: {
...mapState({
name: state => state.formData.name,
email: state => state.formData.email
}),
localName: {
get() {
return this.name;
},
set(value) {
this.updateForm({ name: value, email: this.email });
}
},
localEmail: {
get() {
return this.email;
},
set(value) {
this.updateForm({ name: this.name, email: value });
}
}
},
methods: {
...mapActions(['submitForm']),
handleSubmit() {
this.submitForm({
name: this.localName,
email: this.localEmail
});
},
updateForm(payload) {
this.$store.commit('SET_FORM_DATA', payload);
}
}
};
</script>
4⃣Отправить данные из формы в Vuex и обновить состояние
Когда пользователь отправляет форму, данные формы отправляются в Vuex с помощью действия submitForm, которое обновляет состояние через мутацию SET_FORM_DATA.
Ставь 👍 и забирай 📚 Базу знанийPromise, который принимает функцию с двумя аргументами: resolve и reject. Эти аргументы являются функциями, которые изменяют состояние промиса.
const myPromise = new Promise((resolve, reject) => {
// Асинхронная операция
setTimeout(() => {
const success = true;
if (success) {
resolve('Операция успешно завершена');
} else {
reject('Произошла ошибка');
}
}, 1000);
});
🚩Методы промисов
Промисы имеют несколько методов, которые позволяют работать с результатом асинхронной операции.
🟠then
Метод then используется для обработки успешного выполнения промиса (состояние Fulfilled). Он принимает два аргумента: первый — функция для обработки успешного результата, второй — функция для обработки ошибки (необязательный).
myPromise.then(result => {
console.log(result); // 'Операция успешно завершена'
}).catch(error => {
console.error(error);
});
🟠catch
Метод catch используется для обработки отклонённого промиса (состояние Rejected). Он принимает функцию, которая будет вызвана при ошибке.
myPromise.catch(error => {
console.error(error); // 'Произошла ошибка'
});
🟠finally
Метод finally выполняется после завершения промиса, независимо от того, был он исполнен или отклонён. Он полезен для выполнения кода, который должен быть выполнен в любом случае (например, очистка ресурсов).
myPromise.finally(() => {
console.log('Промис завершён'); // Выполняется в любом случае
});
🟠Цепочка промисов
Методы then и catch возвращают новые промисы, что позволяет создавать цепочки асинхронных операций.
myPromise
.then(result => {
console.log(result); // 'Операция успешно завершена'
return 'Следующий результат';
})
.then(nextResult => {
console.log(nextResult); // 'Следующий результат'
})
.catch(error => {
console.error(error); // Обработка ошибок для всех предыдущих промисов
});
🚩Пример использования промисов
function fetchData(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = () => {
if (xhr.status === 200) {
resolve(JSON.parse(xhr.responseText));
} else {
reject(`Ошибка: ${xhr.status}`);
}
};
xhr.onerror = () => reject('Ошибка сети');
xhr.send();
});
}
fetchData('https://api.example.com/data')
.then(data => {
console.log('Данные получены:', data);
})
.catch(error => {
console.error('Ошибка получения данных:', error);
});
Ставь 👍 и забирай 📚 Базу знанийwithLogging — это функция, которая принимает компонент WrappedComponent и возвращает новый компонент, оборачивающий WrappedComponent с добавленной логикой логирования.
import React, { Component } from 'react';
// Функция, создающая HOC
function withLogging(WrappedComponent) {
return class extends Component {
componentDidMount() {
console.log(`Компонент ${WrappedComponent.name} был смонтирован`);
}
componentWillUnmount() {
console.log(`Компонент ${WrappedComponent.name} будет размонтирован`);
}
render() {
// Передача пропсов в обёрнутый компонент
return <WrappedComponent {...this.props} />;
}
};
}
// Пример использования HOC
class MyComponent extends Component {
render() {
return <div>Привет, мир!</div>;
}
}
const MyComponentWithLogging = withLogging(MyComponent);
export default MyComponentWithLogging;
🚩Плюсы
➕Работа с данными
HOC может использоваться для оборачивания компонента логикой загрузки данных из API или управления состоянием данных.
➕Обработка прав доступа
HOC может использоваться для управления доступом к компонентам, проверяя права пользователя и условно рендеря компоненты.
➕Общие методы
HOC может добавлять общие методы или состояние, которое нужно разделить между несколькими компонентами.
🚩Пример
В этом примере withAuthorization проверяет роль пользователя и условно рендерит WrappedComponent, если пользователь имеет соответствующую роль, или показывает сообщение о запрете доступа.
import React from 'react';
// Функция, создающая HOC для проверки прав доступа
function withAuthorization(WrappedComponent, userRole) {
return class extends React.Component {
render() {
const { role } = this.props;
if (role !== userRole) {
return <div>Доступ запрещен</div>;
}
return <WrappedComponent {...this.props} />;
}
};
}
// Пример использования HOC
class AdminPanel extends React.Component {
render() {
return <div>Панель администратора</div>;
}
}
const AdminPanelWithAuthorization = withAuthorization(AdminPanel, 'admin');
export default AdminPanelWithAuthorization;
Ставь 👍 и забирай 📚 Базу знаний<div>, в структуру DOM.
🚩Плюсы React.Fragment
➕Чистый DOM
Фрагменты не создают дополнительных элементов в DOM, что помогает избежать ненужных вложенных структур и упрощает разметку.
➕Производительность
Избегание дополнительных узлов может немного улучшить производительность, так как уменьшается количество элементов, которые браузер должен обрабатывать и рендерить.
➕Логическая группировка
Использование фрагментов делает код более семантичным и чистым, показывая, что элементы логически связаны без необходимости добавлять новый HTML-элемент.
🚩Пример использования
Элемент <div> добавляет новый узел в DOM и используется для группировки других элементов. Это стандартный блоковый элемент в HTML, который часто используется для создания контейнеров и структурирования страницы.
import React from 'react';
function List() {
return (
<React.Fragment>
<li>Элемент 1</li>
<li>Элемент 2</li>
<li>Элемент 3</li>
</React.Fragment>
);
}
// С использованием короткого синтаксиса:
function List() {
return (
<>
<li>Элемент 1</li>
<li>Элемент 2</li>
<li>Элемент 3</li>
</>
);
}
🚩Плюсы`<div>`:
➕Стилизация и атрибуты
<div> позволяет легко добавлять стили, классы и атрибуты, что делает его полезным для создания структурированных и стилизованных контейнеров.
➕Макет и разметка
<div> подходит для создания блоков, секций и контейнеров, которые требуют определенной разметки или стилей.
🚩Пример использования
import React from 'react';
function Container() {
return (
<div className="container">
<p>Это первый параграф</p>
<p>Это второй параграф</p>
</div>
);
}
🟠`React.Fragment` или `<>...</>`
Когда вам нужно вернуть несколько элементов из компонента без добавления лишних узлов в DOM.
Когда группировка элементов не требует стилизации или добавления атрибутов.
🟠`<div>`
Когда вам нужно добавить стили, классы или атрибуты к контейнеру.
Когда вам нужно создать структурированный блок или секцию на странице.
Ставь 👍 и забирай 📚 Базу знаний
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
