Javascript 如何在svelte中制作搜索过滤器

Javascript 如何在svelte中制作搜索过滤器,javascript,svelte,svelte-component,svelte-store,Javascript,Svelte,Svelte Component,Svelte Store,我在组件树中有两个非常遥远的组件,我对如何在这两个组件之间进行通信表示怀疑。我有搜索组件、listItems和一个存储 苗条的 从“../../Models/Items.model”导入类型{Items}; 从'svelte/store'导入{writable}; export const dataItems=可写([]); 常量过滤器信息=(术语:字符串)=>{ dataItems.update(item=>{ item.filter(x=>{ 返回x.name.toLowerCase().

我在组件树中有两个非常遥远的组件,我对如何在这两个组件之间进行通信表示怀疑。我有搜索组件、listItems和一个存储

苗条的


从“../../Models/Items.model”导入类型{Items};
从'svelte/store'导入{writable};
export const dataItems=可写([]);
常量过滤器信息=(术语:字符串)=>{
dataItems.update(item=>{
item.filter(x=>{
返回x.name.toLowerCase().includes(term.toLowerCase())
||x.description.toLowerCase()。包括(term.toLowerCase());
})
返回数据项;
})
}*/
export const dispatcher={filterInfo};
搜索组件


从“./ViewI/store.svelte”导入{dispatcher};
让价值:任何;
常量handleChange=()=>{
dispatcher.filterInfo(值)
console.log(值)
}
listItems组件

从“../../Models/Items.model”导入类型{Items};
从“/store.svelte”导入{dataItems,dispatcher};
导出let项:项[]=[];
出口允许值:任何;
$:filterItems=项目;
$: {
filterItems=$dataItems.filter((项:任意)=>{
返回item.name | | item.description
});
dispatcher.filterInfo(值);
}
{#每个[…过滤器项]作为项目}
{/每个}

问题是如何将这两个组件与您在输入中写入的值进行通信,并生成过滤器。

您可以使用派生存储来实现这一点。这里有一个小例子

设置三个存储区:
term
将保存正在搜索的术语,
items
将保存项目的完整列表,
filtered
将是一个包含该术语的项目的存储区。每当
术语
项目
发生更改时,它将自动更新

//stores.js
从'svelte/store'导入{可写,派生};
导出常量项=可写(“”);
导出常量项=可写(['dog'、'cat'、'fish'、'iguana']);
导出常量筛选=派生(
[期限、项目],
([$term,$items])=>$items.filter(x=>x.includes($term))
);
然后,您可以在整个应用程序中使用这些存储。搜索组件可以像这样设置要搜索的术语

<!-- 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">

您可以在中看到一个工作示例。

您可以使用派生存储来完成此操作。这里有一个小例子

设置三个存储区:
term
将保存正在搜索的术语,
items
将保存项目的完整列表,
filtered
将是一个包含该术语的项目的存储区。每当
术语
项目
发生更改时,它将自动更新

//stores.js
从'svelte/store'导入{可写,派生};
导出常量项=可写(“”);
导出常量项=可写(['dog'、'cat'、'fish'、'iguana']);
导出常量筛选=派生(
[期限、项目],
([$term,$items])=>$items.filter(x=>x.includes($term))
);
然后,您可以在整个应用程序中使用这些存储。搜索组件可以像这样设置要搜索的术语

<!-- 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">

您可以在中看到一个工作示例。

您可以订阅存储,也可以设置或更新可写存储,甚至可以将存储绑定到输入。查看文档。您可以订阅存储,还可以设置或更新可写存储,甚至可以将存储绑定到输入。见文件。