尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

10分钟上手ReSub:从0搭建一个自动订阅的React Todo应用

10分钟上手ReSub:从0搭建一个自动订阅的React Todo应用 10分钟上手ReSub从0搭建一个自动订阅的React Todo应用【免费下载链接】ReSubA library for writing React components that automatically manage subscriptions to data sources simply by accessing them项目地址: https://gitcode.com/gh_mirrors/re/ReSubReSub 是微软开源的一款React 自动订阅数据管理库组件只要访问一次数据仓库Store中的方法ReSub 就会自动建立订阅关系——数据一变组件立即重新渲染。没有手动 subscribe/unsubscribe没有漏订阅的经典 Bug10 分钟就能搭出一个会自动刷新的 Todo 应用。 什么是 ReSub为什么自动订阅这么好在传统 Flux 模式里组件需要手动做三件事取数据 → 订阅数据 → 取消订阅。稍有不慎就会出现取了数据却没订阅页面不更新或过度订阅性能浪费的问题。ReSub 用自动订阅AutoSubscriptions解决了这一切传统做法ReSub 做法手动store.subscribe(...)访问autoSubscribe方法即自动订阅手动unsubscribe防内存泄漏组件卸载时自动清理容易订阅整个 Store 造成多余渲染支持按 key 精准订阅样板代码多核心逻辑只有两三行 核心理念组件只关心数据ReSub 只负责同步。 快速开始一键安装步骤第 1 步安装依赖ReSub 在 npm 上名为resub安装即可npm install resub --save要求react 16.11见项目package.json中的 peerDependenciesTypeScript 项目需开启experimentalDecorators。第 2 步可选克隆源码看示例git clone https://gitcode.com/gh_mirrors/re/ReSub克隆后可以直接打开examples/counter/计数器示例和examples/async/异步数据示例对照学习两个示例都附带独立的package.json进入目录执行npm install npm start即可在浏览器里跑起来。 3 步搭建自动订阅的 React Todo 应用第 1 步创建数据仓库 TodosStoreStore 继承自StoreBase用autoSubscribe标记可被自动订阅的读取方法import { StoreBase, AutoSubscribeStore, autoSubscribe } from resub; AutoSubscribeStore class TodosStore extends StoreBase { private _todos: string[] []; addTodo(todo: string) { this._todos this._todos.concat(todo); // 用新数组保持引用语义正确 this.trigger(); // 关键通知所有订阅者 } autoSubscribe getTodos() { return this._todos; } } export new TodosStore();只有两个要点改完数据调用this.trigger()给读取方法加autoSubscribe。第 2 步创建 TodoList 组件组件继承自ComponentBase重写_buildState。魔法发生在这里——只要你在_buildState里调用了TodosStore.getTodos()订阅就自动建立了import * as React from react; import { ComponentBase } from resub; import TodosStore require(./TodosStore); class TodoList extends ComponentBase{}, { todos?: string[] } { protected _buildState() { return { todos: TodosStore.getTodos() }; // 访问即订阅 } render() { return ( ul classNametodos {this.state.todos!.map(todo li{todo}/li)} /ul ); } } export TodoList;第 3 步挂载运行import * as React from react; import * as ReactDOM from react-dom; import TodoList require(./TodoList); ReactDOM.render(TodoList /, document.getElementById(root));Done!之后任何地方调用TodosStore.addTodo(写文章)列表都会自动重新渲染——全程零订阅代码。这个 Todo 示例的完整版本可在项目根目录 [README.md] 的 Basic Example 一节找到与上面代码一一对应。⚙️ 自动订阅的底层原理理解原理后你就知道 ReSub 为什么可靠_buildState会在三种时机被调用组件初始化、props 变化、订阅被触发组件首次构建状态时调用getTodos()ReSub 自动向TodosStore注册订阅Store 执行trigger()时回调触发_buildState重新构建状态并渲染组件卸载时ReSub 用引用计数自动注销订阅不会内存泄漏。实现细节分布在src/StoreBase.ts订阅与触发机制、src/ComponentBase.ts_buildState生命周期、src/AutoSubscriptions.ts装饰器与自动订阅核心想深挖可以按图索骥。 性能优化从能用到好用ReSub 官方建议先写最简单的代码出现性能问题再优化。按顺序递进的 4 级方案级别手段适用场景1️⃣在_buildState中整体重建状态绝大多数组件的默认做法2️⃣按 key 订阅key/autoSubscribeWithKey组件渲染过频繁3️⃣throttleMs节流 触发块Trigger Block高频数据流量4️⃣手动store.subscribe()精细控制状态重建本身太昂贵以高优先级待办列表为例只想在自己关心的变更时刷新autoSubscribe getTodosForUser(key username: string) { return this._todosByUser[username]; }组件里调用getTodosForUser(this.props.username)后只有该用户的 Todo 变化才会触发渲染别人的变化不会打扰它。⚛️ 函数组件也能自动订阅习惯函数组件ReSub 2.3 提供了withResubAutoSubscriptions高阶包装内部基于 hooks 实现import { withResubAutoSubscriptions } from resub; function TodoList() { const todos TodosStore.getTodos(); // 同样自动订阅 return ul{todos.map(t li key{t}{t}/li)}/ul; } export default withResubAutoSubscriptions(TodoList);⚠️ 注意两点调用autoSubscribe方法的规则与 hooks 相同不能放在条件语句里必须用withResubAutoSubscriptions包裹否则订阅不会生效开发模式下会给出警告。❓ 新手常见问题清单Q1不用 TypeScript 能用吗可以但会失去自动订阅它依赖 TypeScript 装饰器只能使用ComponentBase/StoreBase的组织模式。Q2用 Babel 转译 TypeScript 报错需要额外安装babel-plugin-parameter-decorator与babel/plugin-proposal-decorators并在 babel 配置中开启{ legacy: true }。Q3升级 v2 后componentWillMount等老生命周期不生效这是设计使然——v2 改走getDerivedStateFromProps路径以适配 React 的未来异步渲染标准用法只用_buildState完全不受影响。Q4调试时如何看性能数据调用setPerformanceMarkingEnabled(true)开启性能标记ReSub 会记录_buildState与订阅回调的耗时。Q5项目里有没有测试可以参考有test/StoreBase.spec.tsx与test/AutoSubscribe.spec.tsx覆盖了订阅的核心行为是很好的行为参考。 延伸阅读项目关键路径速查核心源码src/StoreBase.ts、src/ComponentBase.ts、src/AutoSubscriptions.ts全局选项如开发模式开关src/Options.ts官方计数器示例examples/counter/官方异步数据示例examples/async/完整 API 文档根目录README.mdMIT 开源协议LICENSE✅ 小结ReSub 的卖点一句话就能说清读取即订阅触发即更新。用 20 行代码换来的是告别手动订阅样板代码、杜绝漏订阅 Bug、并为大数据量场景预留了按 key 订阅与节流等性能调优手段。从上面的 Todo 应用出发打开examples/counter/对照跑一遍10 分钟后你完全可以把它搬进自己的 React 项目了。【免费下载链接】ReSubA library for writing React components that automatically manage subscriptions to data sources simply by accessing them项目地址: https://gitcode.com/gh_mirrors/re/ReSub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表