onvno / pokerface

日常技术文章阅读整理
3 stars 0 forks source link

20190831 - Svelte #69

Open onvno opened 5 years ago

onvno commented 5 years ago

文章

实例对比

onvno commented 5 years ago

props设置

default values for props

<script>
        // 获取父组件值,需要使用export
    export let answer = 'a mystery';
</script>

react变量

reactive declarations

let count = 0;
$: doubled = count * 2;

$: {
    console.log(`the count is ${count}`);
    alert(`I SAID THE COUNT IS ${count}`);
}

逻辑

<script>
    let user = { loggedIn: false };

    function toggle() {
        user.loggedIn = !user.loggedIn;
    }
</script>

{#if user.loggedIn}
<button on:click={toggle}>
    Log out
</button>
{/if}

{#if !user.loggedIn}
<button on:click={toggle}>
    Log in
</button>
{/if}

优化

{#if user.loggedIn}
    <button on:click={toggle}>
        Log out
    </button>
{:else}
    <button on:click={toggle}>
        Log in
    </button>
{/if}
onvno commented 5 years ago

svelte动画版todolist

https://svelte.dev/tutorial/deferred-transitions https://svelte.dev/tutorial/animate 官方提供的例子,两类动画

onvno commented 5 years ago

插入组件,外部控制组件动画的actiong

https://svelte.dev/tutorial/actions

看着很酷

onvno commented 5 years ago

https://svelte.dev/tutorial/context-api

context-api与store对比还是看官方此文档

onvno commented 5 years ago

Svelte组件库:

onvno commented 5 years ago

Svelte - 拖拽组件demo: https://svelte.dev/repl/3721cbc9490a4c51b07068944a36a40d?version=3.4.2

onvno commented 5 years ago

Svelte 子组件触发父组件事件:

组件事件

子组件

<script>
    // setup code goes here
    import { createEventDispatcher } from 'svelte';

    const dispatch = createEventDispatcher();

    function sayHello() {
        dispatch('message', {
            text: 'Hello!'
        });
    }
</script>

<button on:click={sayHello}>
    Click to say hello
</button>

父组件

<script>
    import Inner from './Inner.svelte';

    function handleMessage(event) {
        alert(event.detail.text);
    }
</script>

<Inner on:message={handleMessage}/>

当子组件与父组件层级隔得太深,可以使用这个方法传递: https://svelte.dev/tutorial/event-forwarding

子组件bind影响父组件

Component Binding

子组件:

<script>
    import { createEventDispatcher } from 'svelte';

    export let value = '';

    const dispatch = createEventDispatcher();

    const select = num => () => value += num;
    const clear  = () => value = '';
    const submit = () => dispatch('submit');
</script>

<style>
    .keypad {
        display: grid;
        grid-template-columns: repeat(3, 5em);
        grid-template-rows: repeat(4, 3em);
        grid-gap: 0.5em
    }

    button {
        margin: 0
    }
</style>

<div class="keypad">
    <button on:click={select(1)}>1</button>
    <button on:click={select(2)}>2</button>
    <button on:click={select(3)}>3</button>
    <button on:click={select(4)}>4</button>
    <button on:click={select(5)}>5</button>
    <button on:click={select(6)}>6</button>
    <button on:click={select(7)}>7</button>
    <button on:click={select(8)}>8</button>
    <button on:click={select(9)}>9</button>

    <button disabled={!value} on:click={clear}>clear</button>
    <button on:click={select(0)}>0</button>
    <button disabled={!value} on:click={submit}>submit</button>
</div>

父组件:

<script>
    import Keypad from './Keypad.svelte';

    let pin;
    $: view = pin ? pin.replace(/\d(?!$)/g, '•') : 'enter your pin';

    function handleSubmit() {
        console.log("pin:", pin)
        alert(`submitted ${pin}`);
    }
</script>

<h1 style="color: {pin ? '#333' : '#ccc'}">{view}</h1>

<Keypad bind:value={pin} on:submit={handleSubmit}/>
onvno commented 5 years ago

更简单的应该是通过直接绑定props来实现: https://svelte.dev/tutorial/store-bindings

组件:

<script>
    import { name, greeting } from './stores.js';
</script>

<h1>{$greeting}</h1>
<input bind:value={$name}>

Store:

import { writable, derived } from 'svelte/store';

export const name = writable('world');

export const greeting = derived(
    name,
    $name => `Hello ${$name}!`
);