<?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" version="2.0"><channel><title><![CDATA[Оптимизация React js приложений. Использование функции debounde()]]></title><description><![CDATA[<p dir="auto">Допустим мы имеем очень абстрактный компонент, который имеет  поле ввода текста, кнопку отправки этого текста на сервер, и сообщение о состоянии отправки  данных на сервер</p>
<h2>Пример кода</h2>
<pre><code class="language-tsx">
// функция иммитации запроса на сервер
function fakeFetch(val: string) {
  return new Promise&lt;string&gt;(function (resolve) {
    setTimeout(function () {
      resolve(`Сервер получил сообщение: ${val}`);
    }, 1000);
  });
}

//  самый простой пример компонента
function App() {
  const [val, setVal] = useState('');
  const [response, setResponse] = useState('');

  const inputHandler = (e: React.ChangeEvent&lt;HTMLInputElement&gt;) =&gt; {
    setVal(e.target.value);
    setResponse('');
  };

  const submitHandler = async () =&gt; {
    setVal('');
    setResponse('отправка ...');
    const resp = await fakeFetch(val);
    setResponse(resp);
  };

  return (
    &lt;&gt;
      &lt;input type="text" value={val} onInput={inputHandler} /&gt;
      &lt;button onClick={submitHandler}&gt;Отправить&lt;/button&gt;
      &lt;p&gt;{response}&lt;/p&gt;
    &lt;/&gt;
  );
}
</code></pre>
<p dir="auto">Теперь перед нами встала задача заменить  поведение: отправлять  данные не по кнопке, а автоматически. Однако  мы не может просто так повесить функцию в обработчик inputHandler(), мало того  что он   будет неоправданно часто отправлять запросы на сервер, так еще и  будет сбивать  значение <code>val</code>.  Но если мы добавить функцию <code>debounce()</code>, то она решит эти вопросы.</p>
<h2>Функция debounce()</h2>
<p dir="auto">debounce() - это функция-обертка, которая ограничивает число выполнений переданной в нее функции, некоторым промежутком времени. Если точнее, то, пока промежуток времени не прошел,  то зарегистрированная функция не будет исполнятся, а пока она не исполнилась, новый вызов функции будет замещать старый, исключая повторное выполнение.</p>
<p dir="auto">пример:</p>
<pre><code class="language-ts">function debounce(func, delay: number) {
  let timeoutId: number;

  return (...args) =&gt; {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() =&gt; func(...args), delay);
  };
}
</code></pre>
<h2>Как правильно использовать в React компоненте</h2>
<pre><code class="language-tsx">function App() {
  const [val, setVal] = useState('');
  const [response, setResponse] = useState('');

  const inputHandler = (e: React.ChangeEvent&lt;HTMLInputElement&gt;) =&gt; {
    setVal(e.target.value);
    setResponse('');

    debounceHandler();
  };

  const submitHandler = useCallback(async () =&gt; {
    setResponse('отправка ...');
    const resp = await fakeFetch(val);
    setVal('');
    setResponse(resp);
  }, []);

  const debounceHandler = useMemo(() =&gt; {
    return debounce(submitHandler, 800);
  }, [submitHandler]);

  return (
    &lt;&gt;
      &lt;input type="text" value={val} onInput={inputHandler} /&gt;
      {/* &lt;button onClick={submitHandler}&gt;Отправить&lt;/button&gt; */}
      &lt;p&gt;{response}&lt;/p&gt;
    &lt;/&gt;
  );
}
</code></pre>
<p dir="auto">При  изменении стейта функциональный компонент вызывает свою функцию каждый раз,  и без мемоизации мы бы получали каждый раз новый обработчик <code>debounceHandler()</code>  и <code>submitHandler()</code>. Но для того чтобы  все работало  нам необходимо передать  <strong>одну  функцию</strong> в debounce <strong>один раз!</strong></p>
<p dir="auto">Поэтому мемоизируем  submitHandler() через <code>useCallback</code> (линтер обычно потребует указать <code>submitHandler</code>  как зависимость <code>debounceHandler</code>) и саму функцию <code>debounceHandler()</code> в <code>useMemo</code>, (т.к debounce()  возвращает  функцию)</p>
]]></description><link>https://forum.exlends.ru/topic/29/optimizaciya-react-js-prilozhenij-ispolzovanie-funkcii-debounde</link><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 08:56:49 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/29.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Oct 2024 15:19:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Оптимизация React js приложений. Использование функции debounde() on Tue, 29 Oct 2024 16:27:10 GMT]]></title><description><![CDATA[<p dir="auto">@kirilljs Возможно магия реакта onInput  и onChange делает  идентичными, <a href="https://github.com/facebook/react/issues/3964" target="_blank" rel="noopener noreferrer">https://github.com/facebook/react/issues/3964</a><br />
Скорее всего можно использовать и то и то</p>
]]></description><link>https://forum.exlends.ru/post/64</link><guid isPermaLink="true">https://forum.exlends.ru/post/64</guid><dc:creator><![CDATA[Manul]]></dc:creator><pubDate>Tue, 29 Oct 2024 16:27:10 GMT</pubDate></item><item><title><![CDATA[Reply to Оптимизация React js приложений. Использование функции debounde() on Tue, 29 Oct 2024 11:49:37 GMT]]></title><description><![CDATA[<p dir="auto">@kirilljs</p>
<p dir="auto">Пользователь @kirilljs написал в <a href="/post/59">Оптимизация React js приложений. Использование функции debounde()</a>:</p>
<blockquote>
<p dir="auto">И почему <strong>onInput</strong>, а не <strong>onChange</strong></p>
</blockquote>
<p dir="auto"><strong>onInput</strong> отлавливает все изменения  значения в  <code>&lt;input /&gt;</code>,  даже такие как нажатие клавиш и вставку текста, поэтому он предпочтительнее в данном случае</p>
]]></description><link>https://forum.exlends.ru/post/61</link><guid isPermaLink="true">https://forum.exlends.ru/post/61</guid><dc:creator><![CDATA[Aladdin]]></dc:creator><pubDate>Tue, 29 Oct 2024 11:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Оптимизация React js приложений. Использование функции debounde() on Tue, 29 Oct 2024 11:46:42 GMT]]></title><description><![CDATA[<p dir="auto">Пользователь @kirilljs написал в <a href="/post/59">Оптимизация React js приложений. Использование функции debounde()</a>:</p>
<blockquote>
<p dir="auto">Простыми словами, мы колбэчим submitHandler через debounceHandler то как оно должно быть по спецификации JS</p>
</blockquote>
<p dir="auto">не понял вопроса, напомню, чтчо тут не используется никаких форм,  фактически все обработчики привязаны к onInput событию, функция <code>debounce()</code> -  самописная</p>
]]></description><link>https://forum.exlends.ru/post/60</link><guid isPermaLink="true">https://forum.exlends.ru/post/60</guid><dc:creator><![CDATA[Aladdin]]></dc:creator><pubDate>Tue, 29 Oct 2024 11:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to Оптимизация React js приложений. Использование функции debounde() on Sun, 27 Oct 2024 18:34:57 GMT]]></title><description><![CDATA[<p dir="auto">Простыми словами, мы колбэчим <strong>submitHandler</strong> через <strong>debounceHandler</strong> то как оно должно быть по спецификации JS ? И почему <strong>onInput</strong>, а не <strong>onChange</strong> ?</p>
]]></description><link>https://forum.exlends.ru/post/59</link><guid isPermaLink="true">https://forum.exlends.ru/post/59</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Sun, 27 Oct 2024 18:34:57 GMT</pubDate></item></channel></rss>