把 umi 的 useModel 抽离到其他项目中使用

使用原因

由于管理端是采用umiantd来开发,而其中的全局状态是采用umiuseModel来进行管理的。使用感受就是用起来挺舒服的。

在小程序的开发中也需要用到全局的状态管理,一开始为了赶进度,没多想以为useModel只能用在umi,然后就采用单例模式来进行维护全局的状态了,但是采用这种方法最大的弊端就是每次数据更改,都要手动render一下,然后页面与页面之间数据变化了,又要处理什么时候该render

现在有点时间研究,发现umiuseModel原来已经给我们打包好了,只需稍稍处理就能在其他项目中使用了。

开始抽离

umi项目中的路径为:src/.umi/plugin-model,把plugin-model整个文件夹复制到其他项目中

打开useModel.tsx,进入isEqual里面然后把整个文件也粘出来。

打开Provider.tsx,将里面的initialState也粘出来。

// 里面就这样一行代码(想怎么处理都行)
export default () => ({ loading: false, refresh: () => {} })
在其他项目中使用
  1. 因为useModel主要是采用了useContext来进一步封装出来的钩子,所以想要全局使用,就要在整个项目最外层包裹一层。我这里是taro小程序中使用,所以就包裹在这里了,当然也可以只包裹需要使用的那些父组件(这样就是那些父组件和里面的子组件才能使用了)。
  1. model文件夹中(在其他文件中也行),简单写一个model
import { useState, useCallback } from 'react';

type UserInfo = {
  avatar?: string;
  name?: string;
};
export default function useAuthModel() {
  const [userInfo, setUserInfo] = useState<UserInfo>({name: 'lhh'});
  const setUser = useCallback((userInfo: UserInfo) => {
    setUserInfo(userInfo);
  }, []);

  return {
    userInfo,
    setUser,
  };
}
  1. 引入自己的model,打开Provider.tsx,手动引入
  1. 简单使用
import NavBar from '@/components/navBar';
import { View, Button } from '@tarojs/components'
import Taro from '@tarojs/taro';
import './index.less';
import { useModel } from "@/hooks/useModel";

export default () => {
  // 这里的 user-info 就是第三步引入的时候自己写的 key 值
  const { userInfo } = useModel('user-info')
  
  return (
    <View className='page-test-useModel'>
      <NavBar title={'test-页面一'} />
      <View className="name">这里是父组件:{userInfo?.name}</View>
      <Children></Children>
      <Button onClick={() => Taro.navigateTo({url: '/pages/aatest-useModel2/index'})}>去下个页面</Button>
    </View>
  )
}

const Children = () => {
  const {userInfo, setUser} = useModel('user-info')
  return (
    <View className='com-useModel-c-t'>
      <View className="title">--子组件--</View>
      子组件姓名:{userInfo?.name}
      <Button className="btn" onClick={() => {
        setUser({...userInfo, name: 'lhh改名了' + Date.now()})
      }}>子组件改名</Button>
    </View>
  )
}
### 如何在 Umi 框架中使用 `useModel` 钩子 #### 使用场景与功能介绍 Umi 是一个可插拔的企业级 React 应用框架。为了更好地管理应用状态,Umi 提供了 `useModel` 钩子用于连接页面逻辑到全局的状态管理机制。 通过 `import { useModel } from 'umi'` 可以引入该钩子,在函数组件内部调用它并传入模型名称作为参数,从而获取对应的数据或方法[^1]。 #### 示例代码展示 下面是一个具体的例子展示了怎样利用 `useModel` 来访问来自主应用程序传递给微前端子应用的状态: ```jsx // 导入必要的模块 import { useModel } from 'umi'; function MyPage() { // 调用 useModel 获取由 qiankun 微前端容器注入的应用间共享 state const masterProps = useModel('@@qiankunStateFromMaster'); return ( <div> {/* 将接收到的 props 显示出来 */} {JSON.stringify(masterProps)} </div> ); } ``` 此段代码实现了接收来自父级(即宿主)应用的状态,并将其渲染成字符串形式呈现于界面上。 #### 最佳实践建议 当采用 `useModel` 进行开发时,应该遵循一些最佳实践原则来保持项目的清晰性和维护性: - **单一职责**:确保每个模型只负责特定业务领域内的事务; - **合理拆分**:对于大型项目来说,应当按照功能模块划分多个小型独立模型而非创建臃肿庞大的单体结构; - **异步加载优化**:考虑到性能因素,可以考虑按需懒加载不常使用的部分数据资源; - **错误处理完善**:针对可能出现的各种异常情况做好充分准备,提供友好的反馈提示信息给最终用户。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值