umi項目中使用 recoil
替換 dva
recoil
dva
因為之前做的一個項目不能使用dva進行狀态管理并替換成了recoil,本文對替換過程做一下記錄,介紹使用
recoil
庫來在
umi
項目中進行元件間的狀态共享,部分替換
dva
的功能。
本文使用的的umi版本為3.x。
禁用 dva
插件
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
:
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
recoil
請查閱
中文文檔