最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • useStores-基于 useContext 对 Mobx 进行封装并全局管理 React 状态

    正文概述 掘金(ClausClaus)   2020-12-15   563

    前言

    在理解状态管理的概念之前,你必须认识到什么是状态。在 React 中,状态就是你的应用程序的数据层。当谈到 React 和帮助它管理状态的库时,你可以说状态是一个包含你的应用程序正在处理的数据的对象。例如,如果你想在你的应用程序上显示一个项目列表,则状态将包含你打算要显示的项目。状态会影响 React 组件的行为和渲染方式。是的!仅此而已,就这么简单。

    因此,状态管理意味着监控和管理您的应用的数据(即状态)。几乎所有的应用程序都有这样或那样的状态,因此,管理状态已成为当今构建任何现代应用程序的最重要部分之一。

    当你考虑 React 应用中的状态管理时,基本上有三种选择:

    • Redux
    • React Context API
    • MobX

    Mobx

    我工作中使用 Mobx 作为 React 应用的状态管理库,Mobx 不仅仅适用于 React,它也可以与其他为 Web 应用程序提供动力的 JavaScript 库和框架一起使用。本章将封装一个全局管理 React 应用状态的自定义钩子函数。

    • 仓库地址,基于create-react-app创建,创建过程及相关依赖如下:
      1. npx create-react-app react-use-mobx --template typescript
      2. npm i mobx mobx-react axios

    封装过程

    1. 假设应用有两个需要进行管理的商店 CounterStoreThemeStore,新建 src/stores/文件夹

      通过使用 makeAutoObservable 这个 Mobx 提供的 API 将相关属性进行包装,返回一个可观察的对象。

      • src/stores/CounterStore/index.ts

        import { makeAutoObservable } from 'mobx';
        
        export default function CounterStore() {
          return makeAutoObservable({
            count: 0,
            increment() {
              this.count++;
            },
            decrement() {
              this.count--;
            },
            get doubleCount() {
              return this.count * 2;
            },
          });
        }
        
      • src/stores/ThemeStore/index.ts

        import { makeAutoObservable } from 'mobx';
        
        type ThemeStyle = 'light' | 'dark';
        
        export default function ThemeStore() {
          return makeAutoObservable({
            theme: 'light',
            setTheme(newTheme: ThemeStyle) {
              this.theme = newTheme;
            },
          });
        }
        
    2. 使用React.createContext创建一个storesContext,新建src/contexts/文件夹

      • src/contexts/storesContext/index.tsx

        import React from 'react';
        import { CounterStore, ThemeStore } from '../../stores';
        
        const storesContext = React.createContext({
          counterStore: CounterStore(),
          themeStore: ThemeStore(),
        });
        
        export default storesContext;
        
    3. 编写一个自定义钩子函数useStores来访问导出的storesContext上下文对象,新建src/hooks文件夹

      • src/hooks/useStores/index.ts

        import React from 'react';
        import { storesContext } from '../../contexts';
        
        const useStores = () => React.useContext(storesContext);
        
        export default useStores;
        
    4. 前三步完成了 store 的编写,将其添加为上下文对象的属性,最后编写自定义钩子函数将上下文对象进行导出。现在我们已经准备好开始消费和使用我们的 store 数据了,新建src/components文件夹

      • src/components/Counter/index.tsx

        import React from 'react';
        import { observer } from 'mobx-react';
        import { useStores } from '../../hooks';
        
        const Counter: React.FC = () => {
          const { counterStore } = useStores();
        
          return (
            <>
              <div>{counterStore.count}</div>
              <button onClick={() => counterStore.increment()}>++</button>
              <button onClick={() => counterStore.decrement()}>--</button>
            </>
          );
        };
        
        export default observer(Counter);
        
      • src/components/ThemeToggler/index.tsx

        import { observer } from 'mobx-react';
        import { useStores } from '../../hooks';
        
        const ThemeToggler = () => {
          const { themeStore } = useStores();
        
          return (
            <>
              <div>{themeStore.theme}</div>
              <button onClick={() => themeStore.setTheme('light')}>白天</button>
              <button onClick={() => themeStore.setTheme('dark')}>黑夜</button>
            </>
          );
        };
        export default observer(ThemeToggler);
        

      在组件中引入自定义钩子函数,并通过解构赋值的方式将组件需要使用到的 store 进行声明,这样就可以在组件内需要的地方消费 store 提供的数据了。

    5. 最后将组件进行挂载

      src/App.tsx

      import React from 'react';
      import Counter from './components/Counter';
      import ThemeToggler from './components/ThemeToggler';
      
      function App() {
        return (
          <div className="App">
            <main>
              <Counter />
              <ThemeToggler />
            </main>
          </div>
        );
      }
      
      export default App;
      

      通过执行npm run start打开的localhost:3000端口,可以看到数据成功展示,此时点击 count 加减按钮可以修改数据的状态,点击主题切换按钮也可以正确的切换主题。

      至此,通过React.useContext这个 API 与 Mobx 的结合,我们成功将 Mobx 的商店数据进行封装,并且可以在组件中消费这些数据。

    总结

    文章主要介绍了怎么在 React 应用中使用 Mobx 进行状态管理,你可以根据文中的配置步骤,搭建一个集成了 Mobx 的 React App、形象化的理解 Mobx 中重要的概念 (观察者模式),在 React 上的状态管理方面,MobX 可能没有 Redux 那么受欢迎,但它非常成熟,易于上手,并提供了一种无缝集成到新的或现有应用程序中的方法。


    起源地下载网 » useStores-基于 useContext 对 Mobx 进行封装并全局管理 React 状态

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元