经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
如何利用 React Hooks 管理全局状态
来源:cnblogs  作者:几乎一米八的徐某某  时间:2021/1/11 9:35:06  对本文有异议

如何利用 React Hooks 管理全局状态

本文写于 2020 年 1 月 6 日

示例代码:https://github.com/AerospaceXu/hooks-soa

React 社区最火的全局状态管理库必定是 Redux,但是 Redux 本身就是为了大型管理数据而妥协设计的——这就会让一些小一点的应用一旦用上 Redux 就变得复杂无比。

后来又有了 Mobx,它对于小型应用的状态管理确实比 Redux 简单不少。可是不得不说 Mobx+React 简直就是一个繁琐版本的 Vue。

另外不管是 react-redux 还是 mobx,他们使用的时候都非常复杂。需要你去组件函数或是组件类上修修改改,我个人从审美上来说就不是很喜欢。

后来用了 Angular 之后,我就开始对 SOA 产生好感,ng 的 Service 与依赖注入我都觉得非常漂亮。

Service 是 Angular 的逻辑复用形式,并且解决了共享状态的问题,那 React 的自定义 Hook 可以达到类似的效果嘛?

可以,并且会比 Angular 更简洁。

自定义 Service

材料:useXxxx(自定义 hook), createContext, useContext

我们做一个最简单的计数器吧:一个 button,一个 panel,button 用来增加,panel 用来展示。

  1. const App: React.FC = () => {
  2. return (
  3. <div>
  4. <Button />
  5. <Panel />
  6. </div>
  7. );
  8. };

然后我们来定义我们的 Service:

  1. // services/global.service.ts
  2. interface State {
  3. count: number;
  4. handleAdd: () => void;
  5. }
  6. export const GlobalService = createContext<State>(null);

我们选择让一个 Context 成为一个 Service,这是因为我们可以利用 Context 的特性来进行状态共享。

然后我们创建一个自定义 Hook,并且在 Context.provider 中传入该 Root Service:

  1. // services/global.service.ts
  2. export const useRootGlobalService = () => {
  3. const [count, setCount] = useState<number>(0);
  4. const handleAdd = useCallback(() => {
  5. setCount((n) => n + 1);
  6. }, []);
  7. return {
  8. count,
  9. handleAdd,
  10. };
  11. };

接着我们再创建一个自定义 Hook,让我们可以随时拿到该 Service:

  1. // services/global.service.ts
  2. export const useGlobalService = () => useContext(GlobalService);

接着我们就可以运用了

  1. // App.tsx
  2. import { GlobalService, useRooGlobalService } from './services/global.service';
  3. const App: React.FC = () => {
  4. return (
  5. <GlobalService.Provider value={useRooGlobalService()}>
  6. <div>
  7. <Button />
  8. <Panel />
  9. </div>
  10. </GlobalService.Provider>
  11. );
  12. };
  13. // Button.tsx
  14. import { useGlobalService } from '../services/global.service';
  15. const Button: React.FC = () => {
  16. const { handleAdd } = useGlobalService();
  17. return <button onClick={() => handleAdd()}>+</button>;
  18. };
  19. // Panel.tsx
  20. import { useGlobalService } from '../services/global.service';
  21. const Panel: React.FC = () => {
  22. const { count } = useGlobalService();
  23. return <h2>{count}</h2>;
  24. };

(完)

原文链接:http://www.cnblogs.com/xhyccc/p/14242492.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号