<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Ihor Zakatsiura - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/ukrainian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Ihor Zakatsiura - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/ukrainian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 09 Jun 2026 04:19:15 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/ukrainian/news/author/ihor/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Git Revert Commit: як скасувати останній коміт ]]>
                </title>
                <description>
                    <![CDATA[ Скажімо, ви працюєте над своїм кодом у Git і щось пішло не за планом. Тож тепер вам потрібно скасувати свій останній коміт. Але як це зробити? Давайте дізнаємось! Існує два можливі способи скасувати ваш останній коміт. У цій статті ми розглянемо їх обидва. Команда revert  Команда revert створить коміт, ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/git-revert-commit-yak-skasuvaty-ostanniy-komit/</link>
                <guid isPermaLink="false">649ee6996e2fa6066e7eebc7</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Wed, 05 Jul 2023 09:41:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/07/pexels-siegfried-poepperl-8778445--1-.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/git-revert-commit-how-to-undo-the-last-commit/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Revert Commit – How to Undo the Last Commit</a>
      </p><p>Скажімо, ви працюєте над своїм кодом у Git і щось пішло не за планом. Тож тепер вам потрібно скасувати свій останній коміт. Але як це зробити? Давайте дізнаємось!</p><p>Існує два можливі способи скасувати ваш останній коміт. У цій статті ми розглянемо їх обидва.</p><h2 id="-revert"><strong>Команда<strong> <code>revert</code> </strong></strong></h2><p>Команда <code>revert</code> створить коміт, який скасовує зміни цільового коміту. Ви можете використовувати її для скасування останнього коміту таким чином:</p><pre><code>git revert &lt;commit to revert&gt;</code></pre><p>Ви можете знайти назву коміту, який потрібно скасувати, за допомогою <code><a href="https://www.freecodecamp.org/news/git-log-command/">git log</a></code>. Перший виведений комміт і є останнім створеним комітом. Тоді ви можете скопіювати звідти буквено-цифрове ім’я та використати його в команді <code>revert</code> .</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/08/image-117.png" class="kg-image" alt="A diagram showing that the git revert command creates a new commit to revert previous changes." width="600" height="400" loading="lazy"><figcaption>На рисунку кожне коло представляє коміт.</figcaption></figure><h2 id="-reset"><strong>Команда <strong><code>reset</code> </strong></strong></h2><p>Ви також можете скористатися командою <code>reset</code>, щоб скасувати останній коміт. Але будьте обережні: це змінить історію комітів, тому вам варто використовувати її уважно. Вона перемістить HEAD, робочу гілку, до вказаного коміту та відкине все після:</p><pre><code>git reset --soft HEAD~1</code></pre><p>Параметр <code>--soft</code> означає, що ви не втратите незафіксовані зміни, які можете мати.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/08/git-reset-soft.png" class="kg-image" alt="A diagram showing that git reset --soft will change your commit history, but will keep any unstaged changes you have." width="600" height="400" loading="lazy"><figcaption>На рисунку кожне коло представляє коміт.</figcaption></figure><p>Якщо ви бажаєте відмінити останній комміт, а також видалити всі незафіксовані зміни, ви можете скористатися параметром <code>--hard</code> :</p><pre><code>git reset --hard HEAD~1</code></pre><p>Це скасує останній коміт, а також будь-які незафіксовані зміни.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/08/image-112.png" class="kg-image" alt="A diagram showing that git reset --hard will change your commit history, but will also remove any unstaged changes you have." width="600" height="400" loading="lazy"><figcaption>На рисунку кожне коло представляє коміт.</figcaption></figure><h2 id="-reset-revert"><strong>Що і коли краще використовувати:<strong> <code>reset</code> </strong>чи<strong> <code>revert</code>?</strong></strong></h2><p>Вам варто використовувати команду <code>reset</code> тільки у випадку, якщо коміт, який ви збираєтеся відмінити, існує лише локально. Ця команда змінює історію комітів і може перезаписати історію, від якої залежать віддалені учасники команди.</p><p>Команда <code>revert</code> натомість створює <em>новий коміт</em>, який скасовує зміни, тому якщо коміт, який потрібно відмінити, вже був відправлений в спільний репозиторій, краще використовувати <code>revert</code>, оскільки дана команда не перезаписує історію комітів.</p><h1 id="-"><strong>Підсумки</strong></h1><p>Ви дізналися про два способи скасування останнього коміту, а також про те, який спосіб краще використовувати у відповідних ситуаціях.</p><p>Тепер, якщо ви помітите, що останній коміт містить помилку або не повинен був бути зроблений, ви знаєте, як виправити це!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Посібник із фонових зображень React: як встановити фонове зображення за допомогою вбудованого стилю CSS ]]>
                </title>
                <description>
                    <![CDATA[ Існує чотири способи встановити властивість стилю backgroundImage за допомогою вбудованого CSS у React. Цей посібник покаже вам усі чотири методи зі зразками коду для кожного. Як встановити фонове зображення в React за допомогою зовнішньої URL-адреси Якщо ваше зображення знаходиться десь в інтернеті, ви можете встановити фонове зображення свого елемента, розмістивши ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/posibnyk-iz-fonovykh-zobrazhen-react-yak-vstanovyty-fonove-zobrazhennya-za-dopomohoyu-vbudovanoho-stylyu-css/</link>
                <guid isPermaLink="false">642d2575d5889e064f8f1763</guid>
                
                    <category>
                        <![CDATA[ react ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Thu, 06 Apr 2023 08:46:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/04/fcc-bg-image-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/react-background-image-tutorial-how-to-set-backgroundimage-with-inline-css-style/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Background Image Tutorial – How to Set backgroundImage with Inline CSS Style</a>
      </p><p>Існує чотири способи встановити властивість стилю <code>backgroundImage</code> за допомогою вбудованого CSS у React.</p><p>Цей посібник покаже вам усі чотири методи зі зразками коду для кожного.</p><h2 id="-react-url-"><strong>Як встановити фонове зображення в React за допомогою зовнішньої URL-адреси</strong></h2><p>Якщо ваше зображення знаходиться десь в інтернеті, ви можете встановити фонове зображення свого елемента, розмістивши URL-адресу таким чином:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">function App() {
  return (
    &lt;div style={{ 
      backgroundImage: `url("https://via.placeholder.com/500")` 
    }}&gt;
      Hello World
    &lt;/div&gt;
  );
}</code></pre><figcaption>Встановлення фонового зображення за допомогою зовнішньої URL-адреси</figcaption></figure><p>Наведений вище код відтворить єдиний елемент <code>&lt;div&gt;</code> із застосованим до нього стилем <code>background-image: url(<a href="https://via.placeholder.com/500">https://via.placeholder.com/500</a>)</code>.</p><h2 id="-react-src"><strong>Як встановити фонове зображення в React з вашої папки /src</strong></h2><p>Якщо ви завантажуєте свою програму за допомогою Create React App і маєте своє зображення в папці <code>src/</code>, ви можете спочатку виконати <code>import</code> зображення, а потім розмістити його як фон свого елемента:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">import React from "react";
import background from "./img/placeholder.png";

function App() {
  return (
    &lt;div style={{ backgroundImage: `url(${background})` }}&gt;
      Hello World
    &lt;/div&gt;
  );
}

export default App;</code></pre><figcaption>Встановлення фонового зображення за допомогою імпортованого зображення</figcaption></figure><p>Коли ви виконаєте команду <code>npm start</code>, React покаже помилку «Failed to Compile» і зупинить збірку, якщо зображення не знайдено:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/React-failed-to-compile-image.png" class="kg-image" alt="React-failed-to-compile-image" width="600" height="400" loading="lazy"><figcaption>Помилка збірки. Зображення не знайдено.</figcaption></figure><p>Таким чином ви не відображатимете пошкоджені посилання на зображення у своєму вебзастосунку. У наведеному вище коді значення <code>backgroundImage</code> встановлюється за допомогою рядка шаблону, що дозволяє вставляти вирази JavaScript.</p><h2 id="-react-url--1"><strong>Як встановити фонове зображення в React за допомогою методу відносної URL-адреси</strong></h2><p>Папку <code>public/</code> можна використовувати для додавання статичних ресурсів до програми React. Будь-які файли, які ви поміщаєте в папку, будуть доступними в інтернеті.</p><p>Якщо ви помістите файл <code>image.png</code> у папку <code>public/</code>, ви зможете отримати доступ до нього за адресою <code>&lt;your host address&gt;/image.png</code>. Під час запуску React на локальному комп’ютері зображення має бути за адресою <code>http://localhost:3000/image.png</code>.</p><p>Потім ви можете призначити URL-адресу відносно адреси хосту, щоб встановити фонове зображення. Ось приклад:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">&lt;div style={{ backgroundImage: "url(/image.png)" }}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Встановлення фонового зображення за допомогою відносної URL-адреси</figcaption></figure><p>Встановивши URL-шлях до <code>/image.png</code> як у прикладі вище, вебпереглядач шукатиме фонове зображення за <code>&lt;your host address&gt;/image.png</code>.</p><p>Ви також можете створити іншу папку всередині <code>public/</code>, якщо хочете впорядкувати зображення в папки. Наприклад:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/Screen-Shot-2020-12-14-at-20.18.30.png" class="kg-image" alt="Screen-Shot-2020-12-14-at-20.18.30" width="600" height="400" loading="lazy"><figcaption>Створення папки img/ всередині папки public/</figcaption></figure><p>Не забудьте змінити значення <code>backgroundImage</code> на <code>url(/img/image.png)</code>, якщо вирішите створити папку.</p><h2 id="-react-url--2"><strong>Як встановити фонове зображення в React за допомогою методу абсолютної URL-адреси</strong></h2><p>Ви також можете включити абсолютну URL-адресу, використовуючи змінну середовища <code>PUBLIC_URL</code> у Create React App, ось так:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">&lt;div style={{ 
  backgroundImage: `url(${process.env.PUBLIC_URL + '/image.png'})` 
}}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Встановлення фонового зображення за допомогою абсолютної URL-адреси</figcaption></figure><p>Коли ви запустите це на своєму локальному комп’ютері, сценарії React оброблятимуть значення <code>PUBLIC_URL</code>. Коли ви запускаєте його локально, він виглядатиме як відносна URL-адреса, а не як абсолютна URL-адреса:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/absolute-url-background-image-1.png" class="kg-image" alt="absolute-url-background-image-1" width="600" height="400" loading="lazy"><figcaption>Абсолютна URL-адреса зображення не відображається на локальному комп’ютері</figcaption></figure><p>Абсолютну URL-адресу можна буде побачити лише під час розгортання React у робочій програмі пізніше.</p><h2 id="-"><strong>Як встановити фонове зображення з додатковими властивостями</strong></h2><p>Якщо ви хочете додатково налаштувати фонове зображення, це можна зробити, додавши додаткові властивості після <code>backgroundImage</code>. Ось приклад:</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">
&lt;div style={{ 
  backgroundImage: `url(${process.env.PUBLIC_URL + '/image.png'})`,
  backgroundRepeat: 'no-repeat',
  width:'250px' 
}}&gt;
  Hello World
&lt;/div&gt;</code></pre><figcaption>Встановлення фонового зображення з додатковими властивостями</figcaption></figure><p>Встановлені вище властивості додаватимуть властивості <code>background-repeat: no-repeat</code> та <code>width: 250px</code> разом із <code>background-image</code> до елементу <code>&lt;div&gt;</code>.</p><p>Дякую, що прочитали, і сподіваюся, ця стаття була для вас корисною. Якщо у вас є запитання, ви можете знайти мене в <a href="https://twitter.com/nsebhastian">твіттері</a>. Час від часу я також буду ділитися деякими короткими порадами для розробників. 🙂</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Посібник React: як працювати з кількома прапорцями ]]>
                </title>
                <description>
                    <![CDATA[ Робота з кількома прапорцями в React повністю відрізняється від того, як ви використовуєте звичайні прапорці HTML. Тому в цьому посібнику ми побачимо, як працювати з кількома прапорцями в React. Ви дізнаєтесь:  * як використовувати прапорець як контрольований компонент у React  * як використовувати методи масиву map та reduce ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/posibnyk-react-yak-pratsyuvaty-z-kilkoma-praportsyamy/</link>
                <guid isPermaLink="false">641c1acb35fefee8cac04469</guid>
                
                    <category>
                        <![CDATA[ react ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Wed, 29 Mar 2023 08:17:45 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/03/checkbox_selection.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/how-to-work-with-multiple-checkboxes-in-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Tutorial – How to Work with Multiple Checkboxes</a>
      </p><p>Робота з кількома прапорцями в React повністю відрізняється від того, як ви використовуєте звичайні прапорці HTML.</p><p>Тому в цьому посібнику ми побачимо, як працювати з кількома прапорцями в React.</p><p>Ви дізнаєтесь:</p><ul><li>як використовувати прапорець як контрольований компонент у React</li><li>як використовувати методи масиву map та reduce для складних обчислень </li><li>як створити масив певної довжини, попередньо заповнений певним значенням</li></ul><p>та багато іншого.</p><p>Ця стаття є частиною мого курсу <a href="https://master-redux.yogeshchavan.dev/">Mastering Redux</a>. Ось попередній <a href="https://www.youtube.com/watch?v=izSw74H08Bc">перегляд</a> програми, яку ми будемо створювати на курсі.</p><p>Тож почнемо.</p><h2 id="-"><strong>Як працювати з одним прапорцем</strong></h2><p>Давайте почнемо з функціональності одного прапорця, перш ніж переходити до кількох.</p><p>У цій статті я буду використовувати синтаксис React Hooks для створення компонентів. Отже, якщо ви не знайомі з хуками React, перегляньте мою статтю «<a href="https://levelup.gitconnected.com/an-introduction-to-react-hooks-50281fd961fe">Вступ до хуків Reac</a>t».</p><p>Подивіться на наведений нижче код:</p><pre><code class="language-js">&lt;div className="App"&gt;
  Select your pizza topping:
  &lt;div className="topping"&gt;
    &lt;input type="checkbox" id="topping" name="topping" value="Paneer" /&gt;Paneer
  &lt;/div&gt;
&lt;/div&gt;
</code></pre><p>Ось демоверсія на <a href="https://codesandbox.io/s/young-snow-lzplh?file=/src/App.js">Code Sandbox</a>.</p><p>У наведеному вище коді ми щойно оголосили один прапорець, який подібний до того, як ми оголошуємо прапорець HTML.</p><p>Тож ми можемо легко встановити та зняти прапорець, як показано нижче:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/05/check_uncheck-1.gif" class="kg-image" alt="check_uncheck-1" width="600" height="400" loading="lazy"></figure><p>Але щоб відобразити на екрані позначений прапорець чи ні, нам потрібно перетворити його на контрольований компонент.</p><p>У React контрольований компонент керується станом, тому вхідне значення можна змінити, лише змінивши стан, пов’язаний із цим введенням.</p><p>Подивіться на наведений нижче код:</p><pre><code class="language-js">export default function App() {
  const [isChecked, setIsChecked] = useState(false);

  const handleOnChange = () =&gt; {
    setIsChecked(!isChecked);
  };

  return (
    &lt;div className="App"&gt;
      Select your pizza topping:
      &lt;div className="topping"&gt;
        &lt;input
          type="checkbox"
          id="topping"
          name="topping"
          value="Paneer"
          checked={isChecked}
          onChange={handleOnChange}
        /&gt;
        Paneer
      &lt;/div&gt;
      &lt;div className="result"&gt;
        Above checkbox is {isChecked ? "checked" : "un-checked"}.
      &lt;/div&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>Ось демоверсія на <a href="https://codesandbox.io/s/dazzling-oskar-qcil8?file=/src/App.js">Code Sandbox</a>.</p><p>У наведеному вище коді ми оголосили стан <code>isChecked</code> у компоненті з початковим значенням <code>false</code> за допомогою хука <code>useState</code> :</p><pre><code class="language-js">const [isChecked, setIsChecked] = useState(false);
</code></pre><p>Потім для прапорця вводу ми встановили два додаткові параметри <code>checked</code> та <code>onChange</code> таким чином:</p><pre><code class="language-js">&lt;input
  ...
  checked={isChecked}
  onChange={handleOnChange}
/&gt;
</code></pre><p>Щоразу, коли ми натискаємо прапорець, буде викликана функція обробки <code>handleOnChange</code>, яку ми використовуємо для встановлення значення стану &nbsp;<code>isChecked</code>.</p><pre><code class="language-js">const handleOnChange = () =&gt; {
  setIsChecked(!isChecked);
};
</code></pre><p>Отже, якщо прапорець позначено, ми встановлюємо значення <code>isChecked</code> на <code>false</code>. Але якщо прапорець знятий, ми встановлюємо значення <code>true</code> за допомогою <code>!isChecked</code>. Потім ми передаємо це значення в прапорець введення для перевіреного параметру <code>checked</code>.</p><p>Таким чином прапорець вводу стає контрольованим компонентом, значенням якого керує стан.</p><p>Зверніть увагу, що в React завжди рекомендується використовувати контрольовані компоненти для полів введення, навіть якщо код виглядає складним. Це гарантує, що зміна вхідних даних відбувається лише всередині обробника <code>onChange</code>.</p><p>Стан введення не буде змінено будь-яким іншим способом, і ви завжди отримуватимете правильне й оновлене значення стану введення.</p><p>Лише в рідкісних випадках ви можете використовувати React ref для неконтрольованого використання компоненту.</p><h2 id="--1"><strong>Як обробляти кілька прапорців</strong></h2><p>Тепер давайте розглянемо, як ви будете обробляти кілька прапорців.</p><p>Подивіться на приклад у <a href="https://codesandbox.io/s/mystifying-tu-xlpgb?file=/src/App.js">Code Sandbox</a>.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/05/multiple_checkboxes-2.png" class="kg-image" alt="multiple_checkboxes-2" width="600" height="400" loading="lazy"></figure><p>Тут ми показуємо список топінгів і відповідну ціну. Виходячи з того, які топінги вибрано, нам потрібно відобразити загальну суму.</p><p>Раніше з одним прапорцем ми мали лише стан <code>isChecked</code>, і ми змінювали стан прапорця на основі цього.</p><p>Але тепер у нас багато прапорців, тому додавати кілька викликів <code>useState</code> для кожного прапорця непрактично.</p><p>Отже, давайте оголосимо масив у стані, що вказує стан кожного прапорця.</p><p>Щоб створити масив, довжина якого дорівнює кількості прапорців, ми можемо використати метод <code>fill</code>:</p><pre><code class="language-js">const [checkedState, setCheckedState] = useState(
    new Array(toppings.length).fill(false)
);
</code></pre><p>Тут ми оголосили стан із початковим значенням у вигляді масиву, заповненого значенням <code>false</code>.</p><p>Отже, якщо ми маємо 5 топінгів, масив станів <code>checkedState</code> міститиме 5 значень <code>false</code>, як наведено нижче:</p><pre><code class="language-js">[false, false, false, false, false]
</code></pre><p>І як тільки ми поставимо/знімемо прапорець, ми змінимо відповідний стан &nbsp;<code>false</code> на <code>true</code> або <code>true</code> на <code>false</code>.</p><p>Тут наведено остаточний код на <a href="https://codesandbox.io/s/wild-silence-b8k2j?file=/src/App.js">Code Sandbox</a>.</p><p>Повний код <code>App.js</code> виглядає так:</p><pre><code class="language-js">import { useState } from "react";
import { toppings } from "./utils/toppings";
import "./styles.css";

const getFormattedPrice = (price) =&gt; `$${price.toFixed(2)}`;

export default function App() {
  const [checkedState, setCheckedState] = useState(
    new Array(toppings.length).fill(false)
  );

  const [total, setTotal] = useState(0);

  const handleOnChange = (position) =&gt; {
    const updatedCheckedState = checkedState.map((item, index) =&gt;
      index === position ? !item : item
    );

    setCheckedState(updatedCheckedState);

    const totalPrice = updatedCheckedState.reduce(
      (sum, currentState, index) =&gt; {
        if (currentState === true) {
          return sum + toppings[index].price;
        }
        return sum;
      },
      0
    );

    setTotal(totalPrice);
  };

  return (
    &lt;div className="App"&gt;
      &lt;h3&gt;Select Toppings&lt;/h3&gt;
      &lt;ul className="toppings-list"&gt;
        {toppings.map(({ name, price }, index) =&gt; {
          return (
            &lt;li key={index}&gt;
              &lt;div className="toppings-list-item"&gt;
                &lt;div className="left-section"&gt;
                  &lt;input
                    type="checkbox"
                    id={`custom-checkbox-${index}`}
                    name={name}
                    value={name}
                    checked={checkedState[index]}
                    onChange={() =&gt; handleOnChange(index)}
                  /&gt;
                  &lt;label htmlFor={`custom-checkbox-${index}`}&gt;{name}&lt;/label&gt;
                &lt;/div&gt;
                &lt;div className="right-section"&gt;{getFormattedPrice(price)}&lt;/div&gt;
              &lt;/div&gt;
            &lt;/li&gt;
          );
        })}
        &lt;li&gt;
          &lt;div className="toppings-list-item"&gt;
            &lt;div className="left-section"&gt;Total:&lt;/div&gt;
            &lt;div className="right-section"&gt;{getFormattedPrice(total)}&lt;/div&gt;
          &lt;/div&gt;
        &lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>Давайте розберемося, що ми тут робимо.</p><p>Ми оголосили прапорець вводу, як показано нижче:</p><pre><code class="language-js">&lt;input
  type="checkbox"
  id={`custom-checkbox-${index}`}
  name={name}
  value={name}
  checked={checkedState[index]}
  onChange={() =&gt; handleOnChange(index)}
/&gt;
</code></pre><p>Тут ми додали атрибут <code>checked</code> із відповідним значенням <code>true</code> або <code>false</code> зі стану <code>checkedState</code>. Отже, кожен прапорець матиме правильне значення свого позначеного стану.</p><p>Ми також додали обробник <code>onChange</code> і передаємо <code>index</code> прапорця, який позначено/знято, до методу <code>handleOnChange</code>.</p><p>Обробник методу <code>handleOnChange</code> має наступний вигляд:</p><pre><code class="language-js">const handleOnChange = (position) =&gt; {
  const updatedCheckedState = checkedState.map((item, index) =&gt;
    index === position ? !item : item
  );

  setCheckedState(updatedCheckedState);

  const totalPrice = updatedCheckedState.reduce(
    (sum, currentState, index) =&gt; {
      if (currentState === true) {
        return sum + toppings[index].price;
      }
      return sum;
    },
    0
  );

  setTotal(totalPrice);
};
</code></pre><p>Тут ми спочатку спочатку проходимось по масиву <code>checkedState</code>, використовуючи метод масивів <code>map</code>. Якщо значення переданого параметра <code>position</code> збігається з поточним індексом, ми змінюємо його значення. Потім, якщо значення є <code>true</code>, воно буде перетворено на <code>false</code> за допомогою <code>!item</code>, а якщо значення <code>false</code> — воно буде перетворено на <code>true</code>.</p><p>Якщо <code>index</code> не збігається з наданим параметром <code>position</code>, ми не змінюємо його значення, а просто повертаємо значення, яким воно є.</p><pre><code class="language-js">const updatedCheckedState = checkedState.map((item, index) =&gt;
  index === position ? !item : item
);

// the above code is the same as the below code

const updatedCheckedState = checkedState.map((item, index) =&gt; {
  if (index === position) {
    return !item;
  } else {
    return item;
  }
});
</code></pre><p>Я використовував тернарний оператор <code>?:</code>, оскільки він робить код коротшим, але ви можете використовувати будь-який метод масиву.</p><p>Якщо ви не знайомі з тим, як працюють такі методи масиву, як <code>map</code> чи <code>reduce</code>, то перегляньте <a href="https://www.freecodecamp.org/news/complete-introduction-to-the-most-useful-javascript-array-methods/">цю статтю</a>, яку я написав.</p><p>Далі ми встановлюємо масив <code>checkedState</code> до оновленого масиву <code>updatedCheckedState</code>. Це важливо, тому що якщо ви не оновите стан <code>checkedState</code> в обробнику <code>handleOnChange</code>, ви не зможете встановити або зняти прапорець.</p><p>Це пояснюється тим, що ми використовуємо значення <code>checkedState</code> для прапорця, щоб визначити, чи позначено прапорець чи ні (оскільки це контрольований компонент, як показано нижче):</p><pre><code class="language-js">&lt;input
  type="checkbox"
  ...
  checked={checkedState[index]}
  onChange={() =&gt; handleOnChange(index)}
/&gt;
</code></pre><p>Зауважте, що ми створили окрему змінну <code>updatedCheckedState</code> і передаємо цю змінну функції <code>setCheckedState</code>. Ми використовуємо метод <code>reduce</code> для <code>updatedCheckedState</code>, а не для вихідного масиву <code>checkedState</code>.</p><p>Причина в тому, що за замовчуванням функція <code>setCheckedState</code>, яка використовується для оновлення стану, є асинхронною.</p><p>Виклик функції <code>setCheckedState</code> не гарантує, що ви отримаєте оновлене значення масиву <code>checkedState</code> у наступному рядку.</p><p>Тож ми створили окрему змінну та використали її в методі <code>reduce</code>.</p><p>Ви можете прочитати <a href="https://www.freecodecamp.org/news/what-is-state-in-react-explained-with-examples/">цю статтю</a>, якщо ви не знайомі з тим, як<em> </em>стан працює в React.</p><p>Потім, щоб обчислити загальну суму, ми використовуємо метод масиву <code>reduce</code>:</p><pre><code class="language-js">const totalPrice = updatedCheckedState.reduce(
  (sum, currentState, index) =&gt; {
    if (currentState === true) {
      return sum + toppings[index].price;
    }
    return sum;
  },
  0
);
</code></pre><p>Метод масиву <code>reduce</code> отримує чотири параметри, з яких ми використовуємо лише три: <code>sum</code>, <code>currentState</code> та <code>index</code>. Ви можете використовувати інші назви, якщо хочете, оскільки це лише параметри.</p><p>Ми також передаємо <code>0</code> як початкове значення, яке також відоме як значення <code>accumulator</code> для параметру <code>sum</code>.</p><p>Потім у функції reduce ми перевіряємо, чи поточне значення масиву <code>checkedState</code> дійсно <code>true</code>.</p><p>Якщо значення <code>true</code>, це означає, що прапорець позначено, тому ми додаємо значення відповідного <code>price</code> за допомогою <code>sum + toppings[index].price</code>.</p><p>Якщо значення масиву <code>checkedState</code> є <code>false</code>, ми не додаємо його ціну, а просто повертаємо розраховане попереднє значення <code>sum</code>.</p><p>Потім ми встановлюємо значення <code>totalPrice</code> до стану <code>total</code> за допомогою <code>setTotal(totalPrice)</code></p><p>Таким чином ми можемо правильно розрахувати загальну суму для обраних топінгів, як ви бачите нижче.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/05/toppings-1.gif" class="kg-image" alt="toppings-1" width="600" height="400" loading="lazy"></figure><p>Ось <a href="https://b8k2j.csb.app/">посилання</a> на попередній перегляд наведеного вище прикладу на Code Sandbox, щоб спробувати самостійно.</p><h3 id="--2">Дякую, що прочитали!</h3><p>Більшості розробників важко зрозуміти, як працює Redux. Але кожен розробник React повинен знати, як працювати з Redux, оскільки промислові проєкти здебільшого використовують Redux для керування більшими проєктами.</p><p>Тому, щоб вам було легше, я запустив курс <a href="https://master-redux.yogeshchavan.dev/">Mastering Redux</a>.</p><p>У цьому курсі ви вивчите Redux з самого початку, а також створите <a href="https://www.youtube.com/watch?v=izSw74H08Bc">повноцінний застосунок</a> для замовлення їжі з нуля за допомогою Redux.</p><p>Приєднуйтесь до курсу та отримуйте обмежену пропозицію знижки, а також мою популярну книгу «Опанування сучасного JavaScript» безкоштовно.</p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/myogeshchavan97/98ae4f4ead57fde8d47fcf7641220b72/raw/c3e4265df4396d639a7938a83bffd570130483b1/banner.jpg" class="kg-image" alt="banner" width="600" height="400" loading="lazy"></figure><p><strong>Хочете бути в курсі регулярного контенту по JavaScript, React, Node.js? Слідкуйте за мною в <a href="https://www.linkedin.com/in/yogesh-chavan97/">LinkedIn</a>.</strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Як читати файл JSON у JavaScript: читання JSON у JS ]]>
                </title>
                <description>
                    <![CDATA[ Під час отримання даних із зовнішніх джерел або серверів потрібно переконатися, що дані, які повертаються, мають формат JSON. Тоді ви можете використовувати їх у своїй програмі. У деяких ситуаціях, працюючи локально або під час завантаження файлів даних на сервер, ми можемо забажати прочитати ці дані JSON із файлу. Ми дізнаємося, ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/yak-chytaty-fayl-json-u-javascript-chytannya-json-u-js/</link>
                <guid isPermaLink="false">6402089fd125780651a3bbad</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Fri, 10 Mar 2023 03:11:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/03/cover-template--5-.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/how-to-read-json-file-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Read a JSON File in JavaScript – Reading JSON in JS</a>
      </p><p>Під час отримання даних із зовнішніх джерел або серверів потрібно переконатися, що дані, які повертаються, мають формат JSON. Тоді ви можете використовувати їх у своїй програмі.</p><p>У деяких ситуаціях, працюючи локально або під час завантаження файлів даних на сервер, ми можемо забажати прочитати ці дані JSON із файлу.</p><p>Ми дізнаємося, як це зробити в цьому посібнику.</p><h2 id="-json-javascript-fetch-api"><strong>Як читати файл JSON у JavaScript за допомогою Fetch API</strong></h2><p>Одним із стандартних методів, який ми можемо використовувати для читання файлу JSON (локального файлу, або файлу, завантаженого на сервер), є Fetch API. Він використовує однаковий синтаксис для обох випадків. Єдиною відмінністю буде URL-адреса.</p><p>Наприклад, припустімо, що у папці нашого проєкту є локальний файл під назвою <code>data.json</code>, який містить такі дані JSON:</p><pre><code class="language-json">&lt;!--./data.JSON--&gt;

{
    "id": 1,
    "title": "Hello World",
    "completed": false
}
</code></pre><p>Тепер ми можемо прочитати цей файл у JavaScript за допомогою методу Fetch API:</p><pre><code class="language-js">&lt;!--./index.js--&gt;

fetch('./data.json')
    .then((response) =&gt; response.json())
    .then((json) =&gt; console.log(json));
</code></pre><p>У наведеному вище прикладі ми змогли прочитати локальний файл JSON. Але, на жаль, коли ми запускаємо це в браузері, ми можемо отримати таку помилку CORS (<em>укр. </em>спільне використання ресурсів різними джерелами), оскільки наш файл не знаходиться на сервері:</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image.png" class="kg-image" alt="s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image" width="600" height="400" loading="lazy"></figure><p>Щоб виправити це, ми переконаємося, що наш файл JSON знаходиться на локальному або віддаленому сервері. Якщо ми використовуємо Live-сервер у нашій IDE, все буде нормально. Але коли ми безпосередньо завантажуємо наш файл, ми отримуємо цю помилку.</p><p>І як я вже говорив раніше, припустімо, що у нас є файл JSON на віддаленому сервері, і ми намагаємося прочитати цей файл у JavaScript. Той самий синтаксис буде працювати:</p><pre><code class="language-js">&lt;!--./index.js--&gt;

fetch('https://server.com/data.json')
    .then((response) =&gt; response.json())
    .then((json) =&gt; console.log(json));
</code></pre><p>Fetch API є кращим методом для використання, коли ми хочемо прочитати файл JSON із зовнішнього сервера або локального файлу в наш файл JavaScript.</p><h2 id="-json-javascript-import"><strong>Як прочитати файл JSON у JavaScript за допомогою оператора import</strong></h2><p>Інший метод, який ми можемо використати окрім створення запиту HTTP, є оператор import. Цей метод має кілька ускладнень, але ми розглянемо їх.</p><p>Як і в попередньому розділі, припустімо, що у нас є файл JSON, який містить дані користувача (наприклад, <code>user.json</code>):</p><pre><code class="language-json">&lt;!--./user.JSON--&gt;

{
    "id": 1,
    "name": "John Doe",
    "age": 12
}
</code></pre><p>Ми можемо прочитати ці дані JSON у JavaScript за допомогою оператора імпорту таким чином:</p><pre><code class="language-js">&lt;!---./index.js--&gt;

import data from './data.json';
console.log(data);
</code></pre><p>На жаль, це викличе помилку, що ми не можемо використовувати оператор <code>import</code> поза модулем. Це стандартна помилка, коли ми намагаємося використати оператор <code>import</code> у звичайному файлі JavaScript, особливо для розробників, які не знайомі з JavaScript.</p><p>Щоб виправити це, ми можемо додати тег script <code>type="module"</code> в наш файл HTML, де ми посилалися на файл JavaScript, наприклад:</p><pre><code class="language-html">&lt;html lang="en"&gt;
    // ...
    &lt;body&gt;
        &lt;script type="module" src="./index.js"&gt;&lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Коли ми це зробимо, ми все одно отримаємо іншу помилку:</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659465574774_image.png" class="kg-image" alt="s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659465574774_image" width="600" height="400" loading="lazy"></figure><p>Щоб виправити вже цю помилку, нам потрібно додати тип файлу JSON до оператора <code>import</code>, і тоді ми зможемо прочитати наш файл JSON у JavaScript:</p><pre><code class="language-undefined">import data from './data.json' assert { type: 'JSON' };
console.log(data);
</code></pre><p>Це ідеально працює, якщо ми запускаємо наші файли на локальному або віддаленому сервері. Але припустімо, що ми запускаємо це локально — тоді ми отримаємо помилку CORS.</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image.png" class="kg-image" alt="s_9630F87AB23B79DCD31DCDD0E14D2C6C4A3007934D2E561803A41CF5C1FE0085_1659464623693_image" width="600" height="400" loading="lazy"></figure><h2 id="-"><strong>Підбиваючи підсумки</strong></h2><p>У цій статті ми дізналися, як читати файл JSON у JavaScript і можливі помилки, з якими ми можемо зіткнутися під час використання кожного методу.</p><p>Найкраще використовувати метод fetch API, коли ви хочете зробити запит HTTP. Наприклад, припустімо, що ми отримуємо дані з фальшивого файлу JSON, який ми зрештою витягнемо з API.</p><p>Тим не менш, у ситуації, коли нам не потрібно використовувати запит HTTP, ми можемо використати оператор <code>import</code>. Ми можемо використовувати &nbsp;<code>import</code>, коли використовуємо такі бібліотеки, як React та Vue, які мають відношення до модулів. Це означає, що нам не потрібно буде додавати тип модуля, а також нам не потрібно буде додавати тип файлу.</p><p>Жоден із цих методів не потребує встановлення пакету чи використання бібліотеки, оскільки вони є вбудованими. Вибирати, який метод використовувати, повністю залежить від вас.</p><p>Але коротка порада, яка відрізняє ці методи, полягає в тому, що Fetch API зчитує файл JSON у JavaScript, надсилаючи запит HTTP, тоді як оператор <code>import</code> не потребує жодного запиту HTTP, а працює як будь-який інший імпорт, який ми виконуємо.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Як використовувати localStorage з хуками React для встановлення та отримання елементів ]]>
                </title>
                <description>
                    <![CDATA[ localStorage — це об’єкт вебсховища, який дозволяє сайтам і програмам JavaScript зберігати пари ключ-значення у веббраузері безстроково. Це означає, що дані зберігаються після оновлення сторінки (sessionStorage) і навіть перезапуску браузера. Це вказує на те, що дані, які зберігаються в браузері, залишаться, навіть якщо вікно браузера закрито. В загальному, localStorage дозволяє ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/yak-vykorystovuvaty-localstorage-z-khukamy-react-dlya-vstanovlennya-ta-otrymannya-elementiv/</link>
                <guid isPermaLink="false">63f88809d125780651a3b57c</guid>
                
                    <category>
                        <![CDATA[ react ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Wed, 08 Mar 2023 03:39:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/03/Yellow-and-Purple-Geometric-Covid-19-General-Facts-Twitter-Post.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/how-to-use-localstorage-with-react-hooks-to-set-and-get-items/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use localStorage with React Hooks to Set and Get Items</a>
      </p><p>localStorage — це об’єкт вебсховища, який дозволяє сайтам і програмам JavaScript зберігати пари ключ-значення у веббраузері безстроково.</p><p>Це означає, що дані зберігаються після оновлення сторінки (sessionStorage) і навіть перезапуску браузера. Це вказує на те, що дані, які зберігаються в браузері, залишаться, навіть якщо вікно браузера закрито.</p><p>В загальному, localStorage дозволяє розробникам зберігати дані в браузері та отримувати їх.</p><p>Однак важливо розуміти, що використання localStorage як бази даних для вашого проєкту не є хорошою практикою, оскільки дані будуть втрачені, коли користувач, наприклад, очистить кеш.</p><p>Розробники часто використовують localStorage для додавання функції нічного режиму до програми, збереження елементу списку справ або збереження введених користувачем значень форми.</p><p>У цій публікації ми розглянемо, як використовувати localStorage з хуками React, щоб легко встановлювати та отримувати елементи.</p><h2 id="-react"><strong>Що таке хуки React?</strong></h2><p>Хуки React — це функції JavaScript, які ви можете імпортувати з пакету React, щоб додати можливостей своїм компонентам.</p><p>Хуки дозволяють React-розробникам використовувати методи стану та життєвого циклу у функціональних компонентах. Вони також працюють з існуючим кодом, завдяки чому їх легко адаптувати до кодової бази.</p><p>Щоб використовувати localStorage з React нам знадобляться два хука:</p><ul><li><code>useState()</code> — хук стану вашого компоненту, який гарантовано зміниться через деякий час. Хук <code>useState()</code> — це функція, яка приймає один параметр, початковий стан (який може бути значенням змінної, об’єкта або будь-якого іншого типу даних у вашому компоненті), і повертає два значення: поточний стан і функцію, яку можна використовувати для оновлення стану.<br></li><li><code>useEffect()</code> — хук ефекту, активується за замовчуванням після першого відтворення та кожного разу, коли змінюється стан. Як випливає з назви, він використовується для виконання ефекту кожного разу, коли змінюється стан. Цей хук чудово підходить для налаштування слухачів, отримання даних з API та видалення слухачів перед видаленням компоненту з DOM.</li></ul><h2 id="-localstorage-react"><strong>Як реалізувати localStorage у React</strong></h2><p>localStorage надає нам доступ до об’єкту, що зберігає браузер, за допомогою п’яти методів:</p><ul><li><code>setItem()</code>: цей метод використовується для додавання ключа та значення до localStorage;</li><li><code>getItem()</code>: цей метод використовується для отримання елемента з localStorage за допомогою ключа;</li><li><code>removeItem()</code>: ця техніка використовується для видалення елемента з localStorage на основі його ключа;</li><li><code>clear()</code>: ця техніка використовується для видалення всіх елементів з localStorage;</li><li><code>key()</code>: коли ви вказуєте номер, це допомагає отримати ключ localStorage.</li></ul><p>У цій публікації ми розглянемо лише найпопулярніші методи, а саме перші два.</p><h3 id="-setitem-"><strong>Як використовувати метод <strong> <code>setItem()</code></strong></strong></h3><p>Надаючи значення ключу, цей метод використовується для зберігання об’єктів у localStorage. Це значення може мати будь-який тип даних, включно з текстом, цілим числом, об’єктом, масивом тощо.</p><p>Важливо пам’ятати, що для того, щоб зберігати дані в localStorage, ви повинні спочатку зв’язати їх за допомогою <code>JSON.stringify()</code> функції.</p><pre><code class="language-react">const [items, setItems] = useState([]);

useEffect(() =&gt; {
  localStorage.setItem('items', JSON.stringify(items));
}, [items]);</code></pre><p>У наведеному вище коді ми спочатку створили стан і призначили йому порожній масив (у вас може бути будь-який інший тип даних). Потім ми використали <code>useEffect()</code>, щоб додавати об’єкти до localStorage кожного разу, коли змінюється значення нашого стану. Ми зробили це, передавши стан як другий аргумент.</p><p>По суті, це основний код, який відповідає за додавання пар ключ-значення до localStorage:</p><pre><code class="language-react">localStorage.setItem('items', JSON.stringify(items));</code></pre><p>Простіше кажучи, попередній код називає ключ («items<em>»</em>), а потім призначає йому значення, але спочатку ми повинні були переконатися, що дані, які ми додаємо, є рядком JSON.</p><p>Ми використовуємо JSON.stringify() для перетворення об’єкта JSON у текст JSON, збережений у рядку, який потім можна передати на вебсервер.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://paper-attachments.dropbox.com/s_EAEEAE9063B0CA7CBC6574F36123E82B36B6C1EC3724A86DA7C0B4C67C2DD652_1645380076460_explaining+useeffect+local+storage.jpg" class="kg-image" alt="s_EAEEAE9063B0CA7CBC6574F36123E82B36B6C1EC3724A86DA7C0B4C67C2DD652_1645380076460_explaining+useeffect+local+storage" width="600" height="400" loading="lazy"><figcaption>Структура роботи хуків із локальним сховищем для встановлення елементів</figcaption></figure><h3 id="-getitem-"><strong>Як використовувати метод &nbsp;getItem()</strong></h3><p>Цей метод отримує об’єкти з localStorage. Існують інші методи, щоб досягти цього за допомогою React, але ми будемо використовувати хук <code>useEffect()</code>, тому що він найкращий.</p><p>Хук <code>useEffect()</code> допомагає нам отримати всі елементи під час першого рендерингу, тобто коли компонент встановлюється або повторно рендериться, він отримує всі наші дані з localStorage.</p><p>Зауважте, що саме тому ми передали порожній другий аргумент.</p><pre><code class="language-react">const [items, setItems] = useState([]);

useEffect(() =&gt; {
  const items = JSON.parse(localStorage.getItem('items'));
  if (items) {
   setItems(items);
  }
}, []);</code></pre><p>Важливо пам’ятати, що коли ми зберігали дані, ми спочатку перетворили їх на рядок JSON. Це означає, що для того, щоб ми могли використовувати його, нам потрібно перетворити рядок JSON назад на об’єкт JSON. Ми робимо це за допомогою методу <code>JSON.parse()</code>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://paper-attachments.dropbox.com/s_EAEEAE9063B0CA7CBC6574F36123E82B36B6C1EC3724A86DA7C0B4C67C2DD652_1645369611908_explaining+useeffect+local+storage2.jpg" class="kg-image" alt="s_EAEEAE9063B0CA7CBC6574F36123E82B36B6C1EC3724A86DA7C0B4C67C2DD652_1645369611908_explaining+useeffect+local+storage2" width="600" height="400" loading="lazy"><figcaption>Структура роботи хуків із локальним сховищем для отримання елементів</figcaption></figure><h2 id="-"><strong>Висновок</strong></h2><p>У цій публікації ми дізналися, як використовувати localStorage з хуками React, коли його використовувати та який хук використовувати.</p><p>Якщо ви хочете побачити, як це працює на практиці, ви можете отримати вихідний код простої програми зі списком справ, яка використовує localStorage і ці хуки за <a href="https://github.com/olawanlejoel/Todo-App">посиланням</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Як передавати дані та події між компонентами в React ]]>
                </title>
                <description>
                    <![CDATA[ Якщо ви спробуєте реалізувати операції CRUD (тобто чотири базові функції: створення, читання, оновлення та видалення) за допомогою кінцевих точок API, то ви можете виявити, що керувати даними в кількох компонентах дещо важко. Або, можливо, у вас є модальний компонент, але ви хочете запустити його з іншого компоненту. Розібратися, як впоратися ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/yak-peredavaty-dani-ta-podiyi-mizh-komponentamy-v-react/</link>
                <guid isPermaLink="false">63f5c1c40a9291056ed3e8d2</guid>
                
                    <category>
                        <![CDATA[ react ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Wed, 01 Mar 2023 05:02:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/Colorful-Animal-Crossing-Icons-Icon-Set-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/pass-data-between-components-in-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Pass Data and Events Between Components in React</a>
      </p><p>Якщо ви спробуєте реалізувати операції CRUD (<em>тобто чотири базові функції: створення, читання, оновлення та видалення</em>) за допомогою кінцевих точок API, то ви можете виявити, що керувати даними в кількох компонентах дещо важко.</p><p>Або, можливо, у вас є модальний компонент, але ви хочете запустити його з іншого компоненту.</p><p>Розібратися, як впоратися з цими сценаріями, може бути важко.</p><p>У цій публікації я покажу, як ви можете це зробити.</p><h2 id="-"><strong>Як передати дані між батьківським та дочірнім компонентом</strong></h2><p>Спершу давайте передамо дані між батьківським і дочірнім компонентами. </p><p>Спочатку вам потрібно буде створити два компоненти, один батьківський і один дочірній.</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react'

export default function Parent() {
  return (
    &lt;div&gt;
      
    &lt;/div&gt;
  )
}
</code></pre><figcaption>Батьківський.js</figcaption></figure><figure class="kg-card kg-code-card"><pre><code>import React from 'react'

export default function Child() {
    return (
        &lt;div&gt;
            
        &lt;/div&gt;
    )
}
</code></pre><figcaption>Дочірній.js</figcaption></figure><p>Далі ви імпортуєте дочірній компонент у батьківський і повертаєте його.</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react'
import Child from './Child';

export default function Parent() {
  return (
    &lt;div&gt;
      &lt;Child/&gt;
    &lt;/div&gt;
  )
}</code></pre><figcaption>Виклик дочірнього компонента у батьківському компоненті</figcaption></figure><p>Потім ви створюєте функцію та кнопку для запуску цієї функції. Крім того, ви створюєте стан за допомогою хука <em>useState</em>, щоб керувати даними.</p><pre><code>import React from 'react'
import Child from './Child';
import { Button } from 'semantic-ui-react';
import { useState } from 'react';
import './App.css';

export default function Parent() {
  const [data, setData] = useState('');
  
  const parentToChild = () =&gt; {
    setData("This is data from Parent Component to the Child Component.");
  }
  return (
    &lt;div className="App"&gt;
      &lt;Child/&gt;
      
      &lt;div&gt;
        &lt;Button primary onClick={() =&gt; parentToChild()}&gt;Click Parent&lt;/Button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  )
}
</code></pre><p>Як ви можете бачити тут, ми викликаємо функцію <em>parentToChild</em> після натискання кнопки <em><em>Click Parent</em></em>. Коли натиснуто кнопку <em><em>Click Parent</em></em>, у змінній <em><em>data</em></em> буде збережено «<em>This is data from Parent Component to the Child Component</em>».</p><p>Тепер давайте передамо цей стан даних нашим дочірнім компонентам. Ви можете зробити це за допомогою пропсів.</p><p>Передайте дані як пропси, коли викликаєте дочірній компонент, таким чином:</p><figure class="kg-card kg-code-card"><pre><code>&lt;Child parentToChild={data}/&gt;</code></pre><figcaption>Батьківський.js</figcaption></figure><p>Тут ми передаємо дані дочірнього компонента як <em><em>data</em></em>.</p><p><code>data</code> — це дані, які ми повинні передати, а <code>parentToChild</code> — це назва пропсу.</p><p>Далі настав час записати дані в дочірній компонент. А це дуже просто.</p><p>Тут може бути два випадки.</p><p>Випадок 1: якщо ви використовуєте функціональний компонент, просто перехопіть parentToChild у параметрах.</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react'

export default function Child({parentToChild}) {
    return (
        &lt;div&gt;
            {parentToChild}
        &lt;/div&gt;
    )
}</code></pre><figcaption>Функціональний компонент React</figcaption></figure><p>Випадок 2: якщо у вас компонент класу, просто використайте <code>this.props.parentToChild</code>.</p><figure class="kg-card kg-code-card"><pre><code>import React, { Component } from 'react'

export default class Child extends Component {
    render() {
        return (
            &lt;div&gt;
                {this.props.parentToChild}
            &lt;/div&gt;
        )
    }
}</code></pre><figcaption>Класовий компонент React</figcaption></figure><p>У будь-якому випадку ви отримаєте однакові результати:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/06/Screenshot-2021-06-06-132836.png" class="kg-image" alt="Screenshot-2021-06-06-132836" width="600" height="400" loading="lazy"></figure><p>Коли ми натискаємо на кнопку <code>Click Parent</code>, ми побачимо виведені дані на екрані.</p><pre><code>import React from 'react'
import Child from './Child';
import { Button } from 'semantic-ui-react';
import { useState } from 'react';
import './App.css';

export default function Parent() {
  const [data, setData] = useState('');
  
  const parentToChild = () =&gt; {
    setData("This is data from Parent Component to the Child Component.");
  }
  return (
    &lt;div className="App"&gt;
      &lt;Child parentToChild={data}/&gt;
      
      &lt;div className="child"&gt;
        &lt;Button primary onClick={() =&gt; parentToChild()}&gt;Click Parent&lt;/Button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  )
}</code></pre><p>Вище ви бачите повний код для <code>Parent Component</code>.</p><h2 id="--1"><strong>Як передати дані між дочірнім та батьківським компонентом</strong></h2><p>Це дещо складніше.</p><p>Спершу вам потрібно створити функцію в батьківському компоненті під назвою <code>childToParent</code> і порожній стан під назвою <code>data</code>.</p><figure class="kg-card kg-code-card"><pre><code>const [data, setData] = useState('');

const childToParent = () =&gt; {
   
}</code></pre><figcaption>Батьківський компонент</figcaption></figure><p>Потім передайте функцію <code>childToParent</code> як пропс<em> </em>до дочірнього компонента.</p><figure class="kg-card kg-code-card"><pre><code>&lt;Child childToParent={childToParent}/&gt;</code></pre><figcaption>Передача childToParent до дочірнього компонента.</figcaption></figure><p>Тепер у дочірньому компоненті прийміть виклик цієї функції як пропс<em> </em>та призначте його до події <em>onClick</em>.</p><p>Крім того, оголосіть стан, який містить деякі дані у вигляді рядка або числа.</p><p>Потім передайте дані до функції <code>parentToChild</code> як параметри.</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react'
import { Button } from 'semantic-ui-react';

export default function Child({childToParent}) {
    const data = "This is data from Child Component to the Parent Component."
    return (
        &lt;div&gt;
            &lt;Button primary onClick={() =&gt; childToParent(data)}&gt;Click Child&lt;/Button&gt;
        &lt;/div&gt;
    )
}</code></pre><figcaption>Дочірній компонент</figcaption></figure><p>Далі в батьківському компоненті прийміть ці дані у функції <code>childToParent</code> як параметр та налаштуйте дані<em> </em>за допомогою хука useState.</p><figure class="kg-card kg-code-card"><pre><code>import './App.css';
import { useState } from 'react';
import Child from './Child';

function Parent() {
  const [data, setData] = useState('');
  
  const childToParent = (childdata) =&gt; {
    setData(childdata);
  }

  return (
    &lt;div className="App"&gt;
      &lt;div&gt;
        &lt;Child/&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
}

export default Parent;
</code></pre><figcaption>Батьківський компонент</figcaption></figure><p>Потім покажіть цю змінну <em>data </em>у функції повернення.</p><figure class="kg-card kg-code-card"><pre><code>import './App.css';
import { useState } from 'react';
import Child from './Child';

function Parent() {
  const [data, setData] = useState('');
  
  const childToParent = (childdata) =&gt; {
    setData(childdata);
  }

  return (
    &lt;div className="App"&gt;
     {data}
      &lt;div&gt;
        &lt;Child childToParent={childToParent}/&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
}

export default Parent;</code></pre><figcaption>Батьківський компонент</figcaption></figure><p>Дочірня змінна data перезапише батьківську, коли кнопку <code>Click Child</code> буде<em><em> </em></em>натиснуто.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/Screenshot-2021-06-06-134803.png" class="kg-image" alt="Screenshot-2021-06-06-134803" width="600" height="400" loading="lazy"></figure><p>Тепер ви можете передавати дані <strong>від</strong> <strong>дочірнього компоненту до батьківського</strong> і <strong>від батьківського до дочірнього </strong>як професіонал.</p><h3 id="-onclick-onchange"><strong>Ви також можете передавати такі події, як onClick або OnChange</strong></h3><p>Просто викличте метод <em>alert </em>у функції <code>childToParent</code> і передайте цю функцію як пропс<em> </em>дочірньому компоненту.</p><figure class="kg-card kg-code-card"><pre><code>import './App.css';
import Child from './Child';

function Parent() {
  const childToParent = () =&gt; {
    alert("This is an alert from the Child Component")
  }

  return (
    &lt;div className="App"&gt;
      &lt;div className="child"&gt;
        &lt;Child childToParent={childToParent}/&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
}

export default Parent;</code></pre><figcaption>Батьківський компонент</figcaption></figure><p>А в дочірньому компоненті прийміть функцію <code>childToParent</code><em><em> </em></em>як пропс. Потім призначте його до події onClick у кнопці.</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react'
import { Button } from 'semantic-ui-react';

export default function Child({childToParent}) {
    return (
        &lt;div&gt;
            &lt;Button primary onClick={() =&gt; childToParent()}&gt;Click Child&lt;/Button&gt;
        &lt;/div&gt;
    )
}</code></pre><figcaption>Дочірній компонент</figcaption></figure><p>Ваша функція в батьківському компоненті буде викликана, коли ви натиснете кнопку в дочірньому компоненті, і ви побачите таке сповіщення:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/06/Screenshot-2021-06-06-140405.png" class="kg-image" alt="Screenshot-2021-06-06-140405" width="600" height="400" loading="lazy"></figure><p>Це все!</p><p>Ви можете знайти <a href="https://github.com/nishant-666/Passing-data-in-React">код на Github</a>, якщо бажаєте експериментувати далі.</p><blockquote>Ну ось і все, народе. Щасливого навчання.</blockquote> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Найпопулярніші способи зробити запит HTTP у JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ У JavaScript є чудові модулі та методи для створення запитів HTTP, які можна використовувати для надсилання чи отримання даних зі сторони сервера. У цій публікації ми розглянемо кілька популярних способів створення запитів HTTP у JavaScript. Ajax Ajax — це традиційний спосіб створення асинхронного запиту HTTP. Дані можна надсилати за допомогою ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/naypopulyarnishi-sposoby-zrobyty-zapyt-http-u-javascript/</link>
                <guid isPermaLink="false">63eb4b900a9291056ed3dbad</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Sat, 18 Feb 2023 14:27:40 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/1-gqHgCNubMncv7EwWNdArGQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/here-is-the-most-popular-ways-to-make-an-http-request-in-javascript-954ce8c95aaa/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Here are the most popular ways to make an HTTP request in JavaScript</a>
      </p><p>У JavaScript є чудові модулі та методи для створення запитів HTTP, які можна використовувати для надсилання чи отримання даних зі сторони сервера. У цій публікації ми розглянемо кілька популярних способів створення запитів HTTP у JavaScript.</p><h3 id="ajax"><strong><strong>Ajax</strong></strong></h3><p>Ajax — це традиційний спосіб створення асинхронного запиту HTTP. Дані можна надсилати за допомогою методу HTTP POST і отримувати за допомогою методу HTTP GET. Давайте подивимось, як зробити запит <code>GET</code>. Я буду використовувати сайт JSONPlaceholder — безкоштовний онлайн API REST для розробників, який повертає випадкові дані у форматі JSON.</p><p>Щоб зробити виклик HTTP в Ajax, потрібно ініціалізувати новий метод <code>XMLHttpRequest()</code> та вказати кінцеву точку URL-адреси і метод HTTP (у цьому випадку GET). Далі ми використовуємо метод <code>open()</code> для зв’язування методу HTTP та кінцевої точки URL-адреси і викликаємо метод <code>send()</code> для ініціалізації запиту.</p><p>Ми реєструємо відповідь HTTP в консолі за допомогою властивості <code>XMLHTTPRequest.onreadystatechange</code>, яка містить обробник подій, що викликається, коли подія <code>readystatechanged</code> запускається.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*zXtlRe4yRF3tZkFFvBhZeA.png" class="kg-image" alt="1*zXtlRe4yRF3tZkFFvBhZeA" width="800" height="349" loading="lazy"></figure><pre><code class="language-js">const Http = new XMLHttpRequest();
const url='https://jsonplaceholder.typicode.com/posts';
Http.open("GET", url);
Http.send();

Http.onreadystatechange = (e) =&gt; {
  console.log(Http.responseText)
}</code></pre><p>Якщо ви переглянете консоль браузера, то побачите, що вона поверне масив даних у форматі JSON. Але як ми можемо знати, чи запит виконано? Іншими словами, як ми можемо обробляти відповіді за допомогою Ajax?</p><p>Властивість <code>onreadystatechange</code> має два методи: <code>readyState</code> та <code>status</code>, які дозволяють перевірити стан нашого запиту.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*UfZf6qaZwNh5Mptft4WIZA.png" class="kg-image" alt="1*UfZf6qaZwNh5Mptft4WIZA" width="800" height="376" loading="lazy"></figure><p>Якщо <code>readyState</code> дорівнює 4, то це свідчить про те, що запит виконано. Властивість <code>readyState</code> має 5 відповідей. Дізнайтесь про них більше за цим <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState">посиланням</a>.</p><p>Окрім прямого виклику Ajax за допомогою JavaScript існують й інші, більш потужні методи здійснення виклику HTTP (наприклад, <code>$.Ajax</code>, який є методом jQuery) і тому я зупинюсь на них більш детально.</p><h3 id="-jquery"><strong>Методи <strong>jQuery</strong></strong></h3><p>jQuery має багато методів для легкої обробки запитів HTTP. Щоб використати ці методи, вам потрібно включити бібліотеку jQuery до свого проєкту.</p><pre><code class="language-html">&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;</code></pre><h4 id="-ajax"><strong><strong>$.ajax</strong></strong></h4><p>jQuery Ajax є одним із найпростіших методів здійснення виклику HTTP.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*vZ4BqVQfsvtpJm_RCsCE2Q.png" class="kg-image" alt="1*vZ4BqVQfsvtpJm_RCsCE2Q" width="800" height="429" loading="lazy"></figure><p>Метод <code>$.ajax</code> приймає багато параметрів, деякі з яких є обов’язковими, а інші необов’язковими. Він містить два варіанти функції зворотного виклику: <code>success</code> та <code>error</code>, щоб обробити отриману відповідь.</p><h4 id="-get"><strong>Метод <strong>$.get</strong></strong></h4><p>Метод <code>$.get</code> використовується для виконання запитів GET. Він приймає два параметри: кінцеву точку та функцію зворотного виклику.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*2koN5FJuT68WIyRKTihe5w.png" class="kg-image" alt="1*2koN5FJuT68WIyRKTihe5w" width="797" height="287" loading="lazy"></figure><h4 id="-post"><strong>Метод <strong>$.post</strong></strong></h4><p>Метод <code>$.post</code> — це інший спосіб надсилання даних на сервер. Він приймає три параметри: <code>url</code>, дані, які ви хочете надіслати, і функцію зворотного виклику.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*ql6Yp1EJfD7850GXhErwyw.png" class="kg-image" alt="1*ql6Yp1EJfD7850GXhErwyw" width="695" height="355" loading="lazy"></figure><h4 id="-getjson"><strong><strong>$.getJSON</strong></strong></h4><p>Метод <code>$.getJSON</code> отримує дані лише у форматі JSON. Він приймає два параметри: <code>url</code> та функцію зворотного виклику.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*hdcFdVHiBiRAo1YOi_Kt0Q.png" class="kg-image" alt="1*hdcFdVHiBiRAo1YOi_Kt0Q" width="755" height="291" loading="lazy"></figure><p>jQuery має ці методи для запиту або надсилання даних на віддалений сервер. Але насправді їх можна поєднати в один метод <code>$.ajax</code>, як показано у прикладі нижче:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*soPARjfQXMcZ5ccPK1QMmA.png" class="kg-image" alt="1*soPARjfQXMcZ5ccPK1QMmA" width="800" height="420" loading="lazy"></figure><h3 id="-fetch"><strong>Функція <strong>fetch</strong></strong></h3><p>Функція <code>fetch</code> — це новий потужний web API, який дозволяє робити асинхронні запити. Насправді, <code>fetch</code> є одним із найкращих і моїх улюблених способів зробити запит HTTP. Він повертає проміс, що є однією з чудових функцій ES6. Якщо ви не знайомі з ES6, ви можете прочитати про нього в <a href="https://www.freecodecamp.org/news/write-less-do-more-with-javascript-es6-5fd4a8e50ee2">цій</a> публікації. Проміси дозволяють нам розумніше обробляти асинхронний запит. Давайте подивимося, як працює <code>fetch</code>.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*kz6k4VRs0RiVCasWR0pCow.png" class="kg-image" alt="1*kz6k4VRs0RiVCasWR0pCow" width="800" height="270" loading="lazy"></figure><p>Функція <code>fetch</code> приймає один обов’язковий параметр: URL <code>endpoint</code>. Також вона може мати інші додаткові параметри, як у прикладі нижче:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*QasrBgYZcU4BBFHqD2bBdg.png" class="kg-image" alt="1*QasrBgYZcU4BBFHqD2bBdg" width="800" height="497" loading="lazy"></figure><p>Як ви можете бачити, <code>fetch</code> має багато переваг для виконання запитів HTTP. Ви можете дізнатися більше про них <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch">тут</a>. Крім того, у fetch є інші модулі та плагіни, які дозволяють надсилати запити на сервер та отримувати їх зі сторони сервера (наприклад, <a href="https://github.com/axios/axios">axios</a>).</p><h3 id="axios"><strong><strong>Axios</strong></strong></h3><p>Axios — це бібліотека з відкритим вихідним кодом для створення запитів HTTP, яка надає багато чудових функцій. Давайте подивимося, як вона працює.</p><h4 id="-"><strong>Використання:</strong></h4><p>По-перше, вам потрібно включити Axios. Існує два способи включити Axios до проєкту.</p><p>Перший: ви можете використати npm:</p><pre><code class="language-bash">npm install axios --save</code></pre><p>І потім вам потрібно імпортувати його:</p><pre><code class="language-js">import axios from 'axios'</code></pre><p>Другий: ви можете включити axios за допомогою CDN:</p><pre><code class="language-html">&lt;script src="https://unpkg.com/axios/dist/axios.min.js"&gt;&lt;/script&gt;</code></pre><h4 id="-axios-">Створення запиту з <strong><strong>axios:</strong></strong></h4><p>З Axios ви можете використати <code>GET</code> та <code>POST</code> для отримання та надсилання даних із сервера.</p><h4 id="get-"><strong><strong>GET:</strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*4wmqiPsSN5mdgjJiRaKVZg.png" class="kg-image" alt="1*4wmqiPsSN5mdgjJiRaKVZg" width="781" height="440" loading="lazy"></figure><p><code>axios</code> приймає один обов’язковий параметр і може приймати другий необов’язковий параметр. Деякі дані сприймаються як простий запит.</p><h4 id="post-"><strong><strong>POST:</strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*ey6-vwsrm9RAhyoU15u6xQ.png" class="kg-image" alt="1*ey6-vwsrm9RAhyoU15u6xQ" width="755" height="412" loading="lazy"></figure><p>Axios повертає проміс. Якщо ви знайомі з промісами, ви, мабуть, знаєте, що проміси можуть виконувати кілька запитів. Ви можете робити те саме з axios і виконувати кілька запитів одночасно.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*40Pji4utVKPpC7-dePfC6Q.png" class="kg-image" alt="1*40Pji4utVKPpC7-dePfC6Q" width="800" height="396" loading="lazy"></figure><p>Axios підтримує багато інших методів і опцій. Ви можете дослідити їх <a href="https://github.com/axios/axios">тут</a>.</p><h3 id="angular-httpclient"><strong><strong>Angular HttpClient</strong></strong></h3><p>У Angular є власний модуль HTTP, який працює з додатками Angular. Він використовує бібліотеку <a href="https://rxjs-dev.firebaseapp.com/">RxJS</a> для обробки асинхронних запитів і надає багато варіантів для виконання запитів HTTP.</p><h4 id="-angular-httpclient"><strong>Здійснення запиту на сервер за допомогою Angular HttpClient</strong></h4><p>Щоб зробити запит за допомогою Angular HttpClient, потрібно запустити наш код у додатку Angular. Тому я створив його. Якщо ви не знайомі з Angular, перегляньте мою публікацію, щоб дізнатися, як створити свій перший <a href="https://www.freecodecamp.org/news/learn-how-to-create-your-first-angular-app-in-20-min-146201d9b5a7">додаток Angular за 20 хвилин</a>.</p><p>Перше, що нам потрібно зробити — імпортувати <code>HttpClientModule</code> до <code>app.module.ts</code></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*iFuW5Fbp91VR5gwQ6XNMEQ.png" class="kg-image" alt="1*iFuW5Fbp91VR5gwQ6XNMEQ" width="758" height="632" loading="lazy"></figure><p>Потім ми повинні створити сервіс для обробки запитів. Ви можете легко створити сервіс за допомогою <a href="https://angular.io/cli">Angular CLI</a>:</p><pre><code class="language-bash">ng g service  FetchdataService</code></pre><p>Далі нам потрібно імпортувати HttpClient до сервісу <code>fetchdataService.ts</code> і вставити його всередині конструктора:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*kKwELAhSSpnN8DvIgdOfcQ.png" class="kg-image" alt="1*kKwELAhSSpnN8DvIgdOfcQ" width="685" height="461" loading="lazy"></figure><p>А в <code>app.component.ts</code> імпортувати <code>fetchdataService</code> :</p><pre><code class="language-ts">//import
import { FetchdataService } from './fetchdata.service';</code></pre><p>Зрештою, потрібно викликати сервіс і запустити його.</p><p><code>app.component.ts:</code></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*OrRe183Yaclt19n5ZQ194Q.png" class="kg-image" alt="1*OrRe183Yaclt19n5ZQ194Q" width="788" height="620" loading="lazy"></figure><p>Ви можете переглянути приклад <a href="https://stackblitz.com/edit/angular-httpclinent" rel="noopener">на Stackblitz</a>.</p><h3 id="--1"><strong>Підсумки</strong></h3><p>Ми щойно розглянули найпопулярніші способи зробити запити HTTP у JavaScript.</p><p>Дякую за ваш час. Якщо вам сподобалась публікація, очікую оплесків та підписників у <a href="https://twitter.com/SaidHYN" rel="noopener">твіттері</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Debounce: як затримати виклик функції в JavaScript (приклад JS ES6) ]]>
                </title>
                <description>
                    <![CDATA[ У JavaScript функція debounce гарантує, що ваш код запускається лише один раз за введення користувача. Пропозиції у вікні пошуку, автоматичне збереження текстових полів і усунення подвійних натискань кнопок — усе це випадки використання функції debounce.  У цьому посібнику ми дізнаємося, як створити функцію debounce в JavaScript. Що таке debounce? ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/debounce-yak-zatrymaty-vyklyk-funktsiyi-v-javascript-pryklad-js-es6/</link>
                <guid isPermaLink="false">63e27dcbf1df0805b225033c</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Tue, 07 Feb 2023 17:41:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/teaser.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/javascript-debounce-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Debounce – How to Delay a Function in JavaScript (JS ES6 Example)</a>
      </p><p>У JavaScript функція debounce гарантує, що ваш код запускається лише один раз за введення користувача. Пропозиції у вікні пошуку, автоматичне збереження текстових полів і усунення подвійних натискань кнопок — усе це випадки використання функції debounce. </p><p>У цьому посібнику ми дізнаємося, як створити функцію debounce в JavaScript.</p><h2 id="-debounce"><strong>Що таке debounce?</strong></h2><p>Термін <strong>debounce </strong>походить від електроніки. Коли ви натискаєте кнопку, скажімо, на пульті дистанційного керування телевізором, то сигнал надходить до мікрочіпа пульта настільки швидко, що перш ніж ви встигнете відпустити кнопку, він неодноразово повторюється і мікрочіп реєструє ваше «клацання» декілька разів.<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/01/debounce-button.png" class="kg-image" alt="debounce-button" width="600" height="400" loading="lazy"></figure><p>Щоб змінити це, після отримання сигналу від кнопки мікрочіп припиняє обробку сигналів від неї на кілька мікросекунд — на той час, коли ви фізично не в змозі натиснути її знову.</p><h2 id="debounce-javascript"><strong>Debounce у JavaScript</strong></h2><p>У JavaScript сценарій використання схожий. Ми хочемо запустити функцію, але лише один раз для кожного випадку використання.</p><p>Скажімо, ми хочемо показати пропозиції для пошукового запиту, але лише після того, як відвідувач завершить його введення.</p><p>Або ми хочемо зберегти зміни у формі, але лише тоді, коли користувач не працює активно над цими змінами, оскільки кожне «збереження» коштує нам подорожі до бази даних.</p><p>І мій улюблений приклад: деякі люди так звикли до Windows 95, що й досі двічі клацають усе 😁.</p><p>Це проста реалізація функції debounce:</p><pre><code class="language-js">function debounce(func, timeout = 300){
  let timer;
  return (...args) =&gt; {
    clearTimeout(timer);
    timer = setTimeout(() =&gt; { func.apply(this, args); }, timeout);
  };
}
function saveInput(){
  console.log('Saving data');
}
const processChange = debounce(() =&gt; saveInput());
</code></pre><p>Її можна використовувати для введення:</p><pre><code class="language-html">&lt;input type="text" onkeyup="processChange()" /&gt;
</code></pre><p>Або для кнопки:</p><pre><code class="language-html">&lt;button onclick="processChange()"&gt;Click me&lt;/button&gt;
</code></pre><p>Або для події у вікні:</p><pre><code class="language-js">window.addEventListener("scroll", processChange);
</code></pre><p>І для інших елементів (наприклад, простих функцій JS).</p><p>Отже, що тут відбувається? <code>debounce</code> — це спеціальна функція, яка виконує два завдання:</p><ul><li>виділення області для змінної <em><em>timer</em></em></li><li>планування запуску функції в певний час</li></ul><p>Давайте пояснимо, як це працює в першому випадку використання з введенням тексту.</p><p>Коли відвідувач пише першу літеру та відпускає кнопку, то <code>debounce</code> спочатку скидає таймер за допомогою <code>clearTimeout(timer)</code>. На даний момент крок непотрібний, оскільки ще нічого не заплановано. Потім вона планує виклик наданої функції <code>saveInput()</code>, яка буде викликана через 300 мс.</p><p>Але, припустімо, що відвідувач продовжує писати, тому кожне відпускання кнопки знову викликає функцію <code>debounce</code>. Кожен виклик потребує скидання таймера, або, іншими словами, скасування попередніх планів <code>saveInput()</code>, і перепланування на новий час — 300 мс у майбутньому. Це триває до тих пір, поки відвідувач продовжує натискати кнопки.</p><p>Останнє планування виклику наданої функції <code>saveInput()</code> не буде очищено, і тому її зрештою буде викликано.</p><h2 id="-"><strong>І навпаки: як ігнорувати подальші виклики</strong></h2><p>Це все добре для запуску автозбереження або відображення пропозицій. Але як щодо випадку використання з кількома натисканнями однієї кнопки? Ми не хочемо чекати останнього натиску, а краще зареєструвати перший і ігнорувати решту:</p><pre><code class="language-js">function debounce_leading(func, timeout = 300){
  let timer;
  return (...args) =&gt; {
    if (!timer) {
      func.apply(this, args);
    }
    clearTimeout(timer);
    timer = setTimeout(() =&gt; {
      timer = undefined;
    }, timeout);
  };
}
</code></pre><p>Тут ми запускаємо функцію <code>saveInput()</code> під час першого виклику функції <code>debounce_leading</code>, яка у свою чергу ініціалізується першим натисканням кнопки. Плануємо знищення таймера на 300 мс. Кожне наступне натискання кнопки протягом цього періоду часу вже матиме визначений таймер і зсуватиме деструкцію лише на 300 мс у майбутнє.</p><h2 id="-debounce-"><strong>Реалізації debounce в бібліотеках</strong></h2><p>У цій статті я показав вам, як реалізувати функцію debounce у JavaScript і використовувати її для, ну, debounce подій, викликаних елементами вебсайту. </p><p>Однак вам не потрібно використовувати власну реалізацію debounce у своїх проєктах, якщо ви цього не хочете. Широко використовувані бібліотеки JS вже містять її реалізацію:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-style: normal; font-variant-caps: normal; font-weight: 400; font-stretch: inherit; line-height: inherit; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background-image: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%), radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%); background-origin: initial, initial; background-clip: initial, initial; background-attachment: scroll, scroll; background-size: 10px 100%, 10px 100%; caret-color: rgb(10, 10, 35); color: rgb(10, 10, 35); letter-spacing: normal; orphans: auto; text-align: start; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; background-position: 0px center, 100% center; background-repeat: no-repeat no-repeat;"><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: italic; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">Library</strong></em></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: italic; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; color: var(--gray85);">Example</strong></em></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><a href="http://benalman.com/projects/jquery-throttle-debounce-plugin/" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">jQuery (via library)</a></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-family: &quot;Roboto Mono&quot;, monospace; font-style: inherit; font-variant-caps: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">$.debounce(300, saveInput);</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><a href="https://lodash.com/docs/4.17.15#debounce" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Lodash</a></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-family: &quot;Roboto Mono&quot;, monospace; font-style: inherit; font-variant-caps: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">_.debounce(saveInput, 300);</code></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat no-repeat;"><a href="https://underscorejs.org/#debounce" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Underscore</a></td><td style="box-sizing: inherit; margin: 0px; padding: 4px; border: 1px solid black; font-family: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-position: 100% 0px; background-repeat: no-repeat no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-family: &quot;Roboto Mono&quot;, monospace; font-style: inherit; font-variant-caps: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">_.debounce(saveInput, 300);</code></td></tr></tbody></table><!--kg-card-end: html--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Посібник з масиву об’єктів JavaScript: як створювати, оновлювати та переглядати об’єкти за допомогою методів масиву JS ]]>
                </title>
                <description>
                    <![CDATA[ В середньому я працюю з даними JSON 18 разів на тиждень. І мені досі потрібно майже кожного разу гуглити конкретні способи маніпулювання ними. Лише уявіть, якби був путівник з усіма відповідями. У цій публікації я покажу основи роботи з масивами об’єктів у JavaScript. Якщо ви коли-небудь працювали зі структурою JSON, ]]>
                </description>
                <link>https://www.freecodecamp.org/ukrainian/news/posibnyk-z-masyvu-ob-yektiv-javascript-yak-stvoryuvaty-onovlyuvaty-ta-perehlyadaty-ob-yekty-za-dopomohoyu-metodiv-masyvu-js/</link>
                <guid isPermaLink="false">63dd39ca3eba3806ff37e37f</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihor Zakatsiura ]]>
                </dc:creator>
                <pubDate>Fri, 03 Feb 2023 17:35:39 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/ukrainian/news/content/images/2023/02/js-tutorial-cover-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Оригінальна публікація:</strong> <a href="https://www.freecodecamp.org/news/javascript-array-of-objects-tutorial-how-to-create-update-and-loop-through-objects-using-js-array-methods/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Array of Objects Tutorial – How to Create, Update, and Loop Through Objects Using JS Array Methods</a>
      </p><p>В середньому я працюю з даними JSON 18 разів на тиждень. І мені досі потрібно майже кожного разу гуглити конкретні способи маніпулювання ними. Лише уявіть, якби був путівник з усіма відповідями.</p><p>У цій публікації я покажу основи роботи з масивами об’єктів у JavaScript.</p><p>Якщо ви коли-небудь працювали зі структурою JSON, ви працювали з об’єктами JavaScript. Буквально. JSON розшифровується як JavaScript Object Notation. </p><p>Створити об’єкт JSON так само просто:</p><pre><code class="language-js">{
  "color": "purple",
  "type": "minivan",
  "registration": new Date('2012-02-03'),
  "capacity": 7
}
</code></pre><p>Цей об’єкт представляє автомобіль. Може бути безліч різних кольорів чи типів автомобілів, але кожен об’єкт являє собою окрему машину.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/purple.png" class="kg-image" alt="purple" width="600" height="400" loading="lazy"></figure><p>Зараз такі дані найчастіше отримують зовні. Але іноді потрібно створити об’єкти та їх масиви вручну, як я робив, коли створював цей інтернет-магазин:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/categories.jpg" class="kg-image" alt="categories" width="600" height="400" loading="lazy"></figure><p>Розглядаючи кожну категорію, елемент списку у HTML виглядає так:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/code.jpg" class="kg-image" alt="code" width="600" height="400" loading="lazy"></figure><p>Я би не хотів, щоб цей код повторювався 12 разів, оскільки в подальшому він може стати непідтримуваним. </p><h2 id="-"><strong>Створення масиву об’єктів</strong></h2><p>Але повернемося до автомобілів. Давайте подивимося на цей набір:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars.jpg" class="kg-image" alt="cars" width="600" height="400" loading="lazy"></figure><p>Ми можемо представити його у вигляді масиву таким чином:</p><pre><code class="language-js">let cars = [
  {
    "color": "purple",
    "type": "minivan",
    "registration": new Date('2017-01-03'),
    "capacity": 7
  },
  {
    "color": "red",
    "type": "station wagon",
    "registration": new Date('2018-03-03'),
    "capacity": 5
  },
  {
    ...
  },
  ...
]
</code></pre><p>Масиви об’єктів не залишаються такими самими весь час. Нам майже завжди потрібно ними маніпулювати. Отже, давайте розглянемо, як ми можемо додавати об’єкти до вже існуючого масиву.</p><h3 id="-array-unshift"><strong>Додавання нового об’єкту до початку масиву — Array.unshift</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/beginning.jpg" class="kg-image" alt="beginning" width="600" height="400" loading="lazy"></figure><p>Щоб додати об’єкт на першу позицію, використовуйте <code>Array.unshift</code>.</p><h3 id="-array-push"><strong>Додавання нового об’єкту в кінець масиву — Array.push</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/ending.jpg" class="kg-image" alt="ending" width="600" height="400" loading="lazy"></figure><p>Щоб додати об’єкт в кінець масиву, використовуйте <code>Array.push</code>.</p><pre><code class="language-js">let car = {
 "color": "red",
 "type": "cabrio",
 "registration": new Date('2016-05-02'),
 "capacity": 2
}
cars.push(car);
</code></pre><h3 id="-array-splice"><strong>Додавання нового об’єкту посеред масиву — Array.splice</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/middle.jpg" class="kg-image" alt="middle" width="600" height="400" loading="lazy"></figure><p>Щоб додати об’єкт посередині, використовуйте<code>Array.splice</code>. Ця функція дуже зручна, оскільки вона також може видаляти елементи. Зверніть увагу на її параметри:</p><pre><code class="language-js">Array.splice(
  {index where to start},
  {how many items to remove},
  {items to add}
);
</code></pre><p>Отже, якщо ми хочемо додати червоний Volkswagen Cabrio на п’яте місце, ми використаємо:</p><pre><code class="language-js">let car = {
  "color": "red",
  "type": "cabrio",
  "registration": new Date('2016-05-02'),
  "capacity": 2
}
cars.splice(4, 0, car);
</code></pre><h2 id="--1"><strong>Перегляд масиву об’єктів</strong></h2><p>Дозвольте мені поставити вам запитання: для чого вам переглядати масив об’єктів? Причина, чому я запитую, полягає в тому, що зациклення майже ніколи не є основною причиною того, чого ми хочемо досягти.</p><p>JavaScript надає багато функцій, які можуть вирішити вашу проблему без реалізації логіки в загальному циклі. Давайте поглянемо.</p><h3 id="-array-find"><strong>Пошук об’єкта в масиві за його значеннями — Array.find</strong></h3><p>Припустимо, ми хочемо знайти автомобіль червоного кольору. Ми можемо використати функцію <code>Array.find</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-colorred.jpg" class="kg-image" alt="cars-colorred" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let car = cars.find(car =&gt; car.color === "red");
</code></pre><p>Ця функція повертає перший елемент, який відповідає значенню:</p><pre><code class="language-js">console.log(car);
// output:
// {
//   color: 'red',
//   type: 'station wagon',
//   registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//   capacity: 5
// }
</code></pre><p>Також можна шукати за кількома значеннями:</p><p><code>let car = cars.find(car =&gt; car.color === "red" &amp;&amp; car.type === "cabrio");</code></p><p>У цьому випадку ми отримаємо останню машину в списку.</p><h3 id="-array-filter"><strong>Отримання кількох елементів із масиву, які відповідають умові — Array.filter</strong></h3><p>Функція &nbsp;<code>Array.find</code> повертає лише один об’єкт. Якщо ми хочемо отримати всі червоні машини, нам потрібно використовувати <code>Array.filter</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-colorred2.jpg" class="kg-image" alt="cars-colorred2" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let redCars = cars.filter(car =&gt; car.color === "red");
console.log(redCars);
// output:
// [
//   {
//     color: 'red',
//     type: 'station wagon',
//     registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 5
//   },
//   {
//     color: 'red',
//     type: 'cabrio',
//     registration: 'Sat Mar 03 2012 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 2
//   }
// ]
</code></pre><h3 id="-array-map"><strong>Перетворення об’єктів масиву — Array.map</strong></h3><p>Це те, що нам дуже часто потрібно. Перетворення масиву об’єктів на масив інших об’єктів. Це робота для <code>Array.map</code>. Скажімо, ми хочемо класифікувати наші автомобілі на три групи залежно від їхнього розміру.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-sizes.jpg" class="kg-image" alt="cars-sizes" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let sizes = cars.map(car =&gt; {
  if (car.capacity &lt;= 3){
    return "small";
  }
  if (car.capacity &lt;= 5){
    return "medium";
  }
  return "large";
});
console.log(sizes);
// output:
// ['large','medium','medium', ..., 'small']
</code></pre><p>Також можна створити новий об’єкт, якщо нам потрібно більше значень:</p><pre><code class="language-js">let carsProperties = cars.map(car =&gt; {
 let properties = {
   "capacity": car.capacity,
   "size": "large"
 };
 if (car.capacity &lt;= 5){
   properties['size'] = "medium";
 }
 if (car.capacity &lt;= 3){
   properties['size'] = "small";
 }
 return properties;
});
console.log(carsProperties);
// output:
// [
//   { capacity: 7, size: 'large' },
//   { capacity: 5, size: 'medium' },
//   { capacity: 5, size: 'medium' },
//   { capacity: 2, size: 'small' },
//   ...
// ]
</code></pre><h3 id="-array-foreach"><strong>Додавання властивості до кожного об’єкту масиву — Array.forEach</strong></h3><p>А якщо нам також потрібен розмір автомобіля? У цьому випадку ми можемо використати в об’єкті властивість &nbsp;<code>size</code>. Це хороший варіант використання для функції <code>Array.forEach</code>.</p><pre><code class="language-js">cars.forEach(car =&gt; {
 car['size'] = "large";
 if (car.capacity &lt;= 5){
   car['size'] = "medium";
 }
 if (car.capacity &lt;= 3){
   car['size'] = "small";
 }
});</code></pre><h3 id="-array-sort"><strong>Сортування масиву за властивістю — Array.sort</strong></h3><p>Коли ми закінчили з перетворенням об’єктів, нам зазвичай потрібно відсортувати їх тим чи іншим способом.</p><p>Як правило, сортування базується на значенні властивості кожного об’єкта. Ми можемо використовувати функцію <code>Array.sort</code> , але нам також потрібно надати іншу функцію, яка визначає механізм сортування.</p><p>Скажімо, ми хочемо відсортувати автомобілі за їхньою містивністю в порядку спадання.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/cars-sort.jpg" class="kg-image" alt="cars-sort" width="600" height="400" loading="lazy"></figure><pre><code class="language-js">let sortedCars = cars.sort((c1, c2) =&gt; (c1.capacity &lt; c2.capacity) ? 1 : (c1.capacity &gt; c2.capacity) ? -1 : 0);
console.log(sortedCars);
// output:
// [
//   {
//     color: 'purple',
//     type: 'minivan',
//     registration: 'Wed Feb 01 2017 00:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 7
//   },
//   {
//     color: 'red',
//     type: 'station wagon',
//     registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 5
//   },
//   ...
// ]
</code></pre><p>Функція <code>Array.sort</code> порівнює два об’єкти і ставить перший об’єкт на друге місце, якщо результат функції сортування позитивний. Таким чином, ви можете дивитися на функцію сортування так, ніби це було питання: чи варто розмістити перший об’єкт на другому місці?</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/sort.png" class="kg-image" alt="sort" width="600" height="400" loading="lazy"></figure><p>Обов’язково враховуйте випадок для нуля, коли порівнювані значення обох об’єктів однакові, щоб уникнути непотрібних замін.</p><h3 id="-array-every-array-includes"><strong>Перевірка відповідності умови об’єктів у масиві — Array.every, Array.includes</strong></h3><p><code>Array.every</code> та <code>Array.some</code> стають в нагоді, коли нам просто потрібно перевірити кожен об’єкт на певну умову.</p><p>Чи є у нас червоний кабріолет у списку машин? Чи всі автомобілі здатні перевозити щонайменше 4 людини? Або випадок, більш орієнтований на інтернет: чи є певний продукт у кошику?</p><pre><code class="language-js">cars.some(car =&gt; car.color === "red" &amp;&amp; car.type === "cabrio");
// output: true

cars.every(car =&gt; car.capacity &gt;= 4);
// output: false
</code></pre><p>Ви можете пам’ятати функцію <code>Array.includes</code>, яка схожа до <code>Array.some</code>, <br>але працює лише для примітивних типів.</p><h2 id="--2"><strong>Підсумок</strong></h2><p>У цій статті ми ознайомилися з основними функціями, які допомагають створювати, маніпулювати, перетворювати та переглядати масиви об’єктів. Вони мають охоплювати більшість випадків, на які ви натрапите.</p><p>Якщо у вас є потреба у більш розширеній функціональності, перегляньте <a href="https://www.freecodecamp.org/news/data-structures-101-arrays-a-visual-introduction-for-beginners-7f013bcc355a/">цей детальний посібник із масивів</a> або відвідайте <a href="https://www.w3schools.com/Jsref/jsref_obj_array.asp">W3Schools</a>.</p><p>Або <a href="https://twitter.com/ondrabus">зв’яжіться зі мною</a>, і я підготую іншу публікацію :-)</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
