Mat*_*Roa 5 javascript svelte svelte-component svelte-store
我有两个组件在组件树中距离很远,我对如何在两者之间进行通信存有疑问。我有搜索组件、listItems 和商店。
商店.svelte
<script context="module" lang="ts">
import type {Items} from '../../Models/Items.model';
import { writable } from 'svelte/store';
export const dataItems = writable<Items[]>([]);
const filterInfo = (term:string) => {
dataItems.update(item => {
item.filter(x => {
return x.name.toLowerCase().includes(term.toLowerCase())
|| x.description.toLowerCase().includes(term.toLowerCase());
})
return dataItems;
})
}*/
export const dispatcher = {filterInfo};
</script>
Run Code Online (Sandbox Code Playgroud)
搜索组件
<script lang="ts">
import { dispatcher } from './ViewI/store.svelte';
let value:any;
const handleChange = () => {
dispatcher.filterInfo(value)
console.log(value)
}
</script>
<Search>
<input bind:value
on:input={handleChange}>
</Search>
Run Code Online (Sandbox Code Playgroud)
列表项组件
import type {Items} from '../../Models/Items.model';
import {dataItems,dispatcher} from './store.svelte';
export let items:Items[] =[];
export let value:any;
$:filterItems = items;
$: {
filterItems = $dataItems.filter((item:any) => {
return item.name || item.description
});
dispatcher.filterInfo(value);
}
</script>
<main>
{#each [...filterItems] as item }
<CardItems
name={item.name}
description={user.description}
id={item.id}
/>
{/each}
</main>
Run Code Online (Sandbox Code Playgroud)
问题是如何将两个组件与您在输入中写入的值进行通信并创建过滤器。
Geo*_*ich 13
您可以使用派生存储来完成此操作。这是一个小例子。
设置三个商店:term
将保存正在搜索的术语,items
将保存项目的完整列表,并且filtered
将是包含包含该术语的项目的派生商店。term
每当或发生变化时,它都会自动更新items
。
// stores.js
import { writable, derived } from 'svelte/store';
export const term = writable('');
export const items = writable(['dog', 'cat', 'fish', 'iguana']);
export const filtered = derived(
[term, items],
([$term, $items]) => $items.filter(x => x.includes($term))
);
Run Code Online (Sandbox Code Playgroud)
然后,您可以在您的应用程序中使用这些商店。您的搜索组件可以像这样设置要搜索的术语。
<!-- Search.svelte -->
<script>
import {term} from './stores.js';
let val = '';
$: term.set(val);
</script>
<label for="searchInput">Search</label>
<input bind:value={val} type="text" id="searchInput">
Run Code Online (Sandbox Code Playgroud)
当您调用 时term.set(val)
,派生存储将自动更新。您可以在应用程序的任何组件中使用此存储。
<!-- ListItems.svelte -->
<script>
import { filtered } from './stores.js';
</script>
<ul>
{#each $filtered as item}
<li>{item}</li>
{/each}
</ul>
Run Code Online (Sandbox Code Playgroud)
您可以在Svelte REPL中看到一个工作示例。
归档时间: |
|
查看次数: |
8427 次 |
最近记录: |