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

请查阅中文文档

目录
相关文章
|
JavaScript Java
kkFileView在线文件预览与项目集成
kkFileView在线文件预览与项目集成
1211 1
|
分布式计算 Java Apache
快速体验Spark Connect
在Apache Spark 3.4中,引入了一个解耦的客户端-服务器架构的新模块Spark Connect,允许使用DataFrame API和未解析的逻辑计划作为协议远程连接到Spark集群。客户端
|
Python
Python玩转emoji表情 一行代码的事儿!
有时候在代码中加入一些有趣的操作可以使得友好度上升好几个Level
881 0
Python玩转emoji表情 一行代码的事儿!
|
小程序 前端开发
小程序启动参数相关问题
小程序启动参数相关问题
807 0
|
索引 Python
Python切片高级特性完全解读
众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组…)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象。
3500 1
|
6天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
4253 17
|
16天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
11677 138
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw