Как обеспечить локальные переходы, когда Svelte повторно использует родительский элемент dom - PullRequest
2 голосов
/ 01 октября 2019

В Svelte у меня есть компонент, который используется для отображения элементов в двух разных списках. Когда эти элементы перемещаются из одного списка в другой, они используют переход для анимации входа или выхода.

Однако у меня также есть способ отфильтровать то, что отображается на экране. Для отображения нового набора элементов будет использоваться один и тот же компонент, но с другими данными. В этом случае я не хочу, чтобы анимация перехода происходила. Я предполагал, что добавление модификатора local поможет, но Svelte не удаляет родительский элемент в список, а использует его повторно и добавляет новые данные в существующий элемент DOM списка.

Я попытался воспроизвести то, что вижу в приведенном ниже примере кода.

Требуемое поведение:

  1. Нажатие на TODO переключит TODO из одного списка впрочее.
  2. Нажатие «Переключить категории» переключит список TODO в списке без анимации <li> s TODO, которые добавляются или удаляются.

Фактическое поведение:

  1. Происходит, как и ожидалось.
  2. Включенные задачи делают это с помощью анимации.

Как изменить пример, чтобы получить эффектчто я хочу?

App.svelte:

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

    let todos = [
        { id: 1, category: 'personal', name: 'Walk dog', done: false },
        { id: 2, category: 'personal', name: 'Take out trash', done: false },
        { id: 3, category: 'work', name: 'Make login page functional', done: false },
        { id: 4, category: 'work', name: 'Make login page elegant', done: false }
    ];

    let currentCategory = 'personal';
    const toggleCategory = () => {
        currentCategory = currentCategory == 'personal' ? 'work' : 'personal';
    }

    const toggleTodo = id => {
        todos = todos.map(todo => {
            if (todo.id === id) {
                return { ...todo, done: !todo.done }
            }
            return todo;
        });
    }

    $: categoryTodos = todos.filter(x => x.category == currentCategory);
</script>

<button on:click={toggleCategory}>Switch Categories</button>
<Todos todos={categoryTodos} {toggleTodo}>
</Todos>

Todos.svelte:

<script>
    import { slide } from 'svelte/transition';
    export let todos;
    export let toggleTodo;

    $: complete = todos.filter(t => t.done);
    $: incomplete = todos.filter(t => !t.done);
</script>

<h1>Incomplete</h1>
<ul>
    {#each incomplete as {id, name} (id)}
    <li transition:slide|local on:click={() => toggleTodo(id)}>{name}</li>
    {/each}
</ul>
<h1>Complete</h1>
<ul>
    {#each complete as {id, name} (id)}
    <li transition:slide|local on:click={() => toggleTodo(id)}>{name}</li>
    {/each}
</ul>
...