import { IState } from './types';
import { effect, reducer, dvaModel, subscription, path, BaseModel } from 'dva-model-enhance';
import StoreState from '../StoreState';
import { SubscriptionAPI } from 'dva';
import { match } from 'react-router';
import { Dispatch } from 'redux';
import { Location, Action } from 'history';
export interface TestState extends IState {}
@dvaModel<TestState>({
namespace: 'test',
state: {
count: 0,
},
})
class Test extends BaseModel<TestState, StoreState> {
@effect()
*initCount() {
const result = yield this.effects.call(() => Promise.resolve(100));
yield this.effects.put(
this.setState({
count: result,
})
);
}
@reducer
addCount() {
return {
...this.state,
count: this.state.count + 1,
};
}
@subscription
subscriptionTest({ history, dispatch }: SubscriptionAPI) {
history.listen((location, action) => {
console.log('route change');
});
}
@path('/test/:id')
pathTest(
matchResult: match<{ id?: string }>,
dispatch: Dispatch,
location: Location,
action: Action
) {
console.log('route parameters', matchResult);
}
}
export default Test;
import { modelsContainer } from 'dva-model-enhance';
import Test from '../models/test';
const actions = {
test: new Test(),
};
modelsContainer.put(actions);
export default actions;
import React from 'react';
import dva, { DvaInstance } from 'dva';
import { getModel } from 'dva-model-enhance';
import './index.css';
import App from './App';
import Test from './models/test';
import * as H from 'history';
const app = dva({
namespacePrefixWarning: false,
});
app.model(getModel(Test));
app.router(router => {
if (!router) return {};
const { history, app }: { history: H.History; app: DvaInstance } = router;
return <App history={history} />;
});
app.start('#root');
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from './hooks';
import { Link, Router } from 'react-router-dom';
import * as H from 'history';
interface Props {
history: H.History;
}
const App: React.FC<Props> = ({ history }) => {
const count = useSelector(state => state.test.count);
const dispatch = useDispatch();
useEffect(() => {
dispatch.test.initCount();
return () => {};
}, []);
return (
<Router history={history}>
count: {count}
<button onClick={() => dispatch.test.addCount()}>add</button>
<Link to={'/test/121'}>
<button>change route</button>
</Link>
<Link to={'/test'}>
<button>test</button>
</Link>
</Router>
);
};
export default App;
import dva from 'dva';
import { setConfig } from 'dva-model-enhance';
const app = dva({
namespacePrefixWarning: false,
});
setConfig({
autoAddModel: true,
addModel: model => {
app.model(model);
},
});
import { useDispatch as useEnhanceDispatch } from 'dva-model-enhance';
import actions from '../actions';
const useDispatch = <T extends keyof typeof actions = keyof typeof actions>() => {
return useEnhanceDispatch<Pick<typeof actions, T>>(actions) as any;
};
export default useDispatch;