脚手架

Vite:vite是集成了svelte,初始化的时候选择svelte就行了。

  1. npm init vite

SvelteKit:底层基于vite的更上层框架,类似于nextjs。

  1. npm create svelte@latest my-app
  2. cd my-app
  3. npm install
  4. npm run dev

.svelte文件结构

和vue类似svelte文件是.svelte结尾的文件,比如demo.svelte。代码结构:

  1. <script>
  2. let name = 'hello world';
  3. </script>
  4. <div class="name">
  5. {name}
  6. </div>
  7. <style>
  8. .name {
  9. color: red;
  10. }
  11. </style>

模版绑定

绑定变量

  1. <script>
  2. let name = 'world';
  3. </script>
  4. <h1>Hello {name}!</h1>

绑定属性

  1. <script>
  2. let src = '/tutorial/image.gif';
  3. let name = '张三';
  4. </script>
  5. <img {src} alt="{name} dances.">

绑定事件

  1. <script>
  2. let count = 0;
  3. function incrementCount() {
  4. count += 1;
  5. }
  6. </script>
  7. <button on:click={incrementCount}>
  8. Clicked {count} {count === 1 ? 'time' : 'times'}
  9. </button>

$:类似于vue的computed。例如:

  1. <script>
  2. let count = 0;
  3. // 定义一个名字叫doubled的变量,当count的值改变时,doubled会改变。doubled变量时响应式的。
  4. $: doubled = count * 2;
  5. // 直接这样写d2不是响应式的。
  6. let d2 = count * 2;
  7. $: if (count >= 10) {
  8. alert('count is dangerously high!');
  9. count = 9;
  10. }
  11. $: {
  12. console.log('the count is ' + count);
  13. alert('I SAID THE COUNT IS ' + count);
  14. }
  15. function handleClick() {
  16. count += 1;
  17. }
  18. </script>
  19. <button on:click={handleClick}>
  20. Clicked {count} {count === 1 ? 'time' : 'times'}
  21. </button>
  22. <p>{count} doubled is {doubled}</p>
  23. <p>
  24. t2 is {d2}
  25. </p>

为什么d2变量不是响应式的,我们会在 svelte响应式原理里面解释。

if/else

  1. <script>
  2. let user = { loggedIn: false };
  3. function toggle() {
  4. user.loggedIn = !user.loggedIn;
  5. }
  6. </script>
  7. <div>
  8. {#if user.loggedIn}
  9. <button on:click={toggle}>
  10. Log out
  11. </button>
  12. {:else}
  13. <button on:click={toggle}>
  14. Log in
  15. </button>
  16. {/if}
  17. </div>

each遍历

  1. <script>
  2. let cats = [
  3. { id: 'J---aiyznGQ', name: 'Keyboard Cat' },
  4. { id: 'z_AbfPXTKms', name: 'Maru' },
  5. { id: 'OUtn3pvWmpg', name: 'Henri The Existential Cat' }
  6. ];
  7. </script>
  8. <h1>The Famous Cats of YouTube</h1>
  9. <ul>
  10. {#each cats as { id, name }, i}
  11. <li><a target="_blank" href="https://www.youtube.com/watch?v={id}" rel="noreferrer">
  12. {i + 1}: {name}
  13. </a></li>
  14. {/each}
  15. </ul>

await

  1. <script>
  2. async function getRandomNumber() {
  3. const res = await fetch(`/tutorial/random-number`);
  4. const text = await res.text();
  5. if (res.ok) {
  6. return {val: text};
  7. } else {
  8. throw new Error(text);
  9. }
  10. }
  11. let promise = getRandomNumber();
  12. function handleClick() {
  13. promise = getRandomNumber();
  14. }
  15. </script>
  16. <button on:click={handleClick}>
  17. generate random number
  18. </button>
  19. {#await promise}
  20. <p>...waiting</p>
  21. {:then res}
  22. <p>The number is {res.val}</p>
  23. {:catch error}
  24. <p style="color: red">{error.message}</p>
  25. {/await}

双向数据流

  1. <script>
  2. let name = 'world';
  3. $:
  4. </script>
  5. <input bind:value={name}>
  6. <h1>Hello {name}!</h1>

组件

使用子组件和父子组件通信

App.svelte

  1. <script lang="ts">
  2. import Child from './child.svelte';
  3. var num = 1;
  4. var obj = {
  5. count: 1
  6. }
  7. function handleAdd() {
  8. num = num + 1;
  9. obj.count = obj.count + 1;
  10. }
  11. function handleReset(event) {
  12. num = event.detail.val;
  13. obj.count = event.detail.val;
  14. }
  15. </script>
  16. <div>
  17. 我是父组件
  18. <button on:click={handleAdd}>add num</button>
  19. // 也支持...的语法
  20. <Child count={num} on:reset={handleReset} />
  21. <Child {...obj} on:reset={handleReset} />
  22. </div>

Child.svelte

  1. <script>
  2. import { createEventDispatcher } from 'svelte';
  3. export let count;
  4. const dispatch = createEventDispatcher();
  5. function handleReset() {
  6. dispatch('reset', {
  7. val: 0
  8. });
  9. }
  10. </script>
  11. <div>
  12. <p>我是子组件,count is {count}</p>
  13. <button on:click={handleReset}>reset count</button>
  14. </div>

组件中使用双向数据流

App.svelte

  1. <script>
  2. import Child from './child.svelte';
  3. var name;
  4. </script>
  5. <p>
  6. name is {name}
  7. </p>
  8. <Child bind:name />

Child.svelte

  1. <script>
  2. export let name;
  3. </script>
  4. <div>
  5. <input bind:value={name} />
  6. </div>

插槽

App.svelte

  1. <script>
  2. import Child from './child.svelte';
  3. </script>
  4. <Child>
  5. <p>i am from App</p>
  6. <p slot="tool">i am tool</p>
  7. </Child>

Child.svelte

  1. <div>
  2. <slot />
  3. <slot name="tool" />
  4. </div>

生命周期

onMount、onDestroy、beforeUpdate、afterUpdate

  1. <script>
  2. import { onMount, onDestroy, beforeUpdate, afterUpdate } from 'svelte';
  3. onMount(() => {
  4. //...
  5. });
  6. onDestroy(() => {
  7. //...
  8. });
  9. beforeUpdate(() => {
  10. //...
  11. });
  12. afterUpdate(() => {
  13. //...
  14. });
  15. </script>
  16. <h1>Photo album</h1>

svelte的一些基础demo的更多相关文章

  1. Qwt开发笔记(一):Qwt简介、下载以及基础demo工程模板

    前言   QWT开发笔记系列整理集合,这是目前使用最为广泛的Qt图表类(Qt的QWidget代码方向只有QtCharts,Qwt,QCustomPlot),使用多年,系统性的整理,本系列旨在系统解说并 ...

  2. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  3. [spring security] spring security 4 基础Demo

    依赖包: <properties> <junit.version>4.11</junit.version> <spring.version>4.1.6. ...

  4. iOS开发-UI基础Demo

    现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...

  5. ios socket(基础demo)

    http://blog.sina.com.cn/s/blog_7a2f0a830101ecv4.html clinetSocket 1.viewcontroller.h @interface View ...

  6. [jquery] jQuery jsTree V3.2.1 基础Demo

    引入对应的文件: <link rel="stylesheet" href="../dist/themes/default/style.min.css" / ...

  7. Sencha 基础Demo测试,三种showView的方法

    直接贴代码吧 Ext.define("build.controller.MainController",{ extend:"Ext.app.Controller" ...

  8. webpack学习(二):先写几个webpack基础demo

    一.先写一个简单demo1 1-1安装好webpack后创建这样一个目录: 1-2:向src各文件和dist/index.html文件写入内容: <!DOCTYPE html> <h ...

  9. java多线程 基础demo

    join()   让主进程等待子进程全部执行完 例子如下:   package mocker; public class TestThread5 extends Thread {      priva ...

  10. Groovy语言学习--语法基础(4)

    语法基础到此就结束了,毕竟其和Java许多地方并无差别.groovy作为脚本,是为了能更好地随业务变化调整规则,我根据自己对规则的理解 通过一张图简单描述一个groovy脚本场景:由于货币膨胀,经济收 ...

随机推荐

  1. 关于MySQL获取自增ID的几种方法

    1. Select Max(id) From Table; 通过取表字段最大值的方式来获取最近一次自增id 缺点: 这种方法在多人操作数据库的软件上不可靠, 举个例子, 你刚插入一条记录. 当你在查询 ...

  2. 破局DevOps|8大北极星指标指引研发效能方向

    放弃那些动辄就上百个的研发度量指标吧,8大北极星指标指引你的研发效能方向,1个北极星指标公式让你清晰了解​公司研发效能现状. 每当研发效能/DevOps业务做规划的时候,有的人就会毫无头绪,不知道如何 ...

  3. 基于 ActionFilters 的限流库DotNetRateLimiter使用

    前言 在构建API项目时,有时出于安全考虑,防止访问用户恶意攻击,希望限制此用户ip地址的请求次数,减轻拒绝服务攻击可能性,也称作限流.接下来,我们就来学习开源库DotNetRateLimiter 如 ...

  4. 20230919 .NET面经

    SQL IQuerable 和 IEnumerable 的主要区别? https://stackoverflow.com/questions/252785/what-is-the-difference ...

  5. Solution -「洛谷 P2044」「NOI 2012」随机数生成器

    Description Link. 给你一个递推式,让你求某一项的值模上 \(g\). Solution 这道题正解是矩阵.我这里给出一种分治的做法. 题目中说 $\ \ \ \ \ \ \ $ $\ ...

  6. Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】

    〇.简介 1.什么是桥接模式? 一句话解释:   通过一个类的抽象,与另一个类的抽象关联起来,当做桥.此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来. 桥接,顾名思义就是用桥来 ...

  7. Linux第一次周总结

    第一章  初识 Linux 1.Linux简介 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统 ...

  8. Anaconda虚拟环境配置Python库与Spyder编译器

      本文介绍在Anaconda中,为Python的虚拟环境安装第三方库与Spyder等配套软件的方法.   在文章创建Anaconda虚拟Python环境的方法中,我们介绍了在Anaconda环境下, ...

  9. P8684 [蓝桥杯 2019 省 B] 灵能传输 题解

    P8684 [蓝桥杯 2019 省 B] 灵能传输 题解 Part 1 提示 题目传送门 欢迎大家指出错误并私信这个蒟蒻 欢迎大家在下方评论区写出自己的疑问(记得 @ 这个蒟蒻) Part 2 更新日 ...

  10. 14.11 Socket 基于时间加密通信

    在之前的代码中我们并没有对套接字进行加密,在未加密状态下我们所有的通信内容都是明文传输的,这种方式在学习时可以使用但在真正的开发环境中必须要对数据包进行加密,此处笔者将演示一种基于时间的加密方法,该加 ...