1. 定义状态
- 勾选状态:可以使用一个数组来存储被勾选项目的标识。例如,假设有一个包含多个对象的列表,每个对象有
id
属性,那么可以定义 let selectedIds = [];
来记录被勾选项目的 id
。
- 排序状态:定义一个变量来表示当前的排序方式,比如
let sortBy = 'default';
,其中 default
可以是初始排序规则,也可以根据实际情况是按名称、日期等不同的排序字段及顺序。
- 筛选状态:用一个对象来存储筛选条件。例如,如果是根据文本搜索和特定分类筛选,可以定义
let filter = { searchText: '', category: 'all' };
2. 处理状态变化
- 勾选操作:
- 给列表中的每个项目添加一个点击事件处理函数。例如:
{#each items as item}
<input type="checkbox" bind:checked={selectedIds.includes(item.id)} on:change={() => {
if (selectedIds.includes(item.id)) {
selectedIds = selectedIds.filter(id => id!== item.id);
} else {
selectedIds = [...selectedIds, item.id];
}
}} />
{/each}
- 这里利用Svelte的响应式原理,当
selectedIds
数组变化时,与之相关的UI(如勾选状态的显示)会自动更新。
- 排序操作:
function handleSort() {
if (sortBy === 'name') {
items = items.sort((a, b) => a.name.localeCompare(b.name));
} else if (sortBy === 'date') {
items = items.sort((a, b) => new Date(a.date) - new Date(b.date));
}
}
- 在UI上添加排序按钮,点击按钮时调用
handleSort
函数。同样,Svelte会自动响应 items
数组的变化并更新UI。
- 筛选操作:
- 给筛选输入框和筛选条件选择框添加事件处理函数,更新
filter
对象。例如:
<input type="text" bind:value={filter.searchText} />
<select bind:value={filter.category}>
<option value="all">All</option>
<option value="category1">Category 1</option>
<option value="category2">Category 2</option>
</select>
- 然后根据
filter
对象来过滤 items
列表:
$: filteredItems = items.filter(item => {
const textMatch = item.name.toLowerCase().includes(filter.searchText.toLowerCase());
const categoryMatch = filter.category === 'all' || item.category === filter.category;
return textMatch && categoryMatch;
});
3. 确保组件间的高效通信和数据一致性
- 父子组件通信:
- 如果有父组件包含列表组件和筛选、排序控制组件,可以通过props将状态传递给子组件。例如,将
selectedIds
、sortBy
、filter
作为props传递给列表组件,列表组件根据这些状态来渲染正确的UI。
- 子组件通过事件向父组件传递状态变化。比如列表组件中的勾选变化通过
createEventDispatcher
触发一个自定义事件,父组件监听该事件并更新 selectedIds
状态。
- 兄弟组件通信:
- 可以通过一个共享的上下文对象(如使用
setContext
和 getContext
)来实现兄弟组件间通信。例如,筛选组件和排序组件可以通过共享的上下文对象来获取和更新 filter
和 sortBy
状态,确保数据一致性。同时,由于Svelte的响应式机制,任何一个组件对共享状态的修改都会自动反映到依赖该状态的其他组件上。