Comments (4)
这个提案挺好的,本意是希望严格约束对象更新流程,方便变更记录可追溯,但是对于helux内部来说 reactive 和 setState 底层都是一套逻辑,是可以完美共存的,但提案的实现不太优雅,可能加的参数应该为 strictLevel 更合适,
- strictLevel=0
最严格模式,只能使用 action提交变更(action自带描述)
- strictLevel=1
表示使用响应式更新必须追加描述值,方便响应式变更也是可追踪到具体位置,如果没有没有desc,则变更操作不会提交(相当于改的草稿无效),开发模式给出报错。
reactive.a.b.c = 1;
reactiveDesc('xxxChange')
使用setState必须追加描述值,方便响应式变更也是可追踪到具体位置
setState((draft)=>reactive.a.b.c = 1, {desc:'xxxChange'});
- strictLevel=2
松散模式,不限制任何变更操作
查看变更记录可参照这个示例,引入插件
然后写一个带有响应式描述的的变更操作
将会看到devtool有详细的变更记录可追溯
注:不添加描述的话,type为
xxxxModule@Reactive/setState
from helux.
strictLevel还行
而reactive.a.b.c = 1; reactiveDesc('xxxChange')
分两句来写比较不可接受,
还是reactive.a.b.c=action()方式比较好,语义上也符合通过action来更新的含义
from helux.
action 本身就是修改数据的逻辑,返回格式[nextSnap, err]
,强行和reative
结合在一起不符合设计, 目前defineActions
使用方式如下
// 【可选】约束各个函数入参 payload 类型
type Payloads = {
changeA: [number, number];
foo: boolean | undefined;
};
// 为方便提供各函数 payload 类型约束,这里采用柯里化方式
const { actions, useLoading, getLoading } = ctxp.defineActions<Payloads>()({
// 同步 action,直接修改草稿
changeA1({ draft, payload }) {
draft.a.b.c = 200;
},
// 同步 action,返回部分状态
changeA2({ draft, payload }) {
return { c: 'new desc' };
},
// 同步 action,直接修改草稿和返回部分状态同时使用
changeA3({ draft, payload }) {
draft.a.b.c = 200;
return { c: 'new desc' };
},
// 异步 action,直接修改草稿
async foo1({ draft, payload }) {
await delay(3000);
draft.a.b.c += 1000;
},
// 异步 action,多次直接修改草稿,返回部分状态
async foo2({ draft, payload }) {
draft.a.b.c += 1000;
await delay(3000); // 进入下一次事件循环触发草稿提交
draft.a.b.c += 1000;
await delay(3000); // 再次进入下一次事件循环触发草稿提交
const list = await fetchList();
return { list }; // 等价于 draft.list = list
},
});
// action 方法的异常默认被拦截掉不再继续抛出,只是并发送给插件和伴生loading状态
// 调用方法,错误会传递到 err 位置
const [ snap, err ] = actions.changeA1();
// 调用方法并抛出错误,此时错误既发给插件和伴生loading状态,也向上抛出,用户需自己 catch
const [ snap ] = actions.changeA1(1, true);
from helux.
reactive
只表示数据修改,提交时机默认是下一次事件循环,
reactive.a.b.c =1;
reactive.a.b.c2 =2;
reactive.info = 'xxx';
await someMethod(); // 触发提交
可以主动提交
reactive.a.b.c =1;
flush(reactive, 'change_a.b.c'); // 主动提交,触发更新
reactive.a.b.c2 =2;
flush(reactive, 'change_a.b.c2'); // 主动提交,触发更新
reactive.info = 'xxx';
await someMethod(); // 由事件循环系统触发提交
理解完这个设计,你就明白 reacitve
接action
是不符合内部运行机制的,也不符合用户习惯
from helux.
Related Issues (20)
- [RFC] 提供启用/禁用派出计算的API` enableMutates(true/false)` HOT 4
- TypeError: Cannot destructure property 'STATE_SHARED_KEY_MAP' of 't' as it is undefined. HOT 1
- [BUG] 对share对象的一部分进行 useAtom 访问时,出现意外行为 HOT 2
- [Feature] lifecycle HOT 2
- [Optimize] merge triggered non-first-level watch if they have same fnKey HOT 1
- derive 提示用户依赖需提前声明,否则会照成依赖丢失 HOT 2
- derive 派生函数如何捕获状态中可选链的依赖问题(How does the derived function capture the dependency problem of optional chaining in the state?) HOT 1
- [FEATURE] 开发一个跟踪调试插件 HOT 1
- 是否能提供 Perf Benchmark 测试报告? HOT 1
- [❤️ Sponsor] 小小鼓励,给予开发者更多动力
- [Feature] useLocalAtom
- [RoadMap] helux-2024 roadmap
- [FEATURE] 为`runMutateTask`提供入参`extraArgs`来传递给`mutate`的`task` HOT 1
- 无法控制布尔Boolean的展示 HOT 1
- [question] stopArrDep 具体行为 HOT 2
- sharex文档页访问404
- share 通过ctx调用setState 操作数组新增删除操作数组数据依赖收集无效 HOT 3
- 是否可以添加销毁mutate功能 HOT 3
- error only-dev-mode tip: moduleName AuthWithModule@Loading duplicate! HOT 1
- [提示] 关于死循环检测 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from helux.