增强器 (Enhancer)

什么是增强器?

增强器是一个函数,它接受一个对象作为参数并返回一个新的对象,这个新对象是原始对象的增强版本。

增强器可以用来修改对象的属性、添加新属性、删除属性,或者做一些其他的事情,是一种非常灵活的方式,可以让用户在不改变原有代码的情况下,对功能进行扩充。

一个简单的增强器示例:

function enhancer(store) {
  // 做一些增强操作

  // 返回增强后的对象
  return {
    ...store,
    awesomeFeature() {
      console.log('awesomeFeature');
    }
  };
}

export const enhancedStore = enhancer(create({ count: 1 }));

为什么要使用增强器?

Reactive 被设计为框架无关的,为了适应多样功能场景,Reactive 引入了增强器的概念,内部 Vanilla 和 React 的功能特性区别,其实就是通过应用不同的增强器来实现的。

为了方便使用以及与原有 API 对齐,Reactive 内置了一部分增强器,同时也提供了一些增强器的 API,让用户可以增强 store 的功能特性。如果需要,用户也可以自行编写增强器以扩充 store 的功能。

最初的 VanillaStore

VanillaStore 是 Reactive 返回的 store 的最初形态,它是一个包含 mutaterestore 方法的普通的对象,只包含了最基本的功能,不包含任何增强器。

export type VanillaStore<State extends object> = {
  /**
   * The mutable state object, whose changes will trigger subscribers.
   */
  mutate: State
  /**
   * Restore to initial state.
   */
  restore: () => void
}

内置增强器

create

create 方法适用于 React,内置了一些增强器,包括:

import { create } from '@shined/reactive';

const store = create({ count: 1 });

// Vanilla Store 通用属性
store.mutate
store.restore

// 通过增强器贡献的属性
store.subscribe
store.useSubscribe
store.snapshot
store.useSnapshot

createVanilla

createVanilla 方法适用于 Vanilla JavaScript,内置了一些增强器,包括:

Vanilla 场景下,如果需要引用内部的增强器,需要从 /vanilla 导入。

import { createVanilla } from '@shined/reactive/vanilla';

const store = createVanilla({ count: 1 });

// Vanilla Store 通用属性
store.mutate
store.restore

// 通过增强器贡献的属性
store.subscribe
store.snapshot