2021年9月svelte中文教程

前期准备

安装node.js最新版本

开发工具

vscode 或者webstorm

创建项目

cd到要创建的目录下

vite创建

使用 NPM:

$ npm init vite@latest

使用 Yarn:

$ yarn create vite

使用 PNPM:

$ pnpx create-vite

项目创建好之后选择svelte模板,选择js或者ts模板


svelte创建.jpg

ts选择.png

cd到创建好的项目目录下,安装依赖

npm install

安装好后,运行项目

npm run dev

没有报错后会运行在 http://localhost:3000/

ps:有报错的再次npm install

打开http://localhost:3000/ 看下默认项目效果

svelte默认主页.gif

我们看到的是一个可点击的按钮效果,其实这是一个svelte组件做的,里面包含了html+css+js。

项目结构

因为这是vite打包工具创建的,里面的一些设置这里不再提及,感兴趣自己去看

我们从svelte用法切入。

main.ts和index.html

main.ts

import App from './App.svelte'//从svelte引入App类

const app = new App({   //实例化一个App类,名为app
  target: document.getElementById('app')//将其挂载在到id='app'的元素上
})

export default app//抛出app

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Svelte + TS + Vite App</title>
  </head>
  <body>
<!--    App.svelte的内容将呈现在id='app'的元素内-->
    <div id="app"></div>
<!--关联main.ts-->
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

组件

svelte组件,首字母大写,后缀名.svelte

<script> </script>
<main></main>
<style></style>

组件是由三部分组成,就是典型的html:js+css+html

我们写svelte就像写html一样容易
另外还有一个特性就是组件里的js,css只在组件内生效,不会影响到其它也面或者组件

组件的引用和使用

写好的组件不用做任何的抛出处理

需要引用组件的svelte文件,需要引入子组件。如默认模板中根组件,引入Count组件

<script lang="ts">
  import logo from './assets/svelte.png'
  import Counter from './lib/Counter.svelte'//在这里引入count组件
</script>

然后在下面使用 用组件名标签/表示

<main>
  <img src={logo} alt="Svelte Logo" />
  <h1>Hello Typescript!</h1>
    /*在这边直接使用*/
  <Counter />  
</main>  

热加载功能

我们在用svelte开发的时候,vite提供了热加载功能,也就是说你改变了代码,网页就会自动刷新,大大提高了开发效率

模板

在使用svelte开发网页的时候应当将数据和元素标签分开写

数据写在script标签中

元素单独写

如下一个简单的示例

<script>
    let msg='it is a good day'
</script>
<style>
    h1{
        color:blue;
    }
</style>
<h1>{msg}</h1>

它的效果其实就是

<style>
    h1{
        color:blue;
    }
</style>
<h1>it is a good day</h1>

对了就是用{}来渲染数据

属性模板

我们知道每个元素标签是用很多属性的,比如最常用的class id等

我们看下svelte是怎么实现的

<script>
    let msg='it is a good day'
    let msgclass='one'
</script>
<style>
    .one{
        color:red;
        width: 200px;
        border: 1px blue solid;
        border-radius: 10%;
    }
</style>
<h1 class={msgclass}>{msg}</h1>

首先我们看到h1标签的class=一个带有{}数据,而msgclass是一个模板数据,它对应的是变量one,渲染之后就是class='one'

最后效果和我们单独写html是一样的


动态属性

其它的标签属性也是同样可以按照这样的方式来绑定

HTML模板

如果我们想要把HTML元素渲染,如果按照{}的方法就会原样输出

这时候我们就要用到{@html }来渲染了

例子:

<script>
    let msgh1 = `<h1>good day</h1>
    <h2>nice</h2>`;
</script>

<div>{@html msgh1}</div>

最后显示效果


html渲染

我们发现里面的内容是按html的文档来渲染了

事件模板

js有很多事件可以调用html元素,如click,mouse等等

我们看下模板是怎么写的

<script>
   let a=0 
   function add(){
       a++
   }
</script>

<p>a的值为:{a}</p>
<button on:click={add}>+</button>

和原生js一样,我们先写个add方法。只不过绑定的方法要比原生来的简便

我们直接在要绑定事件的元素上面写上on:+时间名,={}里面写方法名就可以,让我们来看下最后效果


svelte事件.gif

反应性能力

有了前面的基础,我们就可以来接触svelte里面很重要的一个知识点,反应性能力

首先看个示例组件

<script>
   let a=0 
   $: doublea=a*2
   function add(){
       a++
   }
</script>

<p>a的值为:{a}</p>
<p>a的2倍为:{doublea}</p>
<button on:click={add}>+</button>

先看下效果


svelte反应性能力.gif

没错,a的值+1的时候,doublea会重新计算下自己的值,因为在定义的时候是$: 开头的

只要$: 里的变量发生改变的时候,整个就会重新执行一次,这就是反应性能力

逻辑

我们都知道js里的逻辑运算,如 if(判断) for(循环)

svelte也带有这个功能,来让我们更好的渲染我们的页面

if...else

我们先看下例子

<script>
   let a=0    
   function add(){
       a++
   }
</script>
{#if a<5}
<p style="color: red;">a的值为:{a}</p>
{/if}
<button on:click={add}>+</button>

if的语法是{#if xxx} {/if} 然后在里面写条件成立时,你要展示的内容

现在渲染的意思就是如果a<5,那么这段话就是红色的,如果a>=5了,那么这段话就不会显示了

当然大于5的时候我们也想让它显示,所以就要加上else了

我们简单调整下代码

<script>
   let a=0    
   function add(){
       a++
   }
</script>
{#if a<5}
<p style="color: red;">a的值为:{a}</p>
{:else}
<p style="color: blue;">a的值为:{a}</p>
{/if}
<button on:click={add}>+</button>

{:else}代表if不成立时渲染的内容,没错a>=5是就变成蓝色了

但是当a>10的时候我们想让它变黑,怎么做呢,我们应该想到这种判断就要用else if了

在svelte里同样可以

<script>
   let a=0    
   function add(){
       a++
   }
</script>
{#if a<5}
<p style="color: red;">a的值为:{a}</p>
{:else if a<=10}
<p style="color: blue;">a的值为:{a}</p>
{:else}
<p>a的值为:{a}</p>
{/if}
<button on:click={add}>+</button>

好了,现在就来看下最终的效果吧


svelte判断.gif

each循环

js里循环有很多方式,在svelte里,提供的是each循环

看下代码

<script>
  let peo=[
      {name:'张三',age:22},
      {name:'李四',age:22},
      {name:'王五',age:22},
  ]
</script>
{#each peo as p}
<p>姓名:{p.name}</p>
<p>年龄:{p.age}</p>
<hr>    
{/each}

循环包裹在{#each } {/each}里面,其实这种写法和js几乎一样

同样,它也支持解构,和index,代码调整如下

<script>
  let peo=[
      {name:'张三',age:22},
      {name:'李四',age:22},
      {name:'王五',age:22},
  ]
</script>
{#each peo as {name,age},index}
<h2>{index+1}</h2>
<p>姓名:{name}</p>
<p>年龄:{age}</p>
<hr>    
{/each}

最后看下效果,


svelte循环

双向绑定

双向绑定是一个很重要的功能,在大多框架中都有,svelte同样提供了

书写规则如下

<script>
  let name=''
 
</script>
<label for="name">name:</label>
<input type="text" id="name" bind:value={name}>
<br>
<p>姓名是:{name}</p>

那我们先看下效果


svelte双向绑定.gif

bind:value就是作用在表单元素的时候表示它的value,但是这个value是动态的

radio,checkbox,select表单里面会有很多值,让我们来看下,是如何实现的

<script>
  let choose=['man','women']
  let res=''
  let address=['江苏','上海','广州']
  let add=[]
  let loves=['篮球','足球','排球','划船']
  let lovechoose=''  
 
</script>

{#each choose as p}
<input type="radio" bind:group={res} name='sex' value={p}>
<label for="sex">{p}</label>
    
{/each}
<br>
<p>性别是:{res}</p>
<hr>
{#each address as p}
<input type="checkbox" bind:group={add} name='add' value={p}>
<label for="add">{p}</label>
    
{/each}
<p>最后地址有:</p>
<p>
    {#each add as p}
    <span>{p}</span> 
        
    {/each}
</p>
<hr>
<label for="love">爱好</label>
<select name="love" id="" bind:value={lovechoose}>
    {#each loves as p}
    <option value={p}>{p}</option>
        
    {/each}

</select>
<p>最后选择的爱好是:{lovechoose}</p>



效果如下


svelte双向绑定2.gif

我们可以看出,raido和checkbox是将最后选择的值,给bind:group,radio是唯一,所以绑定的应该是个string,

而checkbox是个多项,所以应该绑定一个数组,然后我们可以把这个数组再渲染到页面上

select就和input里的text很想,将最后选择的值最为bind:value双向绑定

bind:checked

svelte给checkbox做了一个bind:checked,用来判断,是否被选中,看一个示例

<script>
  let choose=false
</script>

<input type="checkbox" name="cho" bind:checked={choose}><label for="cho">choose it?</label>

{#if choose}
<p style="color: blue;">yes you choose it</p>
{:else}
<p style="color: red;">i am sorry ,you did not choose it</p>
{/if}

效果


bindchecked.gif

选中的时候bind:checked的动态值为true,否则false

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容