- computed内使用数组状态数据时,更新数组不会触发重新计算
- 删除无用类型
ComputedRef
- 持久化引擎支持
同步
引擎。因此可以直接使用浏览器内置的 localStorage 和 sessionStorage 接口
- 删除hooks函数
useDefined
- 删除模型内
onDestroy
事件钩子
- 删除持久化
maxAge
配置
store.init({
persist: [
{
key: 'key',
- maxAge: 3600,
engines: engines.localStorage,
models: [],
}
]
})
const model = defineModel('model', {
initialState: { firstName: '', lastName: '' },
methods: {
myMethod() {
- return this.fullName.value;
+ return this.fullName();
}
},
computed: {
fullName() {
return this.state.firstName + this.state.lastName;
},
}
});
- 开启持久化的模型会立即存储initialState
- 计算属性支持传递参数
const model = defineModel('model', {
initialState: { firstName: '', lastName: '' },
methods: {
myMethod() {
+ const profile = this.profile(30, 'addr', false);
}
},
computed: {
fullName() {
return this.state.firstName + this.state.lastName;
},
+ profile(age: number, address: string, coding: boolean = true) {
+ return this.fullName() + '-' + age + address + coding;
+ },
}
});
const App: FC = () => {
const fullName = useComputed(model.fullName);
+ const profile = useComputed(model.profile, 20, 'my-address');
}
- 持久化增加 dump 和 load 两个系列化函数
const model = defineModel('model', {
initialState: { firstName: 'tick', lastName: 'tock' },
persist: {
+ dump(state) {
+ return state.firstName;
+ },
+ load(dumpData) {
+ return { ...this.initialState, firstName: dumpData };
+ },
}
});
- 持久化新增合并模式
replace
, merge
(默认), deep-merge
store.init({
persist: [
{
key: 'item1',
version: '1.0',
+ merge: 'replace',
engine: engines.localStorage,
models: [],
},
]
})
- npm包转译为ES5语法以兼容更早的浏览器 (#41)
- immer版本降级:10.0.2 -> 9.0.21
- react-redux版本升级:8.1.2 -> 8.1.3
- react-redux 版本从 8.1.1 升级到 8.1.2 (#40)
- 不再兼容 IE 浏览器
- 最小 React 版本为 18
- 最小 TypeScript 版本为 5.0
- immer 版本从 9.0.21 升级到 10.0.2
- react-redux 版本从 8.0.5 升级到 8.1.1
- 删除废弃字段
actions
和 effects
- 在 onInit 事件内执行的 async method 未储存 loading 状态 (#38)
- immer 版本从 9.0.16 升级到 9.0.21
- redux 版本从 4.2.0 升级到 4.2.1
- 支持 typescript@5
defineModel('unique_name', {
initialState: { a: 'a', b: 'b' },
methods: {
test() {
this.setState(() => {
return { a: 'xxx' };
});
console.log(this.state); // { a: 'xxx', b: 'b' }
},
},
});
- 传给 reducer 的
initialState
不再执行深拷贝,而是在开发环境下进行冻结处理以防开发者错误操作
const initialState = { a: 'a', b: 'b' };
defineModel('unique_name', {
initialState: initialState,
});
// 修改失败,严格模式下会报错
// TypeError: Cannot assign to read only property 'a' of object '#<Object>'
initialState.a = 'xxx';
- 重命名 actions 为 reducers (#29)
- 重命名 effects 为 methods (#29)
- exports 导出 package.json 文件
- 不再支持[email protected]
const initialState = { a: 1, b: 'x' };
this.setState({ a: 2, b: 'y' }); // state === { a: 2, b: 'y' }
this.setState({ a: 123 }); // state === { a: 123, b: 'y' }
this.setState({ b: 'hello' }); // state === { a: 123, b: 'hello' }
- 修复在 react17 下 action-in-action 中间件可能报错的问题 (#20)
- 完善 action-in-action 的报错信息
- 删除已废弃函数
useDefinedModel
,代替函数:useDefined
- 删除已废弃属性
hooks
,代替属性:events
- 删除已废弃的方法
assign
,代替方法:room
- 支持最小 React 版本为
16.14.0
- 在开发环境下检测
action in action
的错误操作并抛出异常
- 废弃函数
useDefinedModel
,并新增函数 useDefined
作为代替
- 修复计算属性在返回 原始数组 或者 原始对象 时无法访问的问题
- 优化 initialState 深拷贝速度
- initialState 现在支持传递
undefined
值 (#17)
- 增加局部模型接口
useDefinedModel
,数据跟随组件挂载和释放
- 提升计算属性的脏检测效率
- 优化 loading 写入性能
- 修复 react 命名导出在 node ESM 环境中可能报错的风险
- 打包不再使用
.mjs
后缀,设置新的 package.json 同样可以识别成 ESM
- 不再导出
combine
方法,因为几乎用不上
- 优化持久化逻辑
- 使用中文提示错误和警告
- 废弃 effects 中的
assign
方法,并新增 room
作为代替
const testModel = defineModel('test', {
effects: {
xyz(id: number) {},
},
});
- testModel.xyz.assign(1).execute(1)
+ testModel.xyz.room(1).execute(1)
- useLoading(testModel.xyz.assign).find(1)
+ useLoading(testModel.xyz.room).find(1)
- 优化 computed in computed 时的缓存对比策略
- 废弃属性
hooks
并推荐使用 events
以防止和 react-hooks 在名字上混淆。属性 hooks
将在 1.0.0 版本发布时删除。
export const testModel = defineModel('test', {
initialState,
- hooks: {},
+ events: {},
});
- 模型新增生命周期
onChange(prevState, nextState)
以监听当前模型的状态变化
- 模型新增 computed 计算属性,并新增
useComputed
配合使用
- 使用新的文件打包方案以解决在 node 环境下无法使用 ESM 的问题
- 使用简单的 JSON.stringify 和 JSON.parse 处理初始值的深度拷贝任务
- 增强初始化时的 compose 类型
- 设置 sideEffects 以适配 tree-shaking
- 日志字符串
redux-devtools
现在只在非生产环境生效
- 在开发环境下允许多次执行
store.init()
以适应热重载
- 持久化解析失败时一律抛出异常
- [Breaking] 删除
useMeta()
, getMeta()
接口,移除 meta 概念
- 修复 IDE 中 React 组件调用的模型方法无法点击跳转回模型的问题
- 支持私有方法,在模型外部使用会触发 TS 报错(属性不存在)
- [Breaking] ctx.dispatch 重命名为 ctx.setState
difineModel('name', {
effects: {
foo() {
- this.dispatch({ count: 1 });
+ this.setState({ count: 1 });
}
}
})
- 删除部分继承的 Error 类,直接使用原生 Error
- 过期的持久化数据不再自动重新生成
- [Breaking] 删除 Map/Set 特性
- 内置并简化深对比函数
- [Breaking] effect.meta() 重命名为 effect.assign()
- model.effect.meta(ID).execute(...);
+ model.effect.assign(ID).execute(...);
- [Breaking] {get|use}Meta 和 {get|use}Loading 的 pick() 重命名为 find()
- useLoading(model.effect, 'pick').pick(ID)
+ useLoading(model.effect.assign).find(ID)
- useLoading(model.effect, 'pick', ID)
+ useLoading(model.effect.assign, ID)
- 取消导出部分 redux 模块
- 增加 metas 和 loadings 在开发环境下的不可变特性
- [Breaking] 删除重复且难以理解的 api
useLoadings
, useMetas
, getLoadings
, getMetas
- 模型增加钩子函数 onInit
- 修复 getLoadings 和 useLoadings 始终返回新对象的问题
- 使用 Object.assign 代替插件包 object-assign
- 增加 combine() 函数以覆盖状态库共存时使用 connect() 高阶组件的场景
- 提升 useModel 在传递单个模型时的执行效率
- useModel 没有传回调函数时,不再提供对比算法参数
- react 最小依赖版本现在为 16.9.0
- 优化 dispatch 性能
- 引入 process.env.NODE_ENV 以减少生产环境的体积
- 精简代码
- 内置插件包 symbol-observable
- 升级 immer 版本
- 重写 action 和 effect 增强函数
- [Breaking] keepStateFromRefresh 重命名为 skipRefresh
- 修复 dispatch meta 时未命中拦截条件
- 重构拦截器
- 重构 reducer 生成器
- 完善测试用例
- 对 action 进行拦截以避免无意义的状态更新和组件重渲染
- 增加及时状态方法:
getLoading
, getLoadings
, getMeta
, getMetas
- 增加 hooks 方法:
useLoadings
, useMetas
- meta 增加 type 字段,并由此检测 loading 状态
- useModel 可以手动传入对比算法,未传则由框架动态决策
- 提升异步状态追踪性能
- 提升数据合并性能
- 删除 tslib 依赖
- 定义模型时的属性 state 重构为 initialState,防止和 actions 的 state 变量名重叠以及 eslint 规则报错。
- action 的返回类型更新为 AnyAction
- 内部方法 dispatch 现支持直接传入完整的新 state。如果你只想更新 state 的某个值,则仍然使用回调。
- 修改异步方法报错时 action.type 的文字
- 模块化
- 持久化
- 支持类型提示
- 支持 Map/Set
- 支持 immer
- 与其他 redux 库共存,方便迁移