最近没有学习新的前端东西了,想想redux都忘完了,干脆用dva算了.
dva是react全家桶集合版吧算是.研究了一下.搭建流程和使用都比redux简化很多.内置了router,redux等一堆.
安装脚手架
npm install dva-cli -g
新建项目
dva new project
dva的基本流程和redux一样,也是action触发reducers改变store的数据,不过流程简化很多.其中redurces和store都在model里面.
比较留心的是生成器函数:effect里面有put和call,select,,内部可以用yield 关键字,put如果调用同步的reducers是阻塞的.call执行异步任务,select是获取state.
实例代码:用户管理删除操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import dva from 'dva'; import './index.css';
const app = dva({ initialState: { demo_data: { userList: [ { name: 'dva', id: 1 }, { name: 'antd', id: 2 }, ] }, } });
app.model(require('./models/example').default);
app.router(require('./router').default);
app.start('#root');
|
model
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import request from "../utils/request";
export default {
namespace: 'demo_data',
state: { userList: [] },
subscriptions: { setup({ dispatch, history }) { }, },
effects: { *deleteUserAsync(action, { put, call }) { let t = ()=>request('https://www.baidu.com',{mode:'no-cors'}) let re = yield call(t); console.log(re) yield put({ type: 'deleteUser', payload: action.payload }); console.log('end')
} },
reducers: {
deleteUser(state, { payload: id }) { console.log('sync...') return { userList: (state.userList.filter(item => item.id !== id)) }; }, },
};
|
User组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import { Fragment } from "react"; import { connect } from 'dva'; import { Table, Popconfirm, Button } from 'antd'; const User = ({ dispatch,demo_data}) => { console.log(demo_data) const columns = [{ title: '用户名', dataIndex: 'name', }, { title: '操作', render: (text, record) => { return ( <Popconfirm title="Delete?" onConfirm={() => { dispatch({ type: 'demo_data/deleteUser', payload: record.id, }) }}> <Button>删除</Button> </Popconfirm> ); }, }, { title: '异步操作', render: (text, record) => { return ( <Popconfirm title="Delete?" onConfirm={() => { dispatch({ type: 'demo_data/deleteUserAsync', payload: record.id, }) }}> <Button>异步删除删除</Button> </Popconfirm> ); }, }]; return ( <Fragment> <Table dataSource={demo_data.userList} columns={columns} /> </Fragment> )
}
export default connect(({ demo_data }) => ({ demo_data }))(User);
|
router
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import React from 'react'; import { Router, Route, Switch } from 'dva/router'; import IndexPage from './routes/IndexPage'; import User from './components/User';
function RouterConfig({ history }) { return ( <Router history={history}> <Switch> <Route path="/" exact component={User} /> <Route path="/welcome" exact component={IndexPage} /> </Switch> </Router> ); }
export default RouterConfig;
|