Skip to main content

svelte/store 多模块如何组织?

在 Svelte 中,store 是一种用于管理应用状态的机制。对于大型应用程序,将 store 按模块组织有助于保持代码的清晰和可维护性。你可以将每个模块的 store 放在单独的文件中,并根据需要进行导入和使用。

示例:多模块 store 组织

假设我们有一个应用程序,有用户管理和产品管理两个模块。我们将分别为这两个模块创建 store

目录结构

src/
├── stores/
│ ├── userStore.js
│ ├── productStore.js
│ └── index.js
├── components/
│ ├── UserComponent.svelte
│ └── ProductComponent.svelte
└── App.svelte

创建用户 store

// src/stores/userStore.js
import { writable } from 'svelte/store';

export const user = writable({
name: '',
email: ''
});

export function setUser(newUser) {
user.set(newUser);
}

export function clearUser() {
user.set({ name: '', email: '' });
}

创建产品 store

// src/stores/productStore.js
import { writable } from 'svelte/store';

export const products = writable([]);

export function addProduct(product) {
products.update(items => [...items, product]);
}

export function removeProduct(productId) {
products.update(items => items.filter(item => item.id !== productId));
}

导出所有 store

// src/stores/index.js
export * from './userStore';
export * from './productStore';

使用 store 在组件中

<!-- src/components/UserComponent.svelte -->
<script>
import { user, setUser, clearUser } from '../stores';

function updateUser() {
setUser({ name: 'John Doe', email: 'john.doe@example.com' });
}

function logout() {
clearUser();
}
</script>

<div>
<h2>User Information</h2>
<p>Name: {$user.name}</p>
<p>Email: {$user.email}</p>
<button on:click={updateUser}>Update User</button>
<button on:click={logout}>Logout</button>
</div>
<!-- src/components/ProductComponent.svelte -->
<script>
import { products, addProduct, removeProduct } from '../stores';

function addNewProduct() {
addProduct({ id: 1, name: 'Product 1' });
}

function deleteProduct(productId) {
removeProduct(productId);
}
</script>

<div>
<h2>Products</h2>
<ul>
{#each $products as product}
<li>
{product.name}
<button on:click={() => deleteProduct(product.id)}>Delete</button>
</li>
{/each}
</ul>
<button on:click={addNewProduct}>Add Product</button>
</div>

主应用程序组件

<!-- src/App.svelte -->
<script>
import UserComponent from './components/UserComponent.svelte';
import ProductComponent from './components/ProductComponent.svelte';
</script>

<main>
<h1>My App</h1>
<UserComponent />
<ProductComponent />
</main>

总结

通过将 store 按模块组织,你可以更好地管理应用状态,并使代码更具可维护性和可扩展性。每个模块的 store 放在单独的文件中,并在需要时进行导入和使用。这种方式不仅清晰明了,还能帮助你在大型应用程序中保持良好的结构和组织。