把 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>
  )
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
umi 是一个基于 React 的企业级前端应用开发框架,可以帮助开发者快速构建高质量的单页应用或多页应用。使用 umi 时,可以通过 useModel使用 umi 的模型。 useModelumi 用于访问和管理模型的 Hook,可以在函数组件使用。在使用 useModel 之前,需要先在 model 文件夹定义模型。 具体使用方法如下: 1. 在函数组件引入 useModel ``` import { useModel } from 'umi'; ``` 2. 使用 useModel 获取模型对象 ``` const model = useModel('modelName'); ``` 其,modelName 是在 model 文件夹定义的模型名称。 3. 在组件使用模型 ``` function MyComponent() { const model = useModel('modelName'); const { data, error, loading } = model.someEffect(); // ... } ``` 在组件,可以通过模型对象调用模型的方法,例如一些异步操作。 注意:在使用 useModel 之前,需要先在 config/config.ts 文件配置 model 属性,指定 model 文件夹的路径。 ``` export default { // ... // 配置 model 文件夹的路径 // 即 model 文件夹所在的目录 // 默认为 src/models // 如果在根目录下创建了 models 目录,则需要手动指定路径为 ./models // 如果没有使用 model,则可以省略该属性 // 例如:model: {}, model: { // 指定 model 文件夹的路径 // 如果 models 目录在根目录下,则为 './models' // 如果 models 目录在 src 目录下,则为 './src/models' // 如果没有使用 model,则可以省略该属性 // 例如:'./models', dir: 'model', }, // ... }; ``` 以上就是使用 umi useModel Hook 的基本方法,希望能帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值