聊聊Svelte.js技术它做了什么以及如何实现的(下)

聊聊Svelte.js技术它做了什么以及如何实现的(下)

一. 循环语句

     循环渲染这个我们肯定是离不开了, Svelte.js给我们提供了有趣的书写方式。



    {#each arr as item}
  • {item}
  • {/each}

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第1张图片

     虽然Svelte.js没有虚拟dom, 但是循环的时候也需要key, 它的写法有点特殊。



    {#each arr as item, i (i)}
  • {i} --- {item}
  • {/each}

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第2张图片

     上面的(i)就是key值, i是序号必须使用,item隔开。

二. 循环语句编译成什么

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第3张图片
初始化就一个变量这个没啥说的。
聊聊Svelte.js技术它做了什么以及如何实现的(下)_第4张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第5张图片

     图二的ctx是个素组, ctx[0]是我们定义的arr, ctx[1]是当前li对应的值。

三. 循环语句如何处理key

下面是设置了key的循环体编译后的代码。
聊聊Svelte.js技术它做了什么以及如何实现的(下)_第6张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第7张图片

我们重点看下更新dom数据的时候key是怎么工作的。

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第8张图片

其实在Svelte.js里面也需要diff算法来更新dom, 这个点需要明确。

四. 父子组件

父组件

/src/App.svelte



父组件

子组件

/src/子组件.svelte



子组件: {options.msg}

footer1: {footer1}

footer2: {footer2}

  1. 子组件直接import引入子组件即可使用。
  2. 父组件行间传递参数, 子组件export接收。
  3. 父组件可使用扩展运算符传递参数。
  4. 父组件on:emit={handleEmit}的形式监听子组件发布的事件。
  5. 子组件引入createEventDispatcher实现事件的发布。
  6. 子组件可以随便改变传递过来的值, 不会影响该值在父组件内的值(重点)。
  7. 父组件传递给子组件的值的改变, 会重新渲染子组件。

五. 父子组件打包分析

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第9张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第10张图片

六. 样式

     在Svelte.js里面样式是默认沙盒的, 也就是说我们在一个.svelte文件里面写的样式不会渗透到全局。
     很方便很爽的一点是我们不用模板字符串的方式拼接, 这样写样式真爽。



文字1

文字2

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第11张图片

class:black={isBlack}的意思就是只有isBlacktrue才会赋予black这个className。

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第12张图片

如果要设置全局样式可以在html或者main.js文件里面引入。

七. 生命周期

     生命周期的概念现在基本所有库都有, svelte在这一点做的也很不错。

  1. onMount 将在组件首次呈现到DOM之后运行。
  2. onDestroy 当销毁组件时调用。
  3. beforeUpdate 在DOM更新前运行。
  4. afterUpdate 在DOM更新后运行。

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第13张图片

注意生命周期可以多次调用如下:

  onMount(() => {
    console.log('mounted1');
  });

  onMount(() => {
    console.log('mounted2');
  });

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第14张图片

八. 异步请求

     异步请求与组件结构的融合设置, 比如我们平时些项目要为不同dom块写loading效果, 这样就要有n个loading变量, 而下面的方法会使我们少定义一些变量。



{#await ajax()}

...loading

{:then res}

res: {res}

{/await}

     效果为请求中显示loading, 请求完显示内容, 后面还可以加一个{:catch err}标签, 但是在这里处理错误其实不太好。

打包代码的样子

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第15张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第16张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第17张图片

handle_promise方法里面, 如果判断我们传入的是promise则替我们执行promise并把结果赋予上去, 他还有其他复杂操作我们不用深究。
聊聊Svelte.js技术它做了什么以及如何实现的(下)_第18张图片

     看起来挺实用的写法其实也不太实用。

九. 计算属性

     你可以在 JavaScript 中用标识符标记一个语句,如下所示:$: foo = bar。它会在 foo = bar 语句中添加一个名为 $ 的标识符(如果之前未定义 foo,则严格模式下会出错)。
     所以在这种情况下,当 Svelte 看到任何带有 $: 前缀的语句时,它就知道左边的变量要从右边的变量中获取值。我们现在有了一种方法可以将一个变量的值绑定到另一个变量。

在js里面直接编写是不会报错的, 长知识了原来我们可以利用这点, 开发自己的编译器来创造新的语法规则:
聊聊Svelte.js技术它做了什么以及如何实现的(下)_第19张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第20张图片

计算属性的用法:


上述的nn就永远等于n*2

打包后如何实现的

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第21张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第22张图片

十. 观察者



聊聊Svelte.js技术它做了什么以及如何实现的(下)_第23张图片

  1. 最开始大括号的内容默认会执行一次。
  2. 大括号内的值如果发生变化就导致大括号里的代码整体执行一次。
  3. $:可以标示条件语句。
打包后的代码

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第24张图片

不得不佩服svelte把标识符玩的很出彩。

十一. 动画

第一种: 自带动画(淡入淡出)




{#if visible}
  
第一种
{/if}
  1. 第一要引入动画fade
  2. 标签定义transition:fade
第二种自定义动画




{#if visible}
  
自定义
{/if}
  1. in:whoosh指定了动画使用whoosh函数。
  2. whoosh返回的是动画的延迟时间、执行时间、以及css效果等等。

这个就不讨论打包文件了。

十二. 输入框双向绑定



value: {value}

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第25张图片

打包文件

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第26张图片

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第27张图片

做法也比较强硬, 就是

十三. vue里面使用svelte组件

     svelte的一大优势就是跨平台, 它可以使用在任何框架内, 因为他就是原生js代码, 这里看下我们如何在vue项目中使用它。



/src/main.js

import App from './App.svelte';
export default App;

     这里是把我们简单写个点击事件的代码打包, yarn build 之后把bundle.js复制到名为xxx的文件夹中的index.js文件中, 放到目标工程的node_modules, 这是为了模拟真实的使用场景。

index.js文件我们要处理一下, 方便导出。

改装前

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第28张图片

改装后

聊聊Svelte.js技术它做了什么以及如何实现的(下)_第29张图片

具体的使用方式

十四. 技术选型

     平时开发怎么可能两个技术混合使用, 比如我用vue开发已经引入了vue的runtime就没必要在使用这门技术了, 但是如果你是用svelte开发了一些跨平台的兼容性特别好的组件还是可以考虑使用svelte来做的, 这样不管是react还是vue都可以方便使用你的组件。

    要注意在工程体量较小的时候svelte确实有优势的, 但是逻辑复杂之后就不太好用了, 我们看了它的打包文件的写法就能得知它在打包后必然会出现大量的逻辑代码, 所以逻辑多到一定程度后其实性能不一定比runtime的形式好了。

end.

     这次就是这样, 希望和你一起进步。

你可能感兴趣的:(聊聊Svelte.js技术它做了什么以及如何实现的(下))