svelte返璞歸真

Svelte 的核心思想在于『通過靜態編譯減少框架運行時的代碼量』。通俗來說,用svelte寫的代碼,經過編譯處理,轉化成了真正的js,不需要引入相應的庫,不像vue項目需要引入vue.js、用寫jQuery代碼需要引入jQuery

三大框架(vue/react/angular)已經趨于成熟,為何會出現svelte?假如我們寫了以下代碼:

<h1>{title}</h1>

目的是:title作為h1初始內容,當title發生變化時h1內容跟著更新。想要實現這一目標,最簡單的方法就是直接渲染出 HTML,然后設置到innerHTML 中,但是當模板結構復雜時會帶來很嚴重的性能問題。

虛擬DOM就是用來解決此種方案性能問題的,當狀態發生變化時,新舊虛擬DOM樹進行對比,然后只將少數差異的部分 patch 到真實 DOM 上,就能極大地提高性能。

這段代碼就是要動態更新h1標簽內容而已,每次數據發生變化都要生成新的DOM樹->diff->patch,不是很有必要!

接下來看看svelte的騷操作,它會將這段模板編譯成下面這段js

function renderMainFragment ( root, component, target ) {
  var node = document.createElement( 'h1' );

  var text = document.createTextNode( root.title );
  node.appendChild( text );

  target.appendChild( node )

  return {
    update( changed, root ) {
      //數據變化時更新文本節點內容
      text.data = root.title;
    },

    teardown: function ( detach ) {
      //銷毀時移除節點
      if ( detach ) node.parentNode.removeChild( node );
    }
  };
}

通過上面的描述,相信大家對svelte有一定了解了,接下來一睹芳容。
想快速嘗鮮的可以去官網coding online 網址:svelte.dev
下面簡單介紹框架的核心概念:

1.文件結構(以.svelte為后綴)
<script>
  //js中的根變量即為狀態 可在模板中插值
  let title="hello svelte"
</script>

<style>
  p {
    color: purple;
    font-family: 'Comic Sans MS', cursive;
    font-size: 2em;
  }
</style>

<h1>{title}</h1>
2.屬性插值
<script>
  let src = 'tutorial/image.gif';
  let name = 'Rick Astley';
</script>

<!-- {src} 是 src={src} 的簡寫 -->
<img {src} alt="{name} dancing">
3.標簽插值解析HTML
<script>
  let text = `<strong>重要內容</strong>`;
</script>

<p>{@html text}</p>
4.條件語句
<script>
  let login=true
</script>

{#if login}
  <button>
    退出登錄
  </button>
{/if}

{#if !login}
  <button>
    登錄
  </button>
{/if}
5.遍歷
<script>

  let list = [
    { id: 1, color: '#0d0887' },
    { id: 2, color: '#6a00a8' },
    { id: 3, color: '#b12a90' },
    { id: 4, color: '#e16462' },
    { id: 5, color: '#fca636' }
  ];
</script>

<ul>
  <!-- item:值  index:索引  小括號內:key -->
  {#each list as item,index (item.id)}
      <li>{item.color}-----{index}</li>
  {/each}
</ul>
6.事件處理
<script>
  let m = { x: 0, y: 0 };

  function handleMousemove(event) {
    m.x = event.clientX;
    m.y = event.clientY;
  }
</script>

<style>
  div { width: 100%; height: 100%; }
</style>

<div on:mousemove={handleMousemove}>
  The mouse position is {m.x} x {m.y}
</div>
7.分割組件
<!-- -----list.svelte -->
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<!-- -----app.svelte -->
<script>
  //組件首字母大寫
  import List from './list.svelte';
</script>
<List/>
8.組件傳值 props
<!-- -----child.svelte -->
<script>
  export let title;
  //可以指定默認值
  //export let title=123
</script>
<h1>
  {title}
</h1>
<!-- -----app.svelte -->
<script>
  //組件首字母大寫
  import Child from './child.svelte';
</script>
<Child title="hello svelte"/>
9.自定義事件
<!-- -----app.svelte -->
<script>
  import Inner from './Inner.svelte';

  function handleMessage(event) {
    alert(event.detail.text);
  }
</script>

<Inner on:message={handleMessage}/>
<!-- -----Inner.svelte -->
<script>
  import { createEventDispatcher } from 'svelte';

  const dispatch = createEventDispatcher();

  function sayHello() {
    dispatch('message', {
      text: 'Hello!'
    });
  }
</script>

<button on:click={sayHello}>
  Click to say hello
</button>
10.表單雙向綁定
<script>
  let name = '';
</script>

<input bind:value={name} placeholder="enter your name">
<p>Hello {name || 'stranger'}!</p>
<script>
  let yes = false;
</script>

<label>
  <input type=checkbox bind:checked={yes}>
  {yes}
</label>
<script>
  let questions = [
    { id: 1, text: `Where did you go to school?` },
    { id: 2, text: `What is your mother's name?` },
    { id: 3, text: `What is another personal fact that an attacker could easily find with Google?` }
  ];

  let selected;

  let answer = '';
</script>
<select bind:value={selected}>
  {#each questions as question}
    <option value={question.text}>
      {question.text}
    </option>
  {/each}
</select>
<h1>{selected}</h1>
11.生命周期函數

onMount

<script>
  import { onMount } from 'svelte';

  let list = [];

  let getData = async ()=>{
    let res = await ajax("/getData") ;
    list=res.data;
  }
  //掛在完成 可用于請求初始化數據
  onMount(async () => {
    getData();
  });
</script>

tick 狀態變化DOM更新之后

<script>
  import { tick } from 'svelte';

  let num=1 

  let handle = async (e)=>{
    num++;
    console.log(e.target.innerText) //1;
    await tick();
    console.log(e.target.innerText) //2;
  } 
</script>

<button on:click="{handle}">{num}</button>
640.gif
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374