Благодаря методу reduce можно легко свернуть массив в одно значение 🌀
Есть массив numbers с элементами, объявляем переменную, через равно указываем название массива и метод reduce *️⃣
Далее необходимо прописать callback-функцию со сложением двух параметров: accumulator и currentValue 🎛
accumulator – это результат выполнения итераций. На каждой итерации это значение обновляется в соответствии с логикой функции ℹ️
currentValue – это элемент массива, обрабатываемый на какой-то итерации. Для первой итерации это значение 1, для второй - 3 и так далее ℹ️
Код со скрина:
Есть массив numbers с элементами, объявляем переменную, через равно указываем название массива и метод reduce *️⃣
Далее необходимо прописать callback-функцию со сложением двух параметров: accumulator и currentValue 🎛
accumulator – это результат выполнения итераций. На каждой итерации это значение обновляется в соответствии с логикой функции ℹ️
currentValue – это элемент массива, обрабатываемый на какой-то итерации. Для первой итерации это значение 1, для второй - 3 и так далее ℹ️
Код со скрина:
let num = [1, 3, 2, 12];
let sum = num.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
console.log(sum);
🔥6👍2
This media is not supported in your browser
VIEW IN TELEGRAM
useReducer – это React хук, который используется для управления состоянием компонентов с помощью reducer-функции ↔️
reducer-функция – это функция, которая принимает параметры состояния компонента (state) и объект action.
Объект action несет информацию про тип действия, которое нужно выполнить 👁🗨
Код из видео:
reducer-функция – это функция, которая принимает параметры состояния компонента (state) и объект action.
Объект action несет информацию про тип действия, которое нужно выполнить 👁🗨
Код из видео:
import React, { useReducer } from 'react';
const initialState = { count: 0 };
const reducerFunction = (state, action) => { switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
return state;
}};
const Component = () => {
const [state, dispatch] = useReducer(reducerFunction, initialState)
return (
<div>
<p>Счёт: {state.count}</p>
<button onClick={() => dispatch({ type: 'increment' })}>Увеличить</button>
<button onClick={() => dispatch({ type: 'decrement' })}>Уменьшить</button>
</div>
);};
export default Component;🔥6
Как вы узнали про телеграм канал codorum?
Anonymous Poll
44%
через тикток
27%
через инстаграм
21%
через ютуб
7%
другим способом
⚡5
Почти 23% аудитории нашего канала – дамы 🌸
Поэтому хочу от имени мужчин канала (думаю они будут только за) поздравить Вас – наших прекрасных дам с 8 марта 💐
Вы для нас как ясный лучик солнца в сумрачный день 🔆
Оставайтесь такими же прекрасными во всех отношениях! Помните, что мы вас ценим и любим 💜
Поэтому хочу от имени мужчин канала (думаю они будут только за) поздравить Вас – наших прекрасных дам с 8 марта 💐
Вы для нас как ясный лучик солнца в сумрачный день 🔆
Оставайтесь такими же прекрасными во всех отношениях! Помните, что мы вас ценим и любим 💜
❤🔥6🥰2👀1
This media is not supported in your browser
VIEW IN TELEGRAM
Использование метода reduce открывает возможность выполнения сложных операций с элементами массива и сведения его до какого-то единого результата 🌀
На видео пример применения метода для нахождения максимального значения в массиве:
➖ есть массив numbers с элементами
➖ я создал новую переменную maxNumber
➖ через равно указал название массива с элементами и метод reduce
➖ в скобках указал условие по отбору числа
max (accumulator - аккумулятор) – это значение самого большого элемента на каждой итерации ℹ️
num (currentValue - текущий элемент массива) – это значение, представляющее элемент массива, который сравнивается с самым большим элементом на момент какой-то итерации ℹ️
В ходе выполнения кода будет произведено 4 итерации, на каждой из которых будет выполнено сравнение каждого элемента массива 👁🗨
Код из видео:
На видео пример применения метода для нахождения максимального значения в массиве:
➖ есть массив numbers с элементами
➖ я создал новую переменную maxNumber
➖ через равно указал название массива с элементами и метод reduce
➖ в скобках указал условие по отбору числа
max (accumulator - аккумулятор) – это значение самого большого элемента на каждой итерации ℹ️
num (currentValue - текущий элемент массива) – это значение, представляющее элемент массива, который сравнивается с самым большим элементом на момент какой-то итерации ℹ️
В ходе выполнения кода будет произведено 4 итерации, на каждой из которых будет выполнено сравнение каждого элемента массива 👁🗨
Код из видео:
let numbers = [2, 8, 9, 6];
let maxNumber = numbers.reduce((max, num) => (num > max ? num : max), numbers[0]);
console.log("Максимальное значение =", maxNumber);
🔥5❤3👍3
This media is not supported in your browser
VIEW IN TELEGRAM
join – метод, позволяющий объединить элементы массива в один ряд. Метод join можно использовать для создания текстового представления массива, соединенного нашим собственным разделителем 🤝
В видео я показал как можно объединить не только элементы массива в одну строку с помощью метода join, но и как можно объединить свойства объекта 👁🗨
Для этого нужно заранее выполнить деструктуризацию его свойств и в качестве элементов массива подставить переменные, полученные в следствии деструктуризации 📤
Код из видео:
В видео я показал как можно объединить не только элементы массива в одну строку с помощью метода join, но и как можно объединить свойства объекта 👁🗨
Для этого нужно заранее выполнить деструктуризацию его свойств и в качестве элементов массива подставить переменные, полученные в следствии деструктуризации 📤
Код из видео:
// ✦ Oбъединение элементов массива
let words = ["Codorum", "-", "пишу", "на", "js",];
let sentence = words.join(" ");
console.log("sentence =", sentence);
// ✦ Oбъединение свойств объекта
let passwordElements = { block_1: '1SF2', block_2: '3S2G', block_3: 'SK1F' };
let { block_1, block_2, block_3 } = passwordElements;
// block_1 = "1SF2", block_2 = "3S2G", block_3 = "SK1F"
let passwordMap = [block_1, block_2, block_3];
let password = passwordMap.join("-");
console.log("password =", password);
👍6❤1
This media is not supported in your browser
VIEW IN TELEGRAM
useMemo – это React хук, который используется для мемоизации (сохранения) результатов обработки значений функциями ⏺
Хук useMemo помнит результаты вычислений и возвращает их при следующих вызовах, если вводные данные ранее обрабатывались функцией 🧠
Это делает его эффективным помощником в оптимизации проекта 👁🗨
Код из видео:
Хук useMemo помнит результаты вычислений и возвращает их при следующих вызовах, если вводные данные ранее обрабатывались функцией 🧠
Это делает его эффективным помощником в оптимизации проекта 👁🗨
Код из видео:
import React, { useMemo, useState } from 'react';
const Component = () => {
const [count, setCount] = useState(0);
const [inputValue, setInputValue] = useState(0);
const square = useMemo(() => {
return count ** 2;
}, [count]);
const handleInputChange = (event) => {
setInputValue(event.target.value);
};
const handleCalculate = () => {
setCount(parseInt(inputValue));
};
return (
<div>
<p>Введите число:</p>
<input type="number" value={inputValue} onChange={handleInputChange}/>
<button onClick={handleCalculate}>Узнать квадрат числа</button>
<p>Квадрат числа {count} = {square}</p>
</div>
);
};
export default Component;🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
attr функция – это функция, позволяющая использовать значения атрибутов HTML-элементов в качестве значений свойств в CSS 🎏
Функция позволяет динамически использовать значения атрибутов для отображения текста, URL или других значений, определенных в HTML, непосредственно в свойствах CSS 🔷
В видео я показал, как передать переменную count из React компонента в псевдоэлемент ::before 👁🗨
Код из видео:
Функция позволяет динамически использовать значения атрибутов для отображения текста, URL или других значений, определенных в HTML, непосредственно в свойствах CSS 🔷
В видео я показал, как передать переменную count из React компонента в псевдоэлемент ::before 👁🗨
Код из видео:
// ✦ index.js
import React from 'react';
const Component = () => {
let count = 3;
return (
<div>
<button count={count}>Кнопка</button>
</div>
);
};
export default Component;
// ✦ index.css
button {
position: relative;
}
button::before {
content: attr(count);
position: absolute;
top: -0.75em;
right: -0.75em;
width: 1.5em;
height: 1.5em;
display: flex;
justify-content: center;
align-items: center;
border-radius: 50%;
background-color: #f74a67;
color: white;
}
🔥10👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Связка метода map с методами toUpperCase и toLowerCase позволяет легко переводить слова предложения в верхний или нижний регистр 🔃
Для этого достаточно объявить новые переменные и через знак равно указать массив с предложениями или словами, которые мы хотим перевести в верхний или нижний регистр 👁🗨
Далее указать метод map и в скобках указать, что для слов мы хотим применить метод toUpperCase или toLowerCase ✔️
map – метод позволяющий изменять массив, получая в качестве результата новый массив с изменёнными элементами первоначального массива 🗺
Код из гифки:
Для этого достаточно объявить новые переменные и через знак равно указать массив с предложениями или словами, которые мы хотим перевести в верхний или нижний регистр 👁🗨
Далее указать метод map и в скобках указать, что для слов мы хотим применить метод toUpperCase или toLowerCase ✔️
map – метод позволяющий изменять массив, получая в качестве результата новый массив с изменёнными элементами первоначального массива 🗺
Код из гифки:
let sentence1 = ["Codorum - пишу на JavaScript"];
// перевод слов в верхний регистр
let sentenceUpperCase = sentence1.map(word => word.toUpperCase());
console.log('sentenceUpperCase =', sentenceUpperCase);
let sentence2 = ["ВТОРОЕ ПРЕДЛОЖЕНИЕ"];
// перевод слов в нижний регистр
let sentenceLowerCase = sentence2.map(word => word.toLowerCase());
console.log('sentenceLowerCase =', sentenceLowerCase);
👍6
С помощью метода every можно проверить удовлетворяет ли каждый элемент массива какому-то условию ⏺
Основная и по сути единственная функция метода every – проверка элементов массива на определенное условие, но метод можно комбинировать с другими методами, такими как map, filter или reduce, чтобы добиться какого-то определенного результата 🔽
Метод возвращает true, если условие выполняется для всех элементов массива, и false, если напротив 👁🗨
Код со скрина:
Основная и по сути единственная функция метода every – проверка элементов массива на определенное условие, но метод можно комбинировать с другими методами, такими как map, filter или reduce, чтобы добиться какого-то определенного результата 🔽
Метод возвращает true, если условие выполняется для всех элементов массива, и false, если напротив 👁🗨
Код со скрина:
let numbers = [6, 13, 20, 21, 23, 27, 30, 8, 12, 14];
// проверка, все ли элементы больше чем 5
let OverThan5 = numbers.every(num => num > 5);
console.log("Все элементы массива numbers больше пяти:", OverThan5);
👍7❤2
This media is not supported in your browser
VIEW IN TELEGRAM
setTimeout – метод, с помощью которого можно создать задержку выполнения функции на указанное время в милисекундах ⏲
При работе с методом важно правильно определять уровни Scope (зоны видимости) 👇
Если метод лежит на глобальном Scope уровне, то время задержки для выполнения функции начинает отсчет после запуска кода ℹ️
А если метод лежит, к примеру, на дочернем Scopе уровне глобального Scope уровня, то время задержки для выполнения функции начинает отсчет после запуска функции, которая лежит на глобальном Scope уровне ℹ️
1-й код из видео:
При работе с методом важно правильно определять уровни Scope (зоны видимости) 👇
Если метод лежит на глобальном Scope уровне, то время задержки для выполнения функции начинает отсчет после запуска кода ℹ️
А если метод лежит, к примеру, на дочернем Scopе уровне глобального Scope уровня, то время задержки для выполнения функции начинает отсчет после запуска функции, которая лежит на глобальном Scope уровне ℹ️
1-й код из видео:
// Функция 1 (выполняется сразу после запуска кода)
console.log("1 функция выполнилась");
// Функция 2 (выполняется через 1 секунду после запуска кода)
setTimeout(() => {
console.log("2 функция выполнилась");
}, 1000);
// Функция 3 (выполняется через 2 секунды после запуска кода)
setTimeout(() => {
console.log("3 функция выполнилась");
}, 2000);
🔥7
This media is not supported in your browser
VIEW IN TELEGRAM
Async await – это функция JavaScript, позволяющая писать асинхронный код с чистой и понятной синтаксической структурой. Слово async определяет асинхронную функцию, а слово await указывает на ожидание выполнения асинхронной операции 🔀
В видео мы рассмотрели пример с функцией async await по вычислению количества процентов числа "b" от числа "a". Часть функции percentFromNum (await) вычислила процент от числа "a", а основная часть функции calculate (async) умножила результат полученный с функции percentFromNum на число "b" 👁🗨
Код из видео:
В видео мы рассмотрели пример с функцией async await по вычислению количества процентов числа "b" от числа "a". Часть функции percentFromNum (await) вычислила процент от числа "a", а основная часть функции calculate (async) умножила результат полученный с функции percentFromNum на число "b" 👁🗨
Код из видео:
function percentFromNum(a) {
return new Promise
(resolve => {
resolve(100/a); // 2
});
}
async function calculate(a, b) {
console.log("вычисляем сколько % составляет число", b, "от числа", a) // 1
let res = await percentFromNum(a);
let percent = res * b; // 3
console.log("число", b, "составляет", percent + "% от числа", a); // 4
}
calculate(500, 70);👍10
This media is not supported in your browser
VIEW IN TELEGRAM
Условный рендеринг (conditional rendering) – это отображение компонентов или контента в зависимости от определенных условий или состояний 💎
Реализовать это отображение можно с помощью различных способов, таких как:
➖ применение оператора "if/else"
➖ использование тернарного оператора "? :"
➖ использование метода render в классовых компонентах
➖ использование метода return в функциональных компонентах
В видео мы рассмотрели пример отображения разного текста в зависимости от значения состояния "isLoggedIn", которое регулируется кнопкой 👁🗨
Код из видео:
Реализовать это отображение можно с помощью различных способов, таких как:
➖ применение оператора "if/else"
➖ использование тернарного оператора "? :"
➖ использование метода render в классовых компонентах
➖ использование метода return в функциональных компонентах
В видео мы рассмотрели пример отображения разного текста в зависимости от значения состояния "isLoggedIn", которое регулируется кнопкой 👁🗨
Код из видео:
import React, { useState } from 'react';
const Component = () => {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const handleLoginClick = () => {
setIsLoggedIn(prevState => !prevState);
};
return (
<div>
<h1>{isLoggedIn ? 'Вы успешно авторизованы' : 'Пожалуйста, авторизуйтесь'}</h1>
<button onClick={handleLoginClick}>
{isLoggedIn ? 'Выйти' : 'Войти'}
</button>
</div>
);
};
export default Component;👍3👏1
This media is not supported in your browser
VIEW IN TELEGRAM
С помощью анимации, прописанной в правиле @keyframes и индивидуальному значению дополнительного свойства animation-delay для каждой фигуры можно создать волнообразную анимацию загрузки из точек 🪄
В видео я показал как реализовать плавную волнообразную анимацию загрузки из точек и рассказал про свойство animation-delay, в значении которого мы можем прописать вычисление задержки начала анимации фигуры 👁🗨
Основной код из видео:
В видео я показал как реализовать плавную волнообразную анимацию загрузки из точек и рассказал про свойство animation-delay, в значении которого мы можем прописать вычисление задержки начала анимации фигуры 👁🗨
Основной код из видео:
// ✦ index.js
<div className="loader">
<div class="dot" style={{ animationDelay: "calc(0.1s * 1)" }}/>
<div class="dot" style={{ animationDelay: "calc(0.1s * 3)" }}/>
</div>
// ✦ index.css
.loader {
display: flex;
justify-content: center;
}
.dot {
width: 10px;
height: 10px;
margin: 80px 5px;
border-radius: 50%;
background-color: black;
transform: scale(0.2);
animation: animationDot 2s linear infinite;
}
@keyframes animationDot {
0% { transform: scale(0.2) }
30% { transform: scale(1) }
70%, 100% { transform: scale(0.2) }
}
🔥5👍1
Благодаря методу Object.values можно легко конвертировать значения свойств объекта в элементы массива 🌀
У объекта есть, допустим, 3 свойства и с помощью метода мы как бы вытягиваем значения этих свойств делая их самостоятельными элементами, собирая в отдельный массив 👁🗨
Метод удобный и часто полезный ✔️
Код со скрина:
У объекта есть, допустим, 3 свойства и с помощью метода мы как бы вытягиваем значения этих свойств делая их самостоятельными элементами, собирая в отдельный массив 👁🗨
Метод удобный и часто полезный ✔️
Код со скрина:
// ✦ Объект с тремя свойствами
const user = { name: 'Ignat', age: 30, role: 'admin' };
// ✦ Массив с тремя элементами (в качестве элементов
// выступают значения свойств объекта user)
const array = Object.values(user);
console.log("array =", array);
🔥5❤1👍1👌1
Одним постом выше мы рассматривали как получить значения свойств объекта благодаря методу Object.values, с помощью же методу Object.keys мы можем узнать ключи этих свойств 🔑
Применяется метод Object.keys аналогично методу Object.values. Только вместо массива значений свойств объекта мы получаем массив с элементами состоящих из ключей свойств объекта 👁🗨
Следовательно, метод Object.keys не менее полезен и удобен, чем метод Object.values и тоже часто может пригодится ✔️
Код со скрина:
Применяется метод Object.keys аналогично методу Object.values. Только вместо массива значений свойств объекта мы получаем массив с элементами состоящих из ключей свойств объекта 👁🗨
Следовательно, метод Object.keys не менее полезен и удобен, чем метод Object.values и тоже часто может пригодится ✔️
Код со скрина:
// ✦ Объект с тремя свойствами
const user = { name: 'Ignat', age: 30, role: 'admin' };
// ✦ Массив с тремя элементами (в качестве элементов
// выступают ключи свойств объекта user)
const array = Object.keys(user);
console.log("array =", array);
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
С помощью использования эмодзи в коде можно уникально стилизовать список, воспользовавшись attr функцией для установки индивидуального эмодзи для каждого пункта списка 🔥
Для этого пунктам списка задаем класс (в нашем случае custom-marker), в котором значение свойства content равно селектору attr, принимающего свой атрибут (в нашем случае emoji) прописанный в пункте ℹ️
Псевдоэлемент ::marker напрямую не принимает атрибуты, поэтому в нем мы оставляем значение свойства content пустым, а уже в классе custom-marker указываем свойствo content со значением атрибута emoji 👁🗨
Код из гиф:
Для этого пунктам списка задаем класс (в нашем случае custom-marker), в котором значение свойства content равно селектору attr, принимающего свой атрибут (в нашем случае emoji) прописанный в пункте ℹ️
Псевдоэлемент ::marker напрямую не принимает атрибуты, поэтому в нем мы оставляем значение свойства content пустым, а уже в классе custom-marker указываем свойствo content со значением атрибута emoji 👁🗨
Код из гиф:
// ✦ index.js
<div className="main">
<ol>
<li className="custom-marker" emoji="🔥 ">Первый пункт</li>
<li className="custom-marker" emoji="💎 ">Второй пункт</li>
<li className="custom-marker" emoji="⚡️ ">Третий пункт</li>
</ol>
</div>
// ✦ index.css
.main {
font-size: 12px;
font-weight: 600;
}
.main ::marker {
content: "";
}
.main .custom-marker::before {
content: attr(emoji);
font-size: 16px;
}
👍4🔥2
Благодаря методу pop мы можем удалить последний элемент массива 🔫
Но если мы объявим новую переменную, которая будет равна применению метода pop к массиву с элементами мы можем получить противоположный по сути эффект. То есть последний элемент наоборот будет сохранен, а все остальные элементы будут удалены ↔️
Но, на самом деле, в то же время метод все таки будет применен для массива с элементами. То есть последний элемент все таки будет удален с массива, но одновременно он будет присвоен новой переменной 👁🗨
Код со скрина:
Но если мы объявим новую переменную, которая будет равна применению метода pop к массиву с элементами мы можем получить противоположный по сути эффект. То есть последний элемент наоборот будет сохранен, а все остальные элементы будут удалены ↔️
Но, на самом деле, в то же время метод все таки будет применен для массива с элементами. То есть последний элемент все таки будет удален с массива, но одновременно он будет присвоен новой переменной 👁🗨
Код со скрина:
// ✦ Удаление последнего элемента массива
let array = ['green', 'blue', 'red'];
array.pop();
console.log("Массив array после применения метода pop:", array)
// ✦ Присвоение последнего элемента массива в переменную
let numbers = [1, 2, 3];
let deleted_num = numbers.pop();
console.log("numbers =", numbers)
console.log("deleted_num =", deleted_num)
🔥8
С помощью метода Object.assign мы можем продублировать свойства одного объекта в другой без необходимости объявления дополнительного объекта (для сложения двух объектов или применения Spread оператора для развертывания) 👯♀️
Метод применяется просто: первым значением в скобках выступает объект, в который мы хотим добавить свойства из второго объекта. Вторым значением выступает объект, свойства из которого мы хотим добавить *️⃣
В результате первый объект (в который мы копировали свойства с другого объекта) помимо своих свойств теперь будет иметь и свойства второго объекта. Второй же объект останется без изменений 👁🗨
Код со скрина:
Метод применяется просто: первым значением в скобках выступает объект, в который мы хотим добавить свойства из второго объекта. Вторым значением выступает объект, свойства из которого мы хотим добавить *️⃣
В результате первый объект (в который мы копировали свойства с другого объекта) помимо своих свойств теперь будет иметь и свойства второго объекта. Второй же объект останется без изменений 👁🗨
Код со скрина:
const obj1 = { name: "Brandon", age: 26 };
const obj2 = { role: "distributor" }
Object.assign(obj1, obj2);
console.log(obj1);👍7
This media is not supported in your browser
VIEW IN TELEGRAM
В этом видео я показал как сделать поле ввода для регистрации и авторизации как у Google 🔍
Ключевые моменты:
➖ надпись поля ввода (labelline) меняет свое расположение, размер и цвет при нажатии на поле ввода
➖ у неё есть белый фон, благодаря чему при наезде на границу/обводку поля ввода она перекрывает часть линии
➖ сама обводка поля ввода меняет лишь толщину и цвет, а также высоту (height) и ширину (width) лишь на 2 пикселя, благодаря чему создается впечатление что обводка при нажатии на поле ввода "жирнеет" внутрь
Классы для анимации надписи поля ввода (больше кода не помещается в пост):
Ключевые моменты:
➖ надпись поля ввода (labelline) меняет свое расположение, размер и цвет при нажатии на поле ввода
➖ у неё есть белый фон, благодаря чему при наезде на границу/обводку поля ввода она перекрывает часть линии
➖ сама обводка поля ввода меняет лишь толщину и цвет, а также высоту (height) и ширину (width) лишь на 2 пикселя, благодаря чему создается впечатление что обводка при нажатии на поле ввода "жирнеет" внутрь
Классы для анимации надписи поля ввода (больше кода не помещается в пост):
.labelline {
position: absolute;
font-size: 2em;
padding: 0 25px;
margin: 0 12px;
background-color: white;
transition: 0.2s ease;
}
input:focus,
input:valid {
border: 3px solid blue;
height: 78px;
width: 498px;
}
input:focus + .labelline,
input:valid + .labelline{
color: blue;
height: 30px;
line-height: 30px;
padding: 0 10px;
transform: translate(-15px, -16px) scale(0.83);
z-index: 1111;
}🔥6👍3❤1