面试题答案
一键面试1. 状态管理架构设计
在Svelte中,可使用stores
来进行状态管理。创建不同的store来管理不同模块的状态。
全局状态store
创建一个globalStore.js
文件,用于管理全局通用状态,例如用户登录状态。
import { writable } from'svelte/store';
// 用户登录状态
export const userLoginStore = writable(false);
商品展示模块store
productStore.js
用于管理商品展示相关状态,如商品列表、筛选条件等。
import { writable } from'svelte/store';
// 商品列表
export const productListStore = writable([]);
// 筛选条件
export const productFilterStore = writable({});
购物车模块store
cartStore.js
管理购物车状态,如购物车商品列表、总价等。
import { writable } from'svelte/store';
// 购物车商品列表
export const cartItemsStore = writable([]);
// 购物车总价
export const cartTotalPriceStore = writable(0);
订单管理模块store
orderStore.js
管理订单相关状态,如订单列表、订单详情等。
import { writable } from'svelte/store';
// 订单列表
export const orderListStore = writable([]);
// 订单详情
export const orderDetailStore = writable(null);
2. 状态共享与更新
不同模块通过导入对应的store来共享状态。例如,在用户登录模块更新userLoginStore
。
<script>
import { userLoginStore } from './globalStore.js';
const handleLogin = () => {
// 登录成功逻辑
userLoginStore.set(true);
};
</script>
<button on:click={handleLogin}>登录</button>
商品展示模块可根据productFilterStore
的变化来更新productListStore
。
<script>
import { productListStore, productFilterStore } from './productStore.js';
productFilterStore.subscribe((filter) => {
// 根据筛选条件更新商品列表逻辑
// 假设从API获取数据
fetch(`/products?${new URLSearchParams(filter)}`)
.then(response => response.json())
.then(data => productListStore.set(data));
});
</script>
3. 异步操作处理
在Svelte中,可在组件内直接处理异步操作,也可将异步操作封装在store中。
例如,在购物车模块添加商品时可能需要调用API来更新库存等。
<script>
import { cartItemsStore } from './cartStore.js';
const addToCart = (product) => {
fetch('/api/cart/add', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ product })
})
.then(response => response.json())
.then(data => {
cartItemsStore.update(items => {
items.push(product);
return items;
});
});
};
</script>
<button on:click={addToCart}>加入购物车</button>
4. 确保状态一致性和可维护性
- 模块化:将不同模块的状态分开管理,每个模块有自己的store,使得代码结构清晰,易于维护。
- 单向数据流:尽量遵循单向数据流原则,状态变化从一个方向进行,例如从用户操作到store更新,避免复杂的双向数据绑定导致的状态混乱。
- 测试:对每个store编写单元测试,确保状态更新逻辑正确。例如,使用Jest和
@testing-library/svelte
来测试store的行为。
import { render, fireEvent } from '@testing-library/svelte';
import { cartItemsStore } from './cartStore.js';
describe('cartItemsStore', () => {
it('should add item to cart', () => {
const product = { id: 1, name: 'Test Product' };
cartItemsStore.update(items => {
items.push(product);
return items;
});
cartItemsStore.subscribe(items => {
expect(items).toContain(product);
});
});
});
- 文档化:对每个store的作用、状态结构以及更新方法进行文档注释,方便团队成员理解和维护代码。
/**
* 用户登录状态store
* - 使用writable创建可写store
* - 初始值为false,表示未登录
* - 可通过set方法更新登录状态
*/
export const userLoginStore = writable(false);