数据更新
<script>
let a=['a','c']
let b='kk'
function oadd(){
a.push(b)
}
</script>
in svelte 这种数组或者是object的增加或者减少,并不会更新在dom上渲染的内容,必须要对变量再赋值,才能使渲染的内容变更。
<script>
let a=['a','c']
let b='kk'
function oadd(){
a.push(b)
a=a
}
</script>
只有进行这一步才行,
一句话攻略:一个简单的经验法则:更新后的变量必须直接出现在赋值的左侧。
属性传播
<script>
export let name=''
export let age=0
</script>
<main><p>{name}--{age}</p></main>
在其它组件应用的时候可以用属性传播来简化写法,如:
<script>
import One from "./lib/one.svelte";
let aa={name:'xiao',age:56}
</script>
<main>
<One {...aa}>
</One>
</main>
这样aa里面的数据就会自动和引用的组件进行匹配了,不需要一个个去赋值了。
each
index
<script>
let a=[
{name:'xiao',age:12},
{name:'ruru',age:32},
{name:'haha',age:3},
]
</script>
<main>
{#each a as x,i}
<p>{x.name}--{i}</p>
{/each}
</main>
<style></style>
对象拆解
x.name显的太累赘
我们可以拆解
<script>
let a=[
{name:'xiao',age:12},
{name:'ruru',age:32},
{name:'haha',age:3},
]
</script>
<main>
{#each a as {name,age},i}
<p>{name}--{i}</p>
{/each}
</main>
<style></style>
把原来的x直接拆解成每个object的里的项目,这样在下面就可以直接写项目了
key
为防止数据在更新的时候出现乱七八糟的情况,一定要习惯性的加上key
在x,index后面一个空格然后用一个括号括起来,可以是x也可以是x.xxx
<script>
let a=[
{name:'xiao',age:12},
{name:'ruru',age:32},
{name:'haha',age:3},
]
</script>
<main>
{#each a as {name,age},i (name)}
<p>{name}--{i}</p>
{/each}
<button on:click={()=>{a=a.slice(1)}}>-</button>
</main>
<style></style>
await
{#await promise}
<p>...waiting</p>
{:then number}
<p>The number is {number}</p>
{:catch error}
<p style="color: red">{error.message}</p>
{/await}
先是自己弄一个异步函数,比如开始可以获取数据。
然后 :then number number呢就是你成功返回的值,
:catch error,就是失败返回的值
最后在自己相应的模块范围里面写一些dom就可以了
如果你知道你的 promise 不能拒绝,你可以省略 catch 块。如果您不想在承诺解决之前显示任何内容,您也可以省略第一个块:
{#await promise then value}
<p>the value is {value}</p>
{/await}
event
这里的event和原生的不一样,我可以log出来,看看都有啥属性
<button on:click={(e)=>{console.log(e);
然后根据输出的东西来看,基本能用的都是一些坐标之类的东西
比如:
clientX clientY 表示当前窗口的x,y坐标
内联写法
<div on:mousemove="{e => m = { x: e.clientX, y: e.clientY }}">
The mouse position is {m.x} x {m.y}
</div>
修饰符
once
只执行一次
<button on:click|once={handleClick}>
Click me
</button>
bing:innerhtml
<script>
let incontent='12'
let intext=`<p>${incontent}</p>`
</script>
<main>
<div contenteditable="true" bind:innerHTML="{intext}"></div>
<hr>
<input type="text" bind:value="{incontent}">
<br>
{intext}
</main>
<style>
[contenteditable]{
color: red;
}
</style>
就是帮用户输入添加html,这里要注意的是,如果你添加样式,用P,用.a,那是不行的,只有 [contenteditable]才行,我也不知道为啥,你就这么用就行了
所以两个注意点:
1.contenteditable=”true” 一定要加
2.写style只能用[contenteditable] 来修饰
bing:class
<main>
<p class:a={true}>haha</p>
</main>
<style>
.a {
color: red;
}
.b {
color: green;
}
.c {
color: blue;
}
</style>
很简单就是通过一个变量来判断是否用某一个class,这个和bind:checked联合起来用非常好