<?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[Next.js: Как встроить клиентскую логику?]]></title><description><![CDATA[<p dir="auto">Next.js сочетает преимущества серверного и клиентского рендеринга, но для реализации интерактивных фич (анимации, обработка событий, локальное состояние) требуется правильно интегрировать клиентскую логику.</p>
<p dir="auto">Щас расскажу и покажу как это сделать легко и просто если вы не умеете читать документацию <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f915.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--face_with_head_bandage" style="height:23px;width:auto;vertical-align:middle" title=":face_with_head_bandage:" alt="🤕" /> <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f600.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--grinning" style="height:23px;width:auto;vertical-align:middle" title=":grinning:" alt="😀" /></p>
<hr />
<h3>🧩 Клиентские компоненты в Next.js</h3>
<p dir="auto">Начиная с <strong>Next.js 13</strong>, фреймворк поддерживает разделение на серверные (Server Components) и клиентские (Client Components).</p>
<p dir="auto">Для активации клиентской логики в файле компонента добавьте директиву:</p>
<pre><code class="language-tsx">'use client';

import { useState, useEffect } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() =&gt; {
    document.title = `Счетчик: ${count}`;
  }, [count]);

  return (
    &lt;button onClick={() =&gt; setCount(prev =&gt; prev + 1)}&gt;
      Кликнуто {count} раз
    &lt;/button&gt;
  );
}
</code></pre>
<blockquote>
<p dir="auto"><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/26a0.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--warning" style="height:23px;width:auto;vertical-align:middle" title="⚠" alt="⚠" />️ Без <code>'use client'</code> компонент будет обрабатываться на сервере, и клиентская логика работать не будет.</p>
</blockquote>
<hr />
<h4><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f517.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--link" style="height:23px;width:auto;vertical-align:middle" title="🔗" alt="🔗" /> Взаимодействие с серверными компонентами</h4>
<p dir="auto">Серверные компоненты могут использовать клиентские как дочерние элементы:</p>
<pre><code class="language-tsx">// app/page.tsx (Server Component)
import Counter from './Counter';

export default function Home() {
  return (
    &lt;main&gt;
      &lt;h1&gt;Добро пожаловать!&lt;/h1&gt;
      &lt;Counter /&gt; {/* Клиентский компонент */}
    &lt;/main&gt;
  );
}
</code></pre>
<p dir="auto">В 14 версии клиентские не могли использовать серверные как дочерние, но 15 версия все перевернула с ног на ногу, но об этом потом <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title=":blush:" alt="😊" /></p>
<hr />
<h4>🧰 Клиентские функции и API</h4>
<p dir="auto"><strong>Работа с DOM</strong><br />
Используйте <code>useRef</code> для доступа к элементам:</p>
<pre><code class="language-tsx">const inputRef = useRef&lt;HTMLInputElement&gt;(null);
</code></pre>
<p dir="auto"><strong>Локальное состояние</strong><br />
<code>useState</code>, <code>useReducer</code>, <code>useEffect</code> работают как в обычном React-приложении.</p>
<p dir="auto"><strong>Браузерные API</strong><br />
Доступны только в <code>useEffect</code> или обработчиках событий:</p>
<pre><code class="language-tsx">useEffect(() =&gt; {
  window.addEventListener('resize', handleResize);
  return () =&gt; window.removeEventListener('resize', handleResize);
}, []);
</code></pre>
<p dir="auto">Хотя вы наверное и так это знаете, но на всякий случай добавлю! Вдруг нас читают новички!!!</p>
<hr />
<h4><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/26a0.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--warning" style="height:23px;width:auto;vertical-align:middle" title="⚠" alt="⚠" />️ Распространенные ошибки</h4>
<p dir="auto"><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /> Использование <code>window</code>/<code>document</code> на сервере</p>
<pre><code class="language-tsx">// НЕПРАВИЛЬНО
if (typeof window !== 'undefined') { /* Проверка обязательна! */ }

// Правильно
useEffect(() =&gt; {
  console.log(window.innerWidth); // Только в useEffect или обработчиках
}, []);
</code></pre>
<p dir="auto"><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /> Неинициализированные состояния<br />
Избегайте несоответствия между серверным и клиентским рендерингом:</p>
<pre><code class="language-tsx">const [mounted, setMounted] = useState(false);
useEffect(() =&gt; setMounted(true), []);
return mounted ? &lt;Component /&gt; : &lt;Skeleton /&gt;;
</code></pre>
<hr />
<h4><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f680.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--rocket" style="height:23px;width:auto;vertical-align:middle" title="🚀" alt="🚀" /> Оптимизация загрузки</h4>
<p dir="auto"><strong>Ленивая загрузка клиентских модулей</strong></p>
<pre><code class="language-tsx">import dynamic from 'next/dynamic';
const HeavyComponent = dynamic(() =&gt; import('./HeavyComponent'), {
  ssr: false, // Отключить серверный рендеринг
  loading: () =&gt; &lt;p&gt;Загрузка...&lt;/p&gt;,
});
</code></pre>
<p dir="auto"><strong>Разделение кода</strong><br />
Используйте <code>splitChunks</code> в <code>next.config.js</code> для оптимизации бандла.</p>
<hr />
<h4><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4da.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--books" style="height:23px;width:auto;vertical-align:middle" title="📚" alt="📚" /> Полезные ссылки</h4>
<ul>
<li><a href="https://nextjs.org/docs" target="_blank" rel="noopener noreferrer">Официальная документация: Client Components</a></li>
<li><a href="https://nextjs.org/docs/app/building-your-application/data-fetching" target="_blank" rel="noopener noreferrer">Data Fetching в Next.js</a></li>
<li><a href="https://react.dev/learn/start-a-new-react-project#can-i-use-react-without-a-framework" target="_blank" rel="noopener noreferrer">React Server Components vs Client Components</a></li>
</ul>
<hr />
<p dir="auto"><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4ac.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--speech_balloon" style="height:23px;width:auto;vertical-align:middle" title="💬" alt="💬" /> Вопросики имеются?<br />
Оставляйте комментарии ниже!</p>
]]></description><link>https://forum.exlends.ru/topic/138/next.js-kak-vstroit-klientskuyu-logiku</link><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 09:11:17 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/138.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Jun 2025 15:22:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Next.js: Как встроить клиентскую логику? on Fri, 06 Jun 2025 04:43:53 GMT]]></title><description><![CDATA[<p dir="auto">@Jspi таки нет, где ты увидел юсэфект в серверном компоненте?</p>
]]></description><link>https://forum.exlends.ru/post/276</link><guid isPermaLink="true">https://forum.exlends.ru/post/276</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Fri, 06 Jun 2025 04:43:53 GMT</pubDate></item><item><title><![CDATA[Reply to Next.js: Как встроить клиентскую логику? on Thu, 05 Jun 2025 07:01:18 GMT]]></title><description><![CDATA[<p dir="auto">А разве можно использовать useEffect в серверном компоненте???</p>
]]></description><link>https://forum.exlends.ru/post/271</link><guid isPermaLink="true">https://forum.exlends.ru/post/271</guid><dc:creator><![CDATA[Aladdin]]></dc:creator><pubDate>Thu, 05 Jun 2025 07:01:18 GMT</pubDate></item></channel></rss>