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

聊聊Svelte.js技术它做了什么以及如何实现的(下) 一. 循环语句
???? 循环渲染这个我们肯定是离不开了, Svelte.js给我们提供了有趣的书写方式。

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

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

???? 虽然Svelte.js没有虚拟dom, 但是循环的时候也需要key, 它的写法有点特殊。
    {#each arr as item, i (i)}
  • {i} --- {item}
  • {/each}

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

???? 上面的(i)就是key值, i是序号必须使用,item隔开。
二. 循环语句编译成什么
聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

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

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

???? 图二的ctx是个素组, ctx[0]是我们定义的arr, ctx[1]是当前li对应的值。
三. 循环语句如何处理key
下面是设置了key的循环体编译后的代码。
聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

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

我们重点看下更新dom数据的时候key是怎么工作的。
聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

其实在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技术它做了什么以及如何实现的(下)
文章图片

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

六. 样式
【聊聊Svelte.js技术它做了什么以及如何实现的(下)】???? 在Svelte.js里面样式是默认沙盒的, 也就是说我们在一个.svelte文件里面写的样式不会渗透到全局。
???? 很方便很爽的一点是我们不用模板字符串的方式拼接, 这样写样式真爽。
文字1
文字2
p { color: blueviolet; font-size: 29px; font-weight: 800; } .black { border: 1px solid black; }

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

class:black={isBlack}的意思就是只有isBlacktrue才会赋予black这个className。
聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

如果要设置全局样式可以在html或者main.js文件里面引入。 七. 生命周期
???? 生命周期的概念现在基本所有库都有, svelte在这一点做的也很不错。

  1. onMount 将在组件首次呈现到DOM之后运行。
  2. onDestroy 当销毁组件时调用。
  3. beforeUpdate 在DOM更新前运行。
  4. afterUpdate 在DOM更新后运行。
聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

注意生命周期可以多次调用如下:
onMount(() => { console.log('mounted1'); }); onMount(() => { console.log('mounted2'); });

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

八. 异步请求
???? 异步请求与组件结构的融合设置, 比如我们平时些项目要为不同dom块写loading效果, 这样就要有n个loading变量, 而下面的方法会使我们少定义一些变量。
{#await ajax()}...loading
{:then res}res: {res}
{/await}

???? 效果为请求中显示loading, 请求完显示内容, 后面还可以加一个{:catch err}标签, 但是在这里处理错误其实不太好。
打包代码的样子 聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

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

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

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

???? 看起来挺实用的写法其实也不太实用。
九. 计算属性
???? 你可以在 JavaScript 中用标识符标记一个语句,如下所示:$: foo = bar。它会在 foo = bar 语句中添加一个名为 $ 的标识符(如果之前未定义 foo,则严格模式下会出错)。
???? 所以在这种情况下,当 Svelte 看到任何带有 $: 前缀的语句时,它就知道左边的变量要从右边的变量中获取值。我们现在有了一种方法可以将一个变量的值绑定到另一个变量。
在js里面直接编写是不会报错的, 长知识了原来我们可以利用这点, 开发自己的编译器来创造新的语法规则:
聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

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

计算属性的用法:

上述的nn就永远等于n*2
打包后如何实现的 聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

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

十. 观察者

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

  1. 最开始大括号的内容默认会执行一次。
  2. 大括号内的值如果发生变化就导致大括号里的代码整体执行一次。
  3. $:可以标示条件语句。
打包后的代码 聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

不得不佩服svelte把标识符玩的很出彩。
十一. 动画
第一种: 自带动画(淡入淡出)
{#if visible} 第一种 {/if}

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

  1. in:whoosh指定了动画使用whoosh函数。
  2. whoosh返回的是动画的延迟时间、执行时间、以及css效果等等。
这个就不讨论打包文件了。
十二. 输入框双向绑定
value: {value}

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

打包文件 聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

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

做法也比较强硬, 就是
十三. 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技术它做了什么以及如何实现的(下)
文章图片

改装后 聊聊Svelte.js技术它做了什么以及如何实现的(下)
文章图片

具体的使用方式

十四. 技术选型
???? 平时开发怎么可能两个技术混合使用, 比如我用vue开发已经引入了vue的runtime就没必要在使用这门技术了, 但是如果你是用svelte开发了一些跨平台的兼容性特别好的组件还是可以考虑使用svelte来做的, 这样不管是react还是vue都可以方便使用你的组件。
????要注意在工程体量较小的时候svelte确实有优势的, 但是逻辑复杂之后就不太好用了, 我们看了它的打包文件的写法就能得知它在打包后必然会出现大量的逻辑代码, 所以逻辑多到一定程度后其实性能不一定比runtime的形式好了。
end.
???? 这次就是这样, 希望和你一起进步。

    推荐阅读