核心结论:存储与上下文的核心区别
存储(Store):用于跨组件、跨页面共享响应式状态。任何组件修改存储的值,所有订阅该存储的组件会自动更新视图。
上下文():用于在组件树中向下传递数据(父→后代),不自动响应变化。适合传递配置、服务实例等静态或需手动触发的数据。
选择原则:需要全局响应式状态→用Store;只需在组件树内传递非响应式数据→用。
一、存储(Store)完整指南
1.1 什么是Store?
Store是内置的响应式数据容器,实现跨组件共享状态并自动触发更新。官方提供三种类型:
可写存储():可读可写
可读存储():只读
自定义存储():自定义逻辑
1.2 创建与基本使用
// store.js
{ } from '/store';
// 创建存储,初始值为0
const count = (0);
// 更新方法
count.set(1); // 直接设置
count.(n => n + 1); // 基于当前值更新
1.3 在组件中订阅Store
<>
{ count } from './store.js';
{ } from '';
// 自动订阅(推荐)
$: $count; // 使用$前缀自动订阅
// 手动订阅(需取消)
let value;
const = count.(v => value = v);
();
</>
<!-- 自动订阅:直接使用$count -->
< on:click={() => $count += 1}>
点击次数:{$count}
</>
1.4 可读存储()
{ } from '/store';
const time = (new Date(), (set) => {
const = (() => {
set(new Date());
}, 1000);
() => ();
});
1.5 自定义存储
{ } from '/store';
() {
const { , set, } = ();
{
,
: () => (n => n + 1),
: () => (n => n - 1),
reset: () => set()
};
}
const count = (0);
二、上下文()完整指南
2.1 什么是?
是提供的组件树通信机制,允许父组件向后代组件传递数据,无需通过props层层传递。注意:不是响应式的,后代组件不会因值变化自动更新。
2.2 基本使用
<!-- 父组件 . -->
<>
{ } from '';
Child from './Child.';
// 设置上下文(键可以是字符串或)
('theme', 'dark');
('user', { name: 'Alice' });
</>
<Child />
<!-- 后代组件 Child. -->
<>
{ } from '';
const theme = ('theme'); // 'dark'
const user = ('user'); // { name: 'Alice' }
</>
<div class={theme}>当前用户:{user.name}</div>
2.3 与Store结合实现响应式
由于本身非响应式,若需响应式,可将Store放入:
<!-- 父组件 -->
<>
{ } from '';
{ } from '/store';
const count = (0);
('count', count);
</>
<!-- 后代组件 -->
<>
{ } from '';
const count = ('count');
$: $count; // 自动订阅Store,实现响应式
</>
<p>{$count}</p>
2.4 的生命周期
仅在组件初始化时可用,不能在或异步回调中调用(因为那时组件树已固定)
后代组件可以覆盖父级的(使用相同key重新)
三、Store vs 对比表
| 特性 | Store | |
|---|---|---|
| 响应式 | ✅ 自动触发视图更新 | ❌ 需手动配合Store |
| 作用范围 | 全局(任何组件) | 组件树(父→后代) |
| 修改方式 | set() / () |
需配合Store或回调 |
| 性能 | 订阅者自动更新 | 无自动更新,更轻量 |
| 典型场景 | 用户登录状态、主题切换、全局计数器 | 传递服务实例、配置对象、依赖注入 |
四、高频疑难解答
Q1:什么时候必须用Store?
多个不相关的组件需要共享同一状态
状态变化需要立即反映到所有使用处
需要持久化到或与后端同步
Q2:什么时候必须用?
为组件树内的所有后代提供配置(如<>模式)
传递非响应式数据,避免不必要的重渲染
实现依赖注入,解耦组件
Q3:能在中使用Store吗?
可以,且推荐。将Store放入,既能享受的作用域隔离,又能获得响应式能力。
Q4:Store和能否混用?
能。典型模式:全局状态用Store,局部组件树配置用。例如:用户登录信息(Store)+ 当前组件的主题配置()。
五、官方资源与最佳实践
最佳实践:
避免过度使用Store:只在真正需要跨组件共享时使用
优先使用$前缀自动订阅,减少内存泄漏风险
的key使用()避免命名冲突
复杂应用可结合两者:Store提供响应式数据,限定作用域
> 以上内容基于 4.x / 5(截至2026年3月)编写,所有API和示例均符合官方规范。

