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阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268