<?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[$bindable в Svelte: Упрощение работы с двухсторонними привязками]]></title><description><![CDATA[<p dir="auto"><code>$bindable</code> — это специальная директива в Svelte 5+, которая позволяет помечать переменные как двухсторонне связуемые (bindable) в рамках компонента. Это означает, что вы можете использовать bind: на кастомных компонентах так же, как вы используете его, например, на нативном элементе <code>&lt;input bind:value&gt; </code></p>
<p dir="auto">Ранее для этого требовалось писать отдельный механизм обработки событий (dispatch) и передачи значений обратно, но теперь всё это можно сделать с минимальным кодом благодаря $bindable.</p>
<h3>Как работает $bindable</h3>
<p dir="auto">Когда вы пишете:</p>
<pre><code class="language-js">let count = $bindable(0);
</code></pre>
<p dir="auto">Вы создаёте реактивное свойство, которое:</p>
<ul>
<li>Реактивно обновляется при изменении локально.</li>
<li>Автоматически генерирует событие change при изменении значения.</li>
<li>Позволяет использовать bind: в родительском компоненте без дополнительного кода.</li>
</ul>
<p dir="auto">Под капотом <code>$bindable</code> оборачивает значение в реактивную ссылку и подписывается на изменения, чтобы оповещать внешний мир через dispatch(‘change’, …). Таким образом, вы получаете прозрачный механизм двусторонней связи между компонентами.</p>
<h2>Сравнение  с другими фреймворками</h2>
<p dir="auto">В современных фреймворках для работы с состоянием между компонентами используются разные подходы. <strong>В Svelte 5+</strong> появился инструмент <code>$bindable</code>, который упрощает создание двусторонних привязок. В Vue для этого традиционно используют <code>v-model</code> и события, а в <strong>React</strong> — пропсы и колбэк-функции. Рассмотрим, как эти механизмы работают, их сходства и различия.</p>
<h3>Двухсторонняя привязка: $bindable (Svelte), v-model (Vue), props + callbacks (React)</h3>
<p dir="auto"><em><strong>Svelte: $bindable</strong></em></p>
<pre><code class="language-html">&lt;!-- Counter.svelte --&gt;
&lt;script&gt;
  let count = $bindable(0);
&lt;/script&gt;

&lt;button on:click={() =&gt; count += 1}&gt;Увеличить&lt;/button&gt;
</code></pre>
<pre><code class="language-html">&lt;!-- Родительский компонент --&gt;
&lt;Counter bind:count={myCount} /&gt;
</code></pre>
<ul>
<li><code>$bindable</code> автоматически генерирует событие change при изменении значения.</li>
<li>Родитель может использовать bind:propName для синхронизации.</li>
</ul>
<p dir="auto"><em><strong>Vue: v-model и события</strong></em></p>
<pre><code class="language-html">&lt;!-- Counter.vue --&gt;
&lt;template&gt;
  &lt;button @click="increment"&gt;Увеличить&lt;/button&gt;
&lt;/template&gt;

&lt;script setup&gt;
import { ref } from 'vue';
const props = defineProps(['modelValue']);
const emit = defineEmits(['update:modelValue']);

function increment() {
  emit('update:modelValue', props.modelValue + 1);
}
&lt;/script&gt;
</code></pre>
<pre><code class="language-html">&lt;!-- Родительский компонент --&gt;
&lt;Counter v-model="count" /&gt;
</code></pre>
<ul>
<li>v-model использует modelValue как пропс и update:modelValue как событие.</li>
<li>Требуется явно определять пропсы и эмитить события.</li>
</ul>
<p dir="auto"><em><strong>React: Пропсы и колбэк-функции</strong></em></p>
<pre><code class="language-jsx">// Counter.jsx
function Counter({ count, onCountChange }) {
  return (
    &lt;button onClick={() =&gt; onCountChange(count + 1)}&gt;
      Увеличить
    &lt;/button&gt;
  );
}
</code></pre>
<pre><code class="language-jsx">// Родительский компонент
const [count, setCount] = useState(0);
&lt;Counter count={count} onCountChange={setCount} /&gt;
</code></pre>
<ul>
<li>React не имеет встроенной двусторонней привязки.</li>
<li>Состояние обновляется через передачу функции onCountChange.</li>
</ul>
<h3>Реактивность и удобство</h3>
<p dir="auto">Svelte: Реактивность по умолчанию</p>
<ul>
<li>$bindable использует реактивную систему Svelte, где изменения переменной автоматически обновляют интерфейс.</li>
<li>Минимум кода: let count = $bindable(0);</li>
</ul>
<p dir="auto">Vue: Явная реактивность</p>
<ul>
<li>Реактивность через ref, reactive, watch.</li>
<li>Для v-model требуется передавать modelValue и эмитить события вручную.</li>
</ul>
<p dir="auto">React: Управление состоянием вручную</p>
<ul>
<li>Реактивность достигается через useState и useEffect.</li>
<li>Для синхронизации нужно передавать состояние и функцию его обновления.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Фреймворк</th>
<th>Метод</th>
<th>Описание</th>
</tr>
</thead>
<tbody>
<tr>
<td>Svelte</td>
<td><code>$bindable</code></td>
<td>Автоматически генерирует событие <code>change</code> при изменении значения. Реактивность встроена <br />  - Минимальный код<br />- Автоматическая реактивность <br /> - Доступен только в Svelte 5+<br />- Ограниченная поддержка сложных типов (объекты, массивы)</td>
</tr>
<tr>
<td>Vue</td>
<td><code>v-model</code>+ события</td>
<td>Использует <code>props</code> и <code>emit</code> для синхронизации. Требуется явное определение. <br /> - Ясный API через <code>v-model</code> <br />- Хорошо документирован <br /> - Требуется вручную управлять событиями и пропсами<br />- Более многословный код</td>
</tr>
<tr>
<td>React</td>
<td>Пропсы и колбэки</td>
<td>Полностью ручная реализация. Состояние обновляется через вызов функций. <br /> - Полный контроль над состоянием<br />- Подходит для сложных приложений <br /> - Нет встроенной двусторонней привязки<br />- Требует больше кода для простых задач</td>
</tr>
</tbody>
</table>
]]></description><link>https://forum.exlends.ru/topic/121/bindable-v-svelte-uproshenie-raboty-s-dvuhstoronnimi-privyazkami</link><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 08:15:57 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/121.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 May 2025 11:56:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to $bindable в Svelte: Упрощение работы с двухсторонними привязками on Sun, 05 Oct 2025 11:10:37 GMT]]></title><description><![CDATA[<p dir="auto">А правда, что директива $bindable должна использоваться редко? Говорят, что частое использование может усложнить отладку и снизить поддерживаемость кода. Или это просто пустые слова? Логично же, чтоеё использовапние вносит существенное упрощение в структуру кода. Почему тогда проблемы?</p>
]]></description><link>https://forum.exlends.ru/post/829</link><guid isPermaLink="true">https://forum.exlends.ru/post/829</guid><dc:creator><![CDATA[itrace]]></dc:creator><pubDate>Sun, 05 Oct 2025 11:10:37 GMT</pubDate></item><item><title><![CDATA[Reply to $bindable в Svelte: Упрощение работы с двухсторонними привязками on Wed, 28 May 2025 08:31:26 GMT]]></title><description><![CDATA[<p dir="auto">Bindable в Svelte — это, конечно, “вау, магия”, но давайте не будем забывать, что за эту магию кто-то платит. <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60f.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--smirk" style="height:23px;width:auto;vertical-align:middle" title="😏" alt="😏" /> Попробовал вчера переписать компонент с ручных dispatch на $bindable — вроде красиво, но как только начал кидать в пропсы вложенные объекты, всё посыпалось. Оказалось, Svelte не трекает изменения глубже первого уровня, и пришлось городить костыли с writable или ручным update().</p>
<p dir="auto">Сравнивать это с Vue/React — ну вы смелые. Там хоть понятно, где и как обновляется состояние, а тут “привязал и забыл” — пока не получишь баг, который воспроизводится только во время лунного затмения. <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f31a.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--new_moon_with_face" style="height:23px;width:auto;vertical-align:middle" title="🌚" alt="🌚" /></p>
<p dir="auto">А кто-нибудь тестировал, как $bindable работает с SSR? У меня в SvelteKit компоненты начали падать при гидрации, когда привязки шли через пропсы. Пришлось откатывать на export let value и createEventDispatcher — зато теперь коллеги думают, что я гуру, который “не идёт на поводу у модных фич”. <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60e.png?v=1bd9ff6b60a" class="not-responsive emoji emoji-android emoji--sunglasses" style="height:23px;width:auto;vertical-align:middle" title="😎" alt="😎" /></p>
<p dir="auto">P.S. Автор, спасибо за статью, но давайте честно: это же просто синтаксический сахар для ленивых, а не революция?</p>
]]></description><link>https://forum.exlends.ru/post/262</link><guid isPermaLink="true">https://forum.exlends.ru/post/262</guid><dc:creator><![CDATA[Mugiwara]]></dc:creator><pubDate>Wed, 28 May 2025 08:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to $bindable в Svelte: Упрощение работы с двухсторонними привязками on Mon, 12 May 2025 12:23:36 GMT]]></title><description><![CDATA[<p dir="auto"><img src="/assets/uploads/files/1747052615116-1523475183_e-news.su_920b080x-ezgif.com-resize.gif" alt="1523475183_e-news.su_920b080x-ezgif.com-resize.gif" class=" img-fluid img-markdown" /></p>
]]></description><link>https://forum.exlends.ru/post/225</link><guid isPermaLink="true">https://forum.exlends.ru/post/225</guid><dc:creator><![CDATA[Aladdin]]></dc:creator><pubDate>Mon, 12 May 2025 12:23:36 GMT</pubDate></item><item><title><![CDATA[Reply to $bindable в Svelte: Упрощение работы с двухсторонними привязками on Mon, 12 May 2025 11:58:42 GMT]]></title><description><![CDATA[<p dir="auto">@Jspi Кажется пора прощаться с React <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>
]]></description><link>https://forum.exlends.ru/post/224</link><guid isPermaLink="true">https://forum.exlends.ru/post/224</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Mon, 12 May 2025 11:58:42 GMT</pubDate></item></channel></rss>