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在线文件预览与项目集成
1240 1
|
分布式计算 Java Apache
快速体验Spark Connect
在Apache Spark 3.4中,引入了一个解耦的客户端-服务器架构的新模块Spark Connect,允许使用DataFrame API和未解析的逻辑计划作为协议远程连接到Spark集群。客户端
|
Python
Python玩转emoji表情 一行代码的事儿!
有时候在代码中加入一些有趣的操作可以使得友好度上升好几个Level
888 0
Python玩转emoji表情 一行代码的事儿!
|
小程序 前端开发
小程序启动参数相关问题
小程序启动参数相关问题
837 0
|
索引 Python
Python切片高级特性完全解读
众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组…)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象。
3523 1
|
5天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
2206 12

热门文章

最新文章

下一篇
开通oss服务