If 条件判断语句
HTML 没有表达逻辑的方法,比如条件和循环。在Svelte中了有条件地渲染一些标记,我们将它包装在一个if块中:
{#if isOK} <h1>OK</h1> {/if}
在vue中是 v-if , 在React则是手写javascript就好,我个人比较更喜欢React的coding方式,但为了体验,牺牲点也无所谓🫤。
以下是一个完整的case
<script> let newVal = 0 </script> <div> <span>2</span> <span> {#if 2 > newVal} {'>'} {:else if 2 < newVal} {'<'} {:else} {'='} {/if} </span> <input bind:value={newVal} /> </div> <style> input { width: 20px; } </style>
请注意语句块开始由 # 开头,else : 开头,结束 /
Each 循环语句
在Svelte中遍历数据列表,需要使用 each 块,遍历的对象需要时数组(类似)对象。
下面来看一个案例:
<script> let svelteTutorial = { author: 'uiuing', nike: '我想养只猫', column: { name: 'Svelte.js得心应手', desc: '这是国内较早较全且经过实践的Svelte.js系列教程。', link: 'https://blog.csdn.net/qq_41103843/category_12057717.html' }, blogs: [ { name: '相比Vue和React,Svelte可能更适合你', id: 127361869, link: 'https://uiuing.blog.csdn.net/article/details/127361869' }, { name: '【Svelte】-(1)基础知识 / 快速上手 / 添加数据 / 动态属性 / CSS样式 / 嵌套组件 / HTML标签', id: 127365312, link: 'https://uiuing.blog.csdn.net/article/details/127365312' }, { name: '【Svelte】-(2)reactivity响应式 | 赋值 / reactivity变量 / reactivity代码语句 / reactivity对象', id: 127374466, link: 'https://uiuing.blog.csdn.net/article/details/127374466' }, { name: '【Svelte】-(3)Props 组件传值', id: 127392236, link: 'https://uiuing.blog.csdn.net/article/details/127392236' } ], updateTime: '2022-10-19' } </script> <div> <h1>作者:{svelteTutorial.author}</h1> <h2>昵称:{svelteTutorial.nike}</h2> <h3>专栏:{svelteTutorial.column.name}</h3> <p>专栏介绍:{svelteTutorial.column.desc}</p> <p>专栏链接:{svelteTutorial.column.link}</p> <ul> {#each svelteTutorial.blogs as blog} <li> <a href={blog.link}>{blog.name}</a> </li> {/each} </ul> <p>更新时间:{svelteTutorial.updateTime}</p> </div>
效果如下
获取索引位置
{#each svelteTutorial.blogs as blog, i} <li> <a href={blog.link}>{i}. {blog.name}</a> </li> {/each}
{#each 遍历对象 as 子项, 索引}
解构使用
{#each svelteTutorial.blogs as {link, name}, i} <li> <a href={link}>{i}. {name}</a> </li> {/each}
在此之前我们需要明白,多个 each 块会造成互相干扰,所以我们需要为 each 块指定一个唯一标识符(key),来告诉Svelte如何确定要更改的 DOM 节点
推荐使用字符串或数字当作key,当然是任何对象都可以。
{#each svelteTutorial.blogs as {link, name, id} (id), i} <li> <a href={link}>{i}. {name}</a> </li> {/each}
例如这里使用的就是 id 作为key
Await 异步处理块
这一块主要就是为了等待异步数据,和在javascript中调用async function是一样的,等待promise值。
注意有两种写法,如果不存在错误可以这样写
<script> let userName = 'uiuing' async function getUserNikeName(_userName) { let users = [ {userName: 'uiuing', nikeName: '我想养只猫'} ] let user = users.find(user => user.userName === _userName) if (user) { return user } else { throw new Error('用户不存在') } } </script> <div> {#await getUserNikeName(userName) then {userName, nikeName}} <p>作者: {userName}</p> <p>昵称: {nikeName}</p> {/await} </div>
这里你这样写也是一样的。
{#await getUserNikeName(userName) then {userName, nikeName}} <p>作者: {user.userName}</p> <p>昵称: {user.nikeName}</p> {/await}
如果会发生错误且我们需要告诉用户呢?我们就要这样写
<div> {#await getUserNikeName(123)} {:then {userName, nikeName}} <p>作者: {userName}</p> <p>昵称: {nikeName}</p> {:catch error} <p>错误: {error.message}</p> {/await} </div>