Git Product home page Git Product logo

Comments (4)

fantasticsoul avatar fantasticsoul commented on August 21, 2024

这个提案挺好的,本意是希望严格约束对象更新流程,方便变更记录可追溯,但是对于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

松散模式,不限制任何变更操作

查看变更记录可参照这个示例,引入插件
然后写一个带有响应式描述的的变更操作
image

将会看到devtool有详细的变更记录可追溯

注:不添加描述的话,type为 xxxxModule@Reactive/setState

image

from helux.

zhangfisher avatar zhangfisher commented on August 21, 2024

strictLevel还行

而reactive.a.b.c = 1; reactiveDesc('xxxChange')
分两句来写比较不可接受,
还是reactive.a.b.c=action()方式比较好,语义上也符合通过action来更新的含义

from helux.

fantasticsoul avatar fantasticsoul commented on August 21, 2024

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.

fantasticsoul avatar fantasticsoul commented on August 21, 2024

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(); // 由事件循环系统触发提交

理解完这个设计,你就明白 reacitveaction是不符合内部运行机制的,也不符合用户习惯

from helux.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.