521xueweihan / HelloGitHub

:octocat: 分享 GitHub 上有趣、入门级的开源项目。Share interesting, entry-level open source projects on GitHub.
https://hellogithub.com
92.13k stars 9.62k forks source link

【自荐】React开发框架, Concent V2 #1341

Closed fantasticsoul closed 4 years ago

fantasticsoul commented 4 years ago

项目推荐

import { run } from 'concent';

run({ counter: {// 声明一个名为'counter'的模块 state: { num: 1, numBig: 100 }, // 定义状态 reducer: { // p: payload, m: moduleState addOne: (p, m)=> ({num: m.num + 1}), async add(p, m){ await delay(1000); return {num: m.num + p}; } }, computed: {// 定义computed,注意参数列表里解构时就确定了依赖 numx2: ({num})=> num * 2,// 此函数的依赖是num numBigAddNumx2: ({numBig}, o, f)=> numBig + f.cuVal.numx2,// 复用计算结果,此函数的依赖是numBig、num numSumBig: ({num, numBig})=> num + numBig, // 此函数的依赖是num、numBig }, }, // 可以在这里继续声明或添加其他模块 });

@register('counter') class DemoCls extends React.Component{ // 此时setState提交的状态触发自己重渲染 // 同时也会触发其他同样属于coutner模块的实例且消费了具体数据的实例重渲染 // 或调用 this.ctx.mr.{xxxMethod} 触发moduleReducer的逻辑去修改状态 inc = ()=> this.setState({num: this.state.num + 1})

render(){ // 这里读取了num,意味着当前实例的依赖key列表是 ['num'] // 如果是条件渲染则推荐延迟解构,以便锁定最小范围的数据依赖 const { num } = this.state; // render logic } }

function DemoFn(){ const { state, setState, mr } = useConcent('counter'); const inc = ()=> setState({num: state.num + 1}); // 或者通过 mr.{xxxMethod} 直接绑定在 dom的onClick事件上 // render logic }



- 截图:
[组合api](https://stackblitz.com/edit/react-wpzgqd?file=index.js)
![](https://raw.githubusercontent.com/fantasticsoul/assets/master/img/cc/hello.gif)
[精确更新](https://codesandbox.io/s/dep-collection-uiqzn?file=/src/App.js)
![](https://raw.githubusercontent.com/fantasticsoul/assets/master/article-img/recoil-vs-concent/r5.gif)

## 备注(这一段请删掉,仅用于说明)
https://hellogithub.com/periodical/search/?q=concent 可以搜到concent,当时推荐还是v1版本,v1强调的是依赖标记,而v2版本已进行彻底的重构,和v1已经完全的不同,v2启用proxy来达到运行时依赖收集的功能,无需依赖标记,所以这里重新提了一个自荐哦。
521xueweihan commented 4 years ago

非常感谢您推荐项目。

该项目暂不能收录到 HelloGitHub 月刊中,HelloGitHub 推荐项目审核标准 #271。 期待持续完善该项目,后续推荐更多的项目。

再次感谢您对 HelloGitHub 的支持 🙏