В Svelte у меня есть компонент, который используется для отображения элементов в двух разных списках. Когда эти элементы перемещаются из одного списка в другой, они используют переход для анимации входа или выхода.
Однако у меня также есть способ отфильтровать то, что отображается на экране. Для отображения нового набора элементов будет использоваться один и тот же компонент, но с другими данными. В этом случае я не хочу, чтобы анимация перехода происходила. Я предполагал, что добавление модификатора local
поможет, но Svelte не удаляет родительский элемент в список, а использует его повторно и добавляет новые данные в существующий элемент DOM списка.
Я попытался воспроизвести то, что вижу в приведенном ниже примере кода.
Требуемое поведение:
- Нажатие на TODO переключит TODO из одного списка впрочее.
- Нажатие «Переключить категории» переключит список TODO в списке без анимации
<li>
s TODO, которые добавляются или удаляются.
Фактическое поведение:
- Происходит, как и ожидалось.
- Включенные задачи делают это с помощью анимации.
Как изменить пример, чтобы получить эффектчто я хочу?
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>