一、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.jsmodule.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. Initializeconst app = dva();// 2. Plugins// app.use({});// 3. Model// app.model(require('./models/example').default);// 4. Routerapp.router(require('./router').default);// 5. Startapp.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-lineyield 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。但是使用的时候需加上namespaceeffects: {// saga插件使用generator函数*asyncList({payload},{call,put}){const result = yield call(getList);//call接受一个promise,等待结果返回//异步写成同步的感觉yield put({type: 'lsit',//因为在这个模块内,不用写namespacedata:{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 iyarn start 默认8000端口
新建页面 umi g page 页面名字即可自动在.umirc.js中添加路由信息
.umirc.js配置插件、路由表
不适合umi框架的情况:
- 需要支持 IE 8 或更低版本的浏览器
- 需要支持 React 16.8.0 以下的 React
- 需要跑在 Node 10 以下的环境中
- 有很强的 webpack 自定义需求和主观意愿
- 需要选择不同的路由方案
