After working with React and Vue, I personally prefer Vue. Although React’s library is more, Vue’s flow is much more streamlined than React. So what about Svelte , is the code and flow neater? Let’s find out together
First, here is a classic code example showing Svelte’s neatness compared to Vue and React
Suppose we have a problem: Sum 2 numbers a and b
- Input: a, b
- Output: Sum of a and b
Here is the code with React
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">import</span> React <span class="token punctuation">,</span> <span class="token punctuation">{</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">[</span> a <span class="token punctuation">,</span> setA <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token punctuation">[</span> b <span class="token punctuation">,</span> setB <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">handleChangeA</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">setA</span> <span class="token punctuation">(</span> <span class="token operator">+</span> event <span class="token punctuation">.</span> target <span class="token punctuation">.</span> value <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">handleChangeB</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">setB</span> <span class="token punctuation">(</span> <span class="token operator">+</span> event <span class="token punctuation">.</span> target <span class="token punctuation">.</span> value <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"number"</span> value <span class="token operator">=</span> <span class="token punctuation">{</span> a <span class="token punctuation">}</span> onChange <span class="token operator">=</span> <span class="token punctuation">{</span> handleChangeA <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"number"</span> value <span class="token operator">=</span> <span class="token punctuation">{</span> b <span class="token punctuation">}</span> onChange <span class="token operator">=</span> <span class="token punctuation">{</span> handleChangeB <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> <span class="token punctuation">{</span> a <span class="token punctuation">}</span> <span class="token operator">+</span> <span class="token punctuation">{</span> b <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span> a <span class="token operator">+</span> b <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> |
And this is with Vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"number"</span> v <span class="token operator">-</span> model <span class="token punctuation">.</span> number <span class="token operator">=</span> <span class="token string">"a"</span> <span class="token operator">></span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"number"</span> v <span class="token operator">-</span> model <span class="token punctuation">.</span> number <span class="token operator">=</span> <span class="token string">"b"</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> a <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">+</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> b <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> a <span class="token operator">+</span> b <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token function-variable function">data</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> a <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> b <span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
and with Svelte , that’s all we need
1 2 3 4 5 6 7 8 9 10 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token number">2</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"number"</span> bind <span class="token operator">:</span> value <span class="token operator">=</span> <span class="token punctuation">{</span> a <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"number"</span> bind <span class="token operator">:</span> value <span class="token operator">=</span> <span class="token punctuation">{</span> b <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> <span class="token punctuation">{</span> a <span class="token punctuation">}</span> <span class="token operator">+</span> <span class="token punctuation">{</span> b <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span> a <span class="token operator">+</span> b <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> |
It seems pretty neat, but let’s not jump to a conclusion, given the fact that most of our apps will build Fronend (FE) and Backend (BE) separately. Vue, React or Svelte are also mostly FE support, and with code like this, there’s nothing to say, as most of the logic will be handled on the BA side.
Now let’s go deeper, and we will learn some systax for more analysis
1. Props
Similar to React, but Svelte’s declaration of props is very simple
1 2 3 4 5 6 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> Nested <span class="token keyword">from</span> <span class="token string">'./Nested.svelte'</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> Nested answer <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">42</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
1 2 3 4 5 6 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">let</span> answer <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> We have <span class="token punctuation">{</span> answer <span class="token punctuation">}</span> <span class="token function">answer</span> <span class="token punctuation">(</span> s <span class="token punctuation">)</span> <span class="token punctuation">.</span> |
2. Logic
If-else
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">let</span> user <span class="token operator">=</span> <span class="token punctuation">{</span> loggedIn <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">toggle</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> user <span class="token punctuation">.</span> loggedIn <span class="token operator">=</span> <span class="token operator">!</span> user <span class="token punctuation">.</span> loggedIn <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token punctuation">{</span> # <span class="token keyword">if</span> <span class="token operator"><</span> condition <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token comment">//code</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token operator">:</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token operator"><</span> condition <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token comment">// code</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token operator">:</span> <span class="token keyword">else</span> <span class="token punctuation">}</span> <span class="token comment">//code</span> <span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token operator">/</span> <span class="token keyword">if</span> <span class="token punctuation">}</span> |
For example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">let</span> user <span class="token operator">=</span> <span class="token punctuation">{</span> loggedIn <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">toggle</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> user <span class="token punctuation">.</span> loggedIn <span class="token operator">=</span> <span class="token operator">!</span> user <span class="token punctuation">.</span> loggedIn <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token punctuation">{</span> # <span class="token keyword">if</span> user <span class="token punctuation">.</span> loggedIn <span class="token punctuation">}</span> <span class="token operator"><</span> button on <span class="token operator">:</span> click <span class="token operator">=</span> <span class="token punctuation">{</span> toggle <span class="token punctuation">}</span> <span class="token operator">></span> Log out <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">:</span> <span class="token keyword">else</span> <span class="token punctuation">}</span> <span class="token operator"><</span> button on <span class="token operator">:</span> click <span class="token operator">=</span> <span class="token punctuation">{</span> toggle <span class="token punctuation">}</span> <span class="token operator">></span> Log <span class="token keyword">in</span> <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">/</span> <span class="token keyword">if</span> <span class="token punctuation">}</span> |
Loop
1 2 3 4 | <span class="token punctuation">{</span> #each list_name <span class="token keyword">as</span> key_name <span class="token punctuation">[</span> <span class="token punctuation">,</span> index <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token comment">//</span> <span class="token punctuation">{</span> <span class="token operator">/</span> each <span class="token punctuation">}</span> |
Wait Block
Regarding systax logic, the wait block is the best part. Similar to try-catch structure. Wait Block allows us to build the logic that handles a promise. This is essential when FE interacts with the BA side.
1 2 3 4 5 6 7 8 | <span class="token punctuation">{</span> # <span class="token keyword">await</span> promise_name <span class="token punctuation">}</span> <span class="token comment">//code</span> <span class="token punctuation">{</span> <span class="token operator">:</span> then params <span class="token punctuation">}</span> <span class="token comment">//code</span> <span class="token punctuation">{</span> <span class="token operator">:</span> catch error <span class="token punctuation">}</span> <span class="token comment">// code</span> <span class="token punctuation">{</span> <span class="token operator">/</span> <span class="token keyword">await</span> <span class="token punctuation">}</span> |
In fact, code like this seems a bit wordy compared to systax draw gon 😕
huh?
3. Event
DOM Events
Svelte uses keyword on
, systax
1 2 | <span class="token operator"><</span> Component on <span class="token operator">:</span> event_name <span class="token operator">|</span> modifier <span class="token operator">=</span> <span class="token punctuation">{</span> function_name <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
Supported modifiers include:
- preventDefault – calls event.preventDefault () before running the handler. Useful for client-side form handling, for example.
- stopPropagation – calls event.stopPropagation (), preventing the event reaching the next element
- passive – scrolling performance on touch / wheel events (Svelte will add it automatically where it’s safe to do so)
- nonpassive – explicitly set passive: false
- capture – fires the handler during the capture phase instead of the bubbling phase ()
- once – remove the handler after the first time it runs
- self – only trigger handler if event.target is the element itself
For example:
1 2 | <button on:click|once={handleClick}>Click</button> |
This is similar to Vue
Event forwarding
If Vue supports $emit
, Svelte supports event forwarding.
Below is an example where we can define a dispatch event and call it using systax on:event_name
1 2 3 4 5 6 7 8 9 10 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> Inner <span class="token keyword">from</span> <span class="token string">'./Inner.svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">handleMessage</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">alert</span> <span class="token punctuation">(</span> event <span class="token punctuation">.</span> detail <span class="token punctuation">.</span> text <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> Inner on <span class="token operator">:</span> sendMessage <span class="token operator">=</span> <span class="token punctuation">{</span> handleMessage <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> createEventDispatcher <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> dispatch <span class="token operator">=</span> <span class="token function">createEventDispatcher</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">sayHello</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">dispatch</span> <span class="token punctuation">(</span> <span class="token string">'sendMessage'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> text <span class="token operator">:</span> <span class="token string">'Hello!'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> button on <span class="token operator">:</span> click <span class="token operator">=</span> <span class="token punctuation">{</span> sayHello <span class="token punctuation">}</span> <span class="token operator">></span> Click to say hello <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> |
4. Binding
Instead of using :binding_name=
shortened like Vue, here we have syntax bind:binding_name
1 2 | <span class="token operator"><</span> input bind <span class="token operator">:</span> value <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token punctuation">}</span> <span class="token operator">></span> |
It is syntactically similar to Vue, but Svelte has no support for shortened syntax.
5. Lifecycle
Svelte supports several functions for lifecycle such as:
- onMount: run after the first component is rendered
- onDestroy: runs when the component is destroyed
- beforeUpdate: runs before DOM updated.
- afterUpdate: runs after the DOM has been updated (it is part of the beforeUpdate).
onMount
This is one of the most commonly used functions of Svelte. Similar to React’s useEffect
or mounted
on Vue.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> onMount <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> photos <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token function">onMount</span> <span class="token punctuation">(</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">https://jsonplaceholder.typicode.com/photos?_limit=20</span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> photos <span class="token operator">=</span> <span class="token keyword">await</span> res <span class="token punctuation">.</span> <span class="token function">json</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> h1 <span class="token operator">></span> Photo album <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"photos"</span> <span class="token operator">></span> <span class="token punctuation">{</span> #each photos <span class="token keyword">as</span> photo <span class="token punctuation">}</span> <span class="token operator"><</span> figure <span class="token operator">></span> <span class="token operator"><</span> img src <span class="token operator">=</span> <span class="token punctuation">{</span> photo <span class="token punctuation">.</span> thumbnailUrl <span class="token punctuation">}</span> alt <span class="token operator">=</span> <span class="token punctuation">{</span> photo <span class="token punctuation">.</span> title <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> figcaption <span class="token operator">></span> <span class="token punctuation">{</span> photo <span class="token punctuation">.</span> title <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> figcaption <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> figure <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">:</span> <span class="token keyword">else</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">!</span> <span class="token operator">--</span> <span class="token keyword">this</span> block renders when photos <span class="token punctuation">.</span> length <span class="token operator">===</span> <span class="token number">0</span> <span class="token operator">--</span> <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> loading <span class="token operator">...</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">/</span> each <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
This one looks more like React, with Vue you don’t need to import anything
onDestroy
Similar destroyed
by Vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> onDestroy <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">onInterval</span> <span class="token punctuation">(</span> <span class="token parameter">callback <span class="token punctuation">,</span> milliseconds</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> interval <span class="token operator">=</span> <span class="token function">setInterval</span> <span class="token punctuation">(</span> callback <span class="token punctuation">,</span> milliseconds <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">onDestroy</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">clearInterval</span> <span class="token punctuation">(</span> interval <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> seconds <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> <span class="token function">onInterval</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> seconds <span class="token operator">+=</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">1000</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> The page has been open <span class="token keyword">for</span> <span class="token punctuation">{</span> seconds <span class="token punctuation">}</span> <span class="token punctuation">{</span> seconds <span class="token operator">===</span> <span class="token number">1</span> <span class="token operator">?</span> <span class="token string">'second'</span> <span class="token operator">:</span> <span class="token string">'seconds'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> |
beforeUpdate and afterUpdate
Unlike Vue, divided into beforeMount, beforeUpdate and updated, Svelte only has beforeUpdate and afterUpdate.
the beforeUpdate is executed just before the DOM is updated. afterUpdate is the opposite, it is used to run once when the DOM has synchronized data.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> Eliza <span class="token keyword">from</span> <span class="token string">'elizabot'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> beforeUpdate <span class="token punctuation">,</span> afterUpdate <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> div <span class="token punctuation">;</span> <span class="token keyword">let</span> autoscroll <span class="token punctuation">;</span> <span class="token function">beforeUpdate</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> autoscroll <span class="token operator">=</span> div <span class="token operator">&&</span> <span class="token punctuation">(</span> div <span class="token punctuation">.</span> offsetHeight <span class="token operator">+</span> div <span class="token punctuation">.</span> scrollTop <span class="token punctuation">)</span> <span class="token operator">></span> <span class="token punctuation">(</span> div <span class="token punctuation">.</span> scrollHeight <span class="token operator">-</span> <span class="token number">20</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">afterUpdate</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> autoscroll <span class="token punctuation">)</span> div <span class="token punctuation">.</span> <span class="token function">scrollTo</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">,</span> div <span class="token punctuation">.</span> scrollHeight <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> eliza <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Eliza</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> comments <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> author <span class="token operator">:</span> <span class="token string">'eliza'</span> <span class="token punctuation">,</span> text <span class="token operator">:</span> eliza <span class="token punctuation">.</span> <span class="token function">getInitial</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">handleKeydown</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> event <span class="token punctuation">.</span> key <span class="token operator">===</span> <span class="token string">'Enter'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> text <span class="token operator">=</span> event <span class="token punctuation">.</span> target <span class="token punctuation">.</span> value <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> text <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">;</span> comments <span class="token operator">=</span> comments <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> author <span class="token operator">:</span> <span class="token string">'user'</span> <span class="token punctuation">,</span> text <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> event <span class="token punctuation">.</span> target <span class="token punctuation">.</span> value <span class="token operator">=</span> <span class="token string">''</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> reply <span class="token operator">=</span> eliza <span class="token punctuation">.</span> <span class="token function">transform</span> <span class="token punctuation">(</span> text <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> comments <span class="token operator">=</span> comments <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> author <span class="token operator">:</span> <span class="token string">'eliza'</span> <span class="token punctuation">,</span> text <span class="token operator">:</span> <span class="token string">'...'</span> <span class="token punctuation">,</span> placeholder <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> comments <span class="token operator">=</span> comments <span class="token punctuation">.</span> <span class="token function">filter</span> <span class="token punctuation">(</span> <span class="token parameter">comment</span> <span class="token operator">=></span> <span class="token operator">!</span> comment <span class="token punctuation">.</span> placeholder <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> author <span class="token operator">:</span> <span class="token string">'eliza'</span> <span class="token punctuation">,</span> text <span class="token operator">:</span> reply <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">500</span> <span class="token operator">+</span> Math <span class="token punctuation">.</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">500</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">200</span> <span class="token operator">+</span> Math <span class="token punctuation">.</span> <span class="token function">random</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">200</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"chat"</span> <span class="token operator">></span> <span class="token operator"><</span> h1 <span class="token operator">></span> Eliza <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"scrollable"</span> bind <span class="token operator">:</span> <span class="token keyword">this</span> <span class="token operator">=</span> <span class="token punctuation">{</span> div <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">{</span> #each comments <span class="token keyword">as</span> comment <span class="token punctuation">}</span> <span class="token operator"><</span> article <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token punctuation">{</span> comment <span class="token punctuation">.</span> author <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> span <span class="token operator">></span> <span class="token punctuation">{</span> comment <span class="token punctuation">.</span> text <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> span <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> article <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">/</span> each <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> input on <span class="token operator">:</span> keydown <span class="token operator">=</span> <span class="token punctuation">{</span> handleKeydown <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
6. Store
writable
1 2 3 4 | <span class="token keyword">import</span> <span class="token punctuation">{</span> writable <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte/store'</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">const</span> count <span class="token operator">=</span> <span class="token function">writable</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Then, for use, we import them into svelte files.
1 2 | <span class="token keyword">import</span> <span class="token punctuation">{</span> count <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./stores.js'</span> <span class="token punctuation">;</span> |
This is essentially the syntax of declaring function js shared and this is not really a state, or a mutation like Vue. I think this is a mutation, but Svelte also has a readable that allows changing data export.
readable
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">import</span> <span class="token punctuation">{</span> readable <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte/store'</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">const</span> time <span class="token operator">=</span> <span class="token function">readable</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">Date</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token function">start</span> <span class="token punctuation">(</span> <span class="token parameter"><span class="token keyword">set</span></span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> interval <span class="token operator">=</span> <span class="token function">setInterval</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">set</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">Date</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">1000</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token keyword">function</span> <span class="token function">stop</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">clearInterval</span> <span class="token punctuation">(</span> interval <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Another syntax allows you to declare a function.
derived
The derived is the export data
1 2 3 4 5 | export const elapsed = derived( time, $time => Math.round(($time - start) / 1000) ); |
7. Component Action
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> <span class="token punctuation">{</span> spring <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte/motion'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> pannable <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./pannable.js'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> coords <span class="token operator">=</span> <span class="token function">spring</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> x <span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">,</span> y <span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> stiffness <span class="token operator">:</span> <span class="token number">0.2</span> <span class="token punctuation">,</span> damping <span class="token operator">:</span> <span class="token number">0.4</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">handlePanStart</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> coords <span class="token punctuation">.</span> stiffness <span class="token operator">=</span> coords <span class="token punctuation">.</span> damping <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"box"</span> use <span class="token operator">:</span> pannable on <span class="token operator">:</span> panstart <span class="token operator">=</span> <span class="token punctuation">{</span> handlePanStart <span class="token punctuation">}</span> style <span class="token operator">=</span> "transform <span class="token operator">:</span> <span class="token function">translate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> $coords <span class="token punctuation">.</span> x <span class="token punctuation">}</span> px <span class="token punctuation">,</span> <span class="token punctuation">{</span> $coords <span class="token punctuation">.</span> y <span class="token punctuation">}</span> px <span class="token punctuation">)</span> <span class="token function">rotate</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> $coords <span class="token punctuation">.</span> x <span class="token operator">*</span> <span class="token number">0.2</span> <span class="token punctuation">}</span> deg <span class="token punctuation">)</span> " <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
As you can see, Svelte’s action is declared with syntax
1 2 | on:<eventName>={functionName} |
Svelte’s store is not as clear and coherent as the flow of Nuxt or Redux Saga, but rather on pure js. It is easy to understand because Svelte renders code optimally to pure js and doesn’t use virtual DOM.
8. Component composition
slots
Similar slots
in Vue
1 2 3 4 | <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> slot name <span class="token operator">=</span> <span class="token string">"name"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> slot <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
1 2 3 4 5 6 7 8 9 10 11 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> ParentComponent <span class="token keyword">from</span> <span class="token string">'./ParentComponent.svelte'</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> ParentComponent <span class="token operator">></span> <span class="token operator"><</span> div slot <span class="token operator">=</span> <span class="token string">"name"</span> <span class="token operator">></span> <span class="token operator"><</span> h2 <span class="token operator">></span> Hello <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> h2 <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> This is an elment <span class="token punctuation">.</span> It can contain anything <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> ParentComponent <span class="token operator">></span> |
slot fallbacks – <em>
The <em>
tag allows you to insert the default child element for the slot.
1 2 3 4 5 6 | <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> slot name <span class="token operator">=</span> <span class="token string">"name"</span> <span class="token operator">></span> <span class="token operator"><</span> em <span class="token operator">></span> no content was provided <span class="token operator"><</span> <span class="token operator">/</span> em <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> slot <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
9. Special elements
One difference of Svelte is that some of the elements are quite special like:
<svelte:self>
<svelte:component>
<svelte:window>
<svelte:body>
<svelte:head>
<svelte:options>
<svelte:self>
Instead of writing
1 2 3 4 | <span class="token punctuation">{</span> # <span class="token keyword">if</span> file <span class="token punctuation">.</span> type <span class="token operator">===</span> <span class="token string">'folder'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> Folder <span class="token punctuation">{</span> <span class="token operator">...</span> file <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">/</span> <span class="token keyword">if</span> <span class="token punctuation">}</span> |
you can change to
1 2 3 4 | <span class="token punctuation">{</span> # <span class="token keyword">if</span> file <span class="token punctuation">.</span> type <span class="token operator">===</span> <span class="token string">'folder'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> svelte <span class="token operator">:</span> self <span class="token punctuation">{</span> <span class="token operator">...</span> file <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">/</span> <span class="token keyword">if</span> <span class="token punctuation">}</span> |
<svelte:component>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> RedThing <span class="token keyword">from</span> <span class="token string">'./RedThing.svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> GreenThing <span class="token keyword">from</span> <span class="token string">'./GreenThing.svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> BlueThing <span class="token keyword">from</span> <span class="token string">'./BlueThing.svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> options <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> color <span class="token operator">:</span> <span class="token string">'red'</span> <span class="token punctuation">,</span> component <span class="token operator">:</span> RedThing <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> color <span class="token operator">:</span> <span class="token string">'green'</span> <span class="token punctuation">,</span> component <span class="token operator">:</span> GreenThing <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> color <span class="token operator">:</span> <span class="token string">'blue'</span> <span class="token punctuation">,</span> component <span class="token operator">:</span> BlueThing <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> selected <span class="token operator">=</span> options <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> select bind <span class="token operator">:</span> value <span class="token operator">=</span> <span class="token punctuation">{</span> selected <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">{</span> #each options <span class="token keyword">as</span> option <span class="token punctuation">}</span> <span class="token operator"><</span> option value <span class="token operator">=</span> <span class="token punctuation">{</span> option <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">{</span> option <span class="token punctuation">.</span> color <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> option <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">/</span> each <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> select <span class="token operator">></span> <span class="token operator"><</span> svelte <span class="token operator">:</span> component <span class="token keyword">this</span> <span class="token operator">=</span> <span class="token punctuation">{</span> selected <span class="token punctuation">.</span> component <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
You can see, instead of having to check the selected component that is
1 2 3 4 5 6 7 8 | <span class="token punctuation">{</span> # <span class="token keyword">if</span> selected <span class="token punctuation">.</span> color <span class="token operator">===</span> <span class="token string">'red'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> RedThing <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">:</span> <span class="token keyword">else</span> <span class="token keyword">if</span> selected <span class="token punctuation">.</span> color <span class="token operator">===</span> <span class="token string">'green'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> GreenThing <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">:</span> <span class="token keyword">else</span> <span class="token keyword">if</span> selected <span class="token punctuation">.</span> color <span class="token operator">===</span> <span class="token string">'blue'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> BlueThing <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token operator">/</span> <span class="token keyword">if</span> <span class="token punctuation">}</span> |
then you just need to use <svelte:component>
.
<svelte:window>
This element allows you to add some events to the window such as:
- innerWidth
- innerHeight
- outerWidth
- outerHeight
- scrollX
- scrollY
- online – an alias for window.navigator.onLine
For example
1 2 | <span class="token operator"><</span> svelte <span class="token operator">:</span> window bind <span class="token operator">:</span> scrollY <span class="token operator">=</span> <span class="token punctuation">{</span> y <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
<svelte:body>
Similar to <svelte:window>
, <svelte:body>
allows you to set listen events for documment.body
1 2 3 4 5 | <span class="token operator"><</span> svelte <span class="token operator">:</span> body on <span class="token operator">:</span> mouseenter <span class="token operator">=</span> <span class="token punctuation">{</span> handleMouseenter <span class="token punctuation">}</span> on <span class="token operator">:</span> mouseleave <span class="token operator">=</span> <span class="token punctuation">{</span> handleMouseleave <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
<svelte:head>
This element allows you to insert elements into <head>
1 2 3 4 5 6 | <span class="token operator"><</span> svelte <span class="token operator">:</span> head <span class="token operator">></span> <span class="token operator"><</span> link rel <span class="token operator">=</span> <span class="token string">"stylesheet"</span> href <span class="token operator">=</span> <span class="token string">"tutorial/dark-theme.css"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> svelte <span class="token operator">:</span> head <span class="token operator">></span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello world <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> |
<svelte:options>
Similar to Vue and React, Svelte lets you declare off options instead
1 2 3 | <span class="token operator"><</span> MyComponent immutable <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> MyOtherComponent immutable <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> name <span class="token operator">=</span> <span class="token string">'name'</span> type <span class="token operator">=</span> <span class="token string">'basic'</span> <span class="token operator">/</span> <span class="token operator">></span> |
you can write that
1 2 3 4 5 6 7 | attrs <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> <span class="token string">'name'</span> <span class="token punctuation">,</span> type <span class="token operator">:</span> <span class="token string">'basic'</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> MyComponent immutable <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> MyOtherComponent <span class="token punctuation">{</span> attrs <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
Through the parts I learned about Svelte in the tutorial, it seems that Svelte is fine, quite similar to Vue.
Plus mark:
- Neat code
- Performance is guaranteed to be high by running at build time and converting components into optimal command code that updates the DOM more quickly.
- Suitable for pre-learning Vue and React because its syntax is short and relatively easy to understand.
Minus point:
- Flow Store is not tight and clear
- Little support library
References: https://svelte.dev/tutorial