umi/dva中的model文件,怎么写,才能同时实现react函数组件用useModel()和reac类组件用connect联系在一起
时间: 2024-09-06 22:05:02 浏览: 71
umi-ts-app:umi3 + typescript + dva + react hooks快速构建管理系统
在 umi/dva 的开发中,`model` 文件用于定义状态(state)、订阅(subscribers)、动作(reducers)以及副作用(effects)。为了同时支持 React 函数组件使用 `useModel()` 和 React 类组件使用 `connect`,我们需要确保 `model` 中的状态和订阅是可访问的,并且动作(reducers)和副作用(effects)可以被触发。
下面是一个基本的 `model` 文件的写法示例:
```javascript
// model.js
import { types } from 'mobx-state-tree';
export default {
namespace: 'count',
state: {
number: 0,
},
reducers: {
add(state) {
return { ...state, number: state.number + 1 };
},
minus(state) {
return { ...state, number: state.number - 1 };
},
},
effects: {
*asyncAdd(action, { call, put }) {
yield call(delay, 1000);
yield put({ type: 'add' });
},
},
};
// count.js
import React, { useState, useEffect } from 'react';
import { useModel } from 'dva';
const Count = () => {
const [state, dispatch] = useModel(state => [state.count, { add: () => dispatch({ type: 'add' }) }]);
useEffect(() => {
// 如果需要,这里可以发起副作用操作
// 可以通过model中的effects来处理异步操作
}, []);
return (
<div>
<p>Count: {state.number}</p>
<button onClick={() => dispatch({ type: 'minus' })}>-</button>
</div>
);
};
// App.js
import React from 'react';
import { connect } from 'dva';
import Count from './components/Count';
const App = ({ count }) => {
return (
<div>
<Count />
</div>
);
};
const mapStateToProps = state => ({
count: state.count,
});
export default connect(mapStateToProps)(App);
```
在这个示例中,我们定义了一个包含 `namespace`、`state`、`reducers` 和 `effects` 的模型。在函数组件 `Count` 中,我们使用 `useModel` 钩子来获取状态和派发动作。在类组件 `App` 中,我们使用 `connect` 高阶组件来将状态映射到组件的 props 中。
阅读全文