- 主要组成部分
writable
函数:这是创建可写存储的入口函数。
subscribe
函数:用于订阅存储值的变化,返回一个取消订阅的函数。
set
函数:用于设置存储的新值,并触发订阅者更新。
update
函数:用于基于当前值计算并设置新值,同样会触发订阅者更新。
- 关键数据结构
subscribers
数组:用于存储所有订阅者的回调函数。每个订阅者通过调用subscribe
函数将其回调函数添加到这个数组中。
- 协同工作方式
- 创建存储:调用
writable
函数时,传入初始值,它内部会初始化subscribers
数组,并返回一个包含subscribe
、set
和update
函数的对象。
- 订阅:当调用
subscribe
函数时,会将传入的回调函数添加到subscribers
数组中。同时返回一个取消订阅函数,该函数可以从subscribers
数组中移除对应的回调函数。
- 设置值:调用
set
函数时,会更新存储的内部值,并遍历subscribers
数组,依次调用每个订阅者的回调函数,将新值传递给它们,从而通知订阅者值发生了变化。
- 更新值:调用
update
函数时,会传入一个更新函数,该更新函数接收当前值并返回新值。update
函数先通过这个更新函数计算出新值,然后像set
函数一样,设置新值并通知所有订阅者。
// 简化的Svelte writable store实现示例
function writable(start) {
let value = start;
const subscribers = [];
const subscribe = (run) => {
subscribers.push(run);
run(value);
return () => {
const index = subscribers.indexOf(run);
if (index!== -1) {
subscribers.splice(index, 1);
}
};
};
const set = (newValue) => {
value = newValue;
subscribers.forEach(run => run(value));
};
const update = (updater) => {
set(updater(value));
};
return { subscribe, set, update };
}