docs/development/state-management/state-management-selectors.zh-CN.mdx
selectors 是 LobeHub 数据流研发框架下的取数模块,它的作用是从 store 中以特定特务逻辑取出数据,供组件消费使用。
以 src/store/tool/slices/plugin/selectors.ts 为例:
这个 TypeScript 代码段定义了一个名为 pluginSelectors 的对象,该对象包含一系列用于从插件存储状态中检索数据的选择器函数。选择器是一种从 zustand 中提取和派生数据的函数。这个特定的例子是为了管理与前端应用程序的插件系统相关的状态。
下面是一些关键点的说明:
getCustomPluginById: 根据插件 ID 返回自定义插件信息。getInstalledPluginById: 根据插件 ID 返回已安装插件的信息。getPluginManifestById: 根据插件 ID 返回插件清单。getPluginMetaById: 根据插件 ID 返回插件元数据。getPluginSettingsById: 根据插件 ID 返回插件设置。installedCustomPluginMetaList: 返回所有已安装的自定义插件的元数据列表。installedPluginManifestList: 返回所有已安装插件的清单列表。installedPluginMetaList: 返回所有已安装插件的元数据列表。installedPlugins: 返回所有已安装插件的列表。isPluginHasUI: 根据插件 ID 确定插件是否有 UI 组件。isPluginInstalled: 根据插件 ID 检查插件是否已安装。storeAndInstallPluginsIdList: 返回 store 中和已安装插件的所有 ID 列表。选择器通过将复杂的状态选择逻辑封装在单独的函数中,使得在应用程序的其他部分调用状态数据时,代码更加简洁和直观。此外,由于使用了 TypeScript,每个函数都可以具有明确的输入和输出类型,这有助于提高代码的可靠性和开发效率。
在组件中,只需引入相应的选择器即可直接获取最终消费的数据:
import { useToolStore } from '@/store/tool';
import { pluginSelectors } from '@/store/tool/selectors';
const Render = () => {
const list = useToolStore(pluginSelectors.installedPluginMetaList);
return <> ...
</>;
};
这样实现的好处在于:
通过这样的设计,LobeHub 的开发者可以更专注于构建用户界面和业务逻辑,而不必担心数据的获取和处理细节。这种模式也为未来可能的状态结构变更提供了更好的适应性和扩展性。