Skip to content

Commit

Permalink
docs: update features [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
geekact committed Oct 20, 2023
1 parent ae107b3 commit f508839
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 62 deletions.
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@
# 特性

- 模块化开发,导出即可使用
- 专注 TS 极致体验,100%类型提示
- 专注 TS 极致体验,超强的类型自动推导
- 内置 [immer](https://github.com/immerjs/immer) 响应式修改数据
- 支持 computed 计算属性,自动收集依赖,可传参数
- 支持私有方法
- 支持计算属性,自动收集依赖,可传参数
- 自动管理异步函数的 loading 状态
- 可定制的多引擎数据持久化
- 使用ES5语法,超强兼容性
- 支持局部模型,用完即扔
- 支持私有方法
- 使用ES5语法,兼容性一流

# 使用环境

Expand Down
102 changes: 52 additions & 50 deletions docs/advanced.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,58 @@ const user3Model = cloneModel('users3', userModel, (prev) => {
});
```

# 局部模型

通过`defineModel``cloneModel`创建的模型均为全局类别的模型,数据一直保持在内存中,直到应用关闭或者退出才会释放,对于比较大的项目,这可能会有性能问题。所以有时候你其实想要一种`用完就扔`的模型,即在 React 组件初始化时把模型数据扔到 store 中,当 React 组件被销毁时,模型的数据也跟着销毁。现在,局部模型很适合你的需求:

```diff
import { useEffect } from 'react';
import { defineModel, useIsolate } from 'foca';

// test.model.ts
export const testModel = defineModel('test', {
initialState: { count: 0 },
reducers: {
plus(state, value: number) {
state.count += value;
},
},
});

// App.tsx
const App: FC = () => {
+ const model = useIsolate(testModel);
const { count } = useModel(model);

useEffect(() => {
model.plus(1);
}, []);

return <div>{count}</div>;
};
```

只需增加一行代码的工作量,利用 `useIsolate` 函数根据全局模型创建一个新的局部模型。局部模型拥有一份独立的状态数据,任何操作都不会影响到原来的全局模型,而且会随着组件一起 `挂载/销毁`,能有效降低内存占用。

另外,别忘了模型上还有两个对应的事件`onInit``onDestroy`可以使用

```typescript
export const testModel = defineModel('test', {
initialState: { count: 0 },
events: {
onInit() {
// 全局模型创建时触发
// 局部模型随组件一起挂载时触发
},
onDestroy() {
// 局部模型随组件一起销毁时触发
},
},
});
```

!> 如果不需要持久化,那么它可以完全代替克隆模型

# loadings

默认地,methods 函数只会保存一份执行状态,如果你在同一时间多次执行同一个函数,那么状态就会互相覆盖,产生错乱的数据。如果现在有 10 个按钮,点击每个按钮都会执行`model.methodX(id)`,那么我们如何知道是哪个按钮执行的呢?这时候我们需要为执行状态开辟一个独立的存储空间,让同一个函数拥有多个状态互不干扰。
Expand Down Expand Up @@ -112,56 +164,6 @@ defineModel('my-global-model', {
store.refresh(true);
```

# 局部模型

通过`defineModel``cloneModel`创建的模型均为全局类别的模型,数据一直保持在内存中,直到应用关闭或者退出才会释放,对于比较大的项目,这可能会有性能问题。所以有时候你其实想要一种`用完就扔`的模型,即在 React 组件初始化时把模型数据扔到 store 中,当 React 组件被销毁时,模型的数据也跟着销毁。现在,局部模型很适合你的需求:

```diff
import { useEffect } from 'react';
import { defineModel, useIsolate } from 'foca';

// test.model.ts
export const testModel = defineModel('test', {
initialState: { count: 0 },
reducers: {
plus(state, value: number) {
state.count += value;
},
},
});

// App.tsx
const App: FC = () => {
+ const model = useIsolate(testModel);
const { count } = useModel(model);

useEffect(() => {
model.plus(1);
}, []);

return <div>{count}</div>;
};
```

只需增加一行代码的工作量,利用 `useIsolate` 函数根据全局模型创建一个新的局部模型。局部模型拥有一份独立的状态数据,任何操作都不会影响到原来的全局模型,而且会随着组件一起 `挂载/销毁`,能有效降低内存占用。

另外,别忘了模型上还有两个对应的事件`onInit``onDestroy`可以使用

```typescript
export const testModel = defineModel('test', {
initialState: { count: 0 },
events: {
onInit() {
// 全局模型创建时触发
// 局部模型随组件一起挂载时触发
},
onDestroy() {
// 局部模型随组件一起销毁时触发
},
},
});
```

# 私有方法

我们总是会想抽出一些逻辑作为独立的方法调用,但又不想暴露给模型外部使用,而且方法一多,调用方法时 TS 会提示长长的一串方法列表,显得十分混乱。是时候声明一些私有方法了,foca 使用约定俗成的`前置下划线(_)`来代表私有方法
Expand Down
20 changes: 12 additions & 8 deletions docs/home.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,18 @@

定义完模型,导出即可在组件中使用,不用再怕忘记注册或者嫌麻烦了。

#### 专注 TS 极致体验,100%类型提示
#### 专注 TS 极致体验,超强的类型自动推导

无 TS 不编程,foca 提供 **100%** 的基础类型提示,能产生一种提示上瘾的快感,而你只需关注业务中的类型。
无 TS 不编程,foca 提供 **100%** 的基础类型提示,强大的自动推导能力让你产生一种提示上瘾的快感,而你只需关注业务中的类型。

#### 内置 [immer](https://github.com/immerjs/immer) 响应式修改数据

可以说加入 immer 是非常有必要的,当 reducer 数据多层嵌套时,你不必再忍受更改里层的数据而不断使用 rest/spread(...)扩展符的烦恼,相反地,直接赋值就好了,其他的交给 immer 搞定。

#### 支持 computed 计算属性,自动收集依赖,可传参数
#### 支持计算属性,自动收集依赖,可传参数

现在,redux 家族不需要再羡慕`vue`或者`mobx`等响应式框架,咱也能支持计算属性并且自动收集依赖,而且是时候把[reselect](https://github.com/reduxjs/reselect)**扔进垃圾桶**了。

#### 支持私有方法

一个前置下划线(`_`)就能让方法变成私有的,外部使用时 TS 不会提示私有方法和私有变量,简单好记又省心。

#### 自动管理异步函数的 loading 状态

我们总是想知道某个异步方法(或者请求)正在执行,然后在页面上渲染出`loading...`字样,幸运地是框架自动(按需)为你记录了执行状态。
Expand All @@ -55,7 +51,15 @@

某些数据在一个时间段内可能是不变的,比如登录凭证 token。所以你想着先把数据存到本地,下次自动恢复到模型中,这样用户就不需要频繁登录了。

#### 使用ES5语法,超强兼容性
#### 支持局部模型,用完即扔

利用全局模型派生出局部模型,并跟随组件`挂载/卸载`,状态与外界隔离,组件卸载后状态自动删除,严格控制内存使用量

#### 支持私有方法

一个前置下划线(`_`)就能让方法变成私有的,外部使用时 TS 不会提示私有方法和私有变量,简单好记又省心。

#### 使用ES5语法,兼容性一流

npm包已经转译成ES5的语法和特性,适用于各种新旧浏览器甚至IE11(符合中国国情)。而且API方面我们只用了 `Promise``Object.assign` 这两个ES6的特性。

Expand Down

0 comments on commit f508839

Please sign in to comment.