一、dva
dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。
6个api
1.步骤
1.全局安装
cnpm install dva-cli -g
dva -v (小写) —- dva-cli version 0.10.1
1.2新建项目
dva new your_project_name (nwe)
cd 项目 npm start
1.3目录结构
1.假数据mock
mock - 假数据的接口
//1 mock/m.js
module.pexports={
"GET /test/lsit":(req,res)=>{
res.json({
code: 200,
result: [1,2,3]
})
}
}
//2 .roadhorc.mock.js中引入
export default {
...require('./mock/m.js')
}
//3. 直接就可以使用`/test/lsit`这个接口
2.入口
src/index.js - 入口文件
import dva from 'dva';
import './index.css';
// 1. Initialize
const app = dva();
// 2. Plugins
// app.use({});
// 3. Model
// app.model(require('./models/example').default);
// 4. Router
app.router(require('./router').default);
// 5. Start
app.start('#root');
官网上是在index.js中初始化数据(redux的数据)
- const app = dva();
+ const app = dva({
+ initialState: {
+ products: [
+ { name: 'dva', id: 1 },
+ { name: 'antd', id: 2 },
+ ],
+ },
+ });
3.请求的封装
utils/request.js - 对fetch的封装
services/example.js - 具体的请求模块
4.页面与路由
routes文件夹中并不是路由,而是页面-样式可以使用引入的styles.xxx
而同级的router.js文件是路由表
import React from 'react';
import { Router, Route, Switch } from 'dva/router';
import IndexPage from './routes/IndexPage';
import Test from './routes/Test'
function RouterConfig({ history }) {
return (
<Router history={history}>
<Switch>
<Route path="/" exact component={IndexPage} />
<Route path="/test" component={Test} />
</Switch>
</Router>
);
}
export default RouterConfig;
5.redux
models: effects-异步、reducers-同步、subscriptions-订阅、state-数据、namespace-命名空间 — 结构上类似于vuex了
index.js中注册模块`app.model(require('./models/products').default);`
export default {
namespace: 'example',
state: {},
subscriptions: {// 监听-history是路由
setup({ dispatch, history }) { // eslint-disable-line
},
},
effects: {// 异步saga
*fetch({ payload }, { call, put }) { // eslint-disable-line
yield put({ type: 'save' });
},
},
reducers: {// 同步
save(state, action) {
// action = {type: "example/inc", payload: 2}
// {type: "example/inc", @@redux-saga/SAGA_ACTION: true}
return { ...state, ...action.payload };
},
}
};
6.组件中使用
import {connect} from 'dva'
//组件....
const mapStateToProps=(state)=>{return{
n: state.example.n
}}
// 默认没有配置装饰器语法
export default connect(mapStateToProps)('组件名')
// 所有方法默认挂载到props上,不用自己connect。但是使用的时候需加上namespace
effects: {
// saga插件使用generator函数
*asyncList({payload},{call,put}){
const result = yield call(getList);//call接受一个promise,等待结果返回
//异步写成同步的感觉
yield put({
type: 'lsit',//因为在这个模块内,不用写namespace
data:{lsit:res.data.data.list}
})
}
}
7.根目录下的.webpackrc配置proxy
二、umi
umijs antd、dva、内置路由 的深度整合
npm i yarn tyarn -g tyarn是yarn的国内源
npm i yarn umi -g
建个项目的目录
cd 项目目录
//官方工具创建项目,不允许选择配置项
yarn create @umijs/umi-app
// umi来创建 可以选择配置项
yarn create umi (目录就是项目名了)
//需要自己装依赖
cnpm i
yarn start 默认8000端口
新建页面 umi g page 页面名字
即可自动在.umirc.js
中添加路由信息
.umirc.js配置插件、路由表
不适合umi框架的情况:
- 需要支持 IE 8 或更低版本的浏览器
- 需要支持 React 16.8.0 以下的 React
- 需要跑在 Node 10 以下的环境中
- 有很强的 webpack 自定义需求和主观意愿
- 需要选择不同的路由方案