umi项目中使用recoil替换dva

简介: 本文介绍使用recoil库来在umi项目中进行组件间的状态共享,部分替换dva的功能。

umi项目中使用recoil替换dva

因为之前做的一个项目不能使用dva进行状态管理并替换成了recoil,本文对替换过程做一下记录,介绍使用recoil库来在umi项目中进行组件间的状态共享,部分替换dva的功能。

本文使用的的umi版本为3.x。

禁用dva插件

// config/config.ts
export default defineConfig({
    plugins: ['./config/umi-skip-dva-plugin'],
});

// config/umi-skip-dva-plugin.ts
module.exports = function (api) {
  api.describe({
    id: 'umi-skip-dva-plugin',
    key: 'umi-skip-dva-plugin',
  });
  api.logger.warn(
    '请注意以下插件被项目禁用:',
    '@umijs/plugin-dva',
    '请使用recoil来进行共享状态管理,
  );
  api.skipPlugins(['@umijs/plugin-dva']);
};

umi项目中集成recoil:

使用插件快速集成:

npm install umi-plugin-recoil
# or
yarn add umi-plugin-recoil

这个插件为我们设置好了recoil环境:

// src/index.ts
import { IApi } from 'umi';
import { join } from 'path';

export default (api: IApi) => {
  api.addRuntimePlugin(() => join(__dirname, 'RecoilRoot'));
};

// src/RecoilRoot.jsx
import React from 'react';
import { RecoilRoot } from 'recoil';

export const rootContainer = (element) => {
  return (
    <RecoilRoot>
      <span style={{ display: 'none' }}>RecoilRoot</span>
      {element}
    </RecoilRoot>
  );
};

定义共享状态:

// src/pages/home/recoil/homeModel.ts

import { atom } from 'recoil';

export interface IState {
  name: string;
  id: string;
}

const selecteProjectState = atom<IState | undefined>({
  key: 'homeState',
  default: undefined,
});

export default selecteProjectState;

订阅共享状态

// src/pages/home/index.ts
import { useRecoilValue } from 'recoil';
import homeState from './recoil/homeState';

export default () => {
    const state = useRecoilValue(homeState);
    return <div>{state?.name ?? '-'}</div>;
}

修改共享状态

// src/pages/home/edit/index.ts
import { useRecoilState } from 'recoil';
import homeState from '../recoil/homeState';

const Update = () => {
    const [_, updateState] = useRecoilState(homeState);
    return <button onClick={() => updateState({ id: '123', name: '123' })}>修改</button>;

关于 recoil

请查阅中文文档

目录
相关文章
|
2天前
|
前端开发 JavaScript API
React团队回应用Vite替换Create React App的建议
React团队回应用Vite替换Create React App的建议
|
2天前
umi的函数
umi的函数
26 0
|
2天前
Vue3使用路由及配置vite.alias简化导入写法
Vue3使用路由及配置vite.alias简化导入写法
56 0
|
5月前
|
资源调度 JavaScript Java
使用vue-cli搭建SPA项目->spa项目的构建,基于spa项目路由完成,基于spa项目完成嵌套路由
使用vue-cli搭建SPA项目->spa项目的构建,基于spa项目路由完成,基于spa项目完成嵌套路由
27 0
|
5月前
|
JavaScript 小程序
VUE3(三十五)vite构建的项目配置使用.env文件
VUE3(三十五)vite构建的项目配置使用.env文件如标题所示:我要在vue3项目使用.env文件。 先介绍一下项目背景,项目使用VUE3.2 + vite2.9 + typescript搭建。 我基本断定,vue3使用.env文件的方法可能和vue2使用.env文件的方法可能是不同,关于vue2项目如何使用.env文件,请移步《VUE2(七)VUE配置env文件使用》
82 1
|
7月前
|
资源调度 JavaScript 前端开发
利用vue-cli构建SPA项目以及在SPA项目中使用路由
利用vue-cli构建SPA项目以及在SPA项目中使用路由
|
8月前
|
前端开发
React项目的打包步骤
React项目的打包步骤
263 0
|
9月前
|
资源调度 前端开发 JavaScript
ant-design-vue+vite主题切换详细步骤(简单案例)
ant-design-vue+vite主题切换详细步骤(简单案例)
630 0
|
11月前
dva和Umi中两个小用法
dva和Umi中两个小用法
144 0