为什么使用工厂进行自定义存储而不是仅导出对象

Jac*_* A. 2 svelte svelte-store

我正在学习 Svelte 教程,并且位于自定义商店页面 ( https://svelte.dev/tutorial/custom-stores )。示例代码是使用工厂函数编写的,createCount该函数会立即调用以创建导出的存储对象:

import { writable } from 'svelte/store';

function createCount() {
    const { subscribe, set, update } = writable(0);

    return {
        subscribe,
        increment: () => update(n => n + 1),
        decrement: () => update(n => n - 1),
        reset: () => set(0)
    };
}

export const count = createCount();
Run Code Online (Sandbox Code Playgroud)

这样做的原因是什么,而不是像这样直接导出商店对象:

import { writable } from 'svelte/store';

const { subscribe, set, update } = writable(0);

export const count = {
    subscribe,
    increment: () => update(n => n + 1),
    decrement: () => update(n => n - 1),
    reset: () => set(0)
};
Run Code Online (Sandbox Code Playgroud)

ehr*_*ona 11

不同之处在于工厂可以用来创建多个独立的商店。一个商店的值可能是 4,另一家商店的值可能是 123。

在第二个代码块中,只能有一个商店。使用存储的任何代码都将看到相同的值,并且当一段代码更新该值时,这就是每个人都会看到的值。这称为“单例”。

也就是说,count在这两种情况下都是单例;您需要createCount再次调用以获取另一个商店(并且为了能够做到这一点,您需要导出该createCount函数)。

因此总而言之,这两段代码执行完全相同的操作,但是使用工厂的代码已准备好创建多个商店实例(即使它当前不这样做)。