UNPKG

utquidem

Version:

The meta-framework suite designed from scratch for frontend-focused modern web development.

130 lines (97 loc) 3.73 kB
--- sidebar_position: 1 --- # model :::info 补充信息 用于创建管理数据流的 Model。 ```ts import { model } from '@modern-js/runtime/model'; ``` ::: :::tip 提示 - **Reduck** 是 **React** 应用状态管理库,可以称其为 **React** 应用框架(MVC)。 - 其目标是以 **MVC** 模式组织 **React** 应用开发结构,将业务逻辑维护在 **Model** 层,业务逻辑与 **UI** 解耦,开发业务逻辑更集中、更简单,并减少重复工作(样板代码)。 - 基于 **MVC** 模式,规范一个 **React** 应用开发的架构,**M**(Model) 指 Reduck Model,**V**(View) 指 React UI Component,**C**(View Controller/Container)指 React Container Component。 - 可通过 [**modern.config.js**](#) 关闭。 ::: [**Reduck**](https://github.com/modern-js-dev/reduck) 管理数据流屏蔽了一些 **Redux** 复杂的概念,API 简单易用,同时又完全兼容 **Redux** 写法(方便迁移),以及 **Redux** 丰富的生态。 前端的技术选型里,除了考虑上手成本、生态等因素之外,性能也是一个很重要的衡量因素。**Reduck** 自身基于社区实践做了不少的性能优化处理,同时在使用的时候,合理有效的API传参,也会使性能得到极大的提升。 原始类型较为复杂,下面展示的是简化名称、泛型后的等价函数类型。原始类型见 [**model**](https://github.com/modern-js-dev/reduck/blob/main/packages/store/src/model/model.ts#:~:text=const-,model,-%3D%20%3CState%20%3D%20any%2C%20MDO)。 ## API `model(name) => { define: function }` ### 参数 - name:`string`,创建的 Model 的唯一标识。 ### 返回值 <!-- TODO: @anchao 调整类型 --> ```ts interface NamedModel { define(modelDesc: Record<string, any>): Model; define((context: Context, utils: Utils) => Record<string, any>): Model; } interface Utils { use: UseModel; onMount: OnMountHook; } interface Context { store: ReduxStore; pluginCore: ReturnType<typeof createPluginCore>; apis: { addReducers: (reducers: Record<string, Reducer>) => void; addModel: <M extends Model>(model: M, mountModel: MountedModel<M>) => void; getModel: <M extends Model>(model: M) => MountedModel<M> | null; useModel: ReturnType<typeof createUseModel>; getModelSubscribe: (model: Model) => ReturnType<typeof createSubscribe>; /** * Get mountedModel instance by modelname */ getModelByName: (name: string) => MountedModel | null; /** * Tag that model with name is `param name` is in mounting. */ mountingModel: (modelname: string) => void; } } ``` ## 示例 ### 通过对象创建 **Model** ```tsx title="示例" import { model, useModel } from '@modern-js/runtime/model'; const fooModel = model('foo').define({ state: 'foo' }); function App() { const [state, actions] = useModel(fooModel); // "foo" return <div>state: {state}</div> } ``` ### 通过函数创建 **Model** 通过函数创建,可以在其中拿到 **ReduckStore** 及相关工具函数。 如通过 **use**,可以获取 **model** 自身及其它 **model** 的 **state**,**actions**。 ```tsx title="示例" import { model, useModel } from '@modern-js/runtime/model'; const fooModel = model('foo').define(() => { return { state: 'foo' } }); const barModel = model('bar').define((_, { use }) => { return { state: 'bar', effects: { syncFoo() { const [state, actions] = use(fooModel); actions.setState(state); } } } }); function App() { const [state, actions] = store.use(barModel); useEffect(() => { actions.syncFoo(); }, []); // "foo" return <div>state: {state}</div> } ```